Vue/Nuxt/Nuxt API/pages 相关API

发布于 2024-10-02 09:00:53 字数 12834 浏览 10 评论 0

asyncData 方法

在服务器端获取数据并渲染。 asyncData方法使得你能够 在渲染组件之前异步获取数据

asyncData 方法会在组件( 限于页面组件 )每次加载之前被调用。

它可以在 服务端路由 更新之前被调用。在这个方法被调用的时候,第一个参数被设定为当前页面的 上下文对象 ,你可以利用 asyncData 方法来获取数据并返回给当前组件。

<template>
  <div>
    <div>{{ content }}</div>
  </div>
</template>

<script>
  export default {
    asyncData() {
      return { content: 'Created at: ' + new Date() }
    },
  }
</script>

注意:由于 asyncData 方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。

fetch 方法

fetch 方法用于在渲染页面前 填充应用的状态树(store)数据 , 与 asyncData 方法类似,它会在组件每次加载前被调用(在服务端或切换至目标路由之前),所以也无法在内部使用 this 获取 组件实例 。不同的是它不会设置组件的数据。

fetch 方法的第一个参数是页面组件的 context ,为了让获取过程可以异步,你需要 返回一个 Promise ,Nuxt.js 会等这个 promise 完成后再渲染组件。

<template>
  <h1>Stars: {{ $store.state.stars }}</h1>
</template>

<script>
  export default {
    fetch({ store, params }) {
      return axios.get('http://my-api/stars').then(res => {
        store.commit('setStars', res.data)
      })
    }
  }
</script>
<template>
  <h1>Stars: {{ $store.state.stars }}</h1>
</template>

<script>
  export default {
    async fetch({ store, params }) {
      let { data } = await axios.get('http://my-api/stars')
      store.commit('setStars', data)
    }
  }
</script>

如果要在 fetch 中调用并操作 store ,请使用 store.dispatch ,但是要确保在内部使用 async / await 等待操作结束:

<script>
  export default {
    async fetch({ store, params }) {
      await store.dispatch('GET_STARS')
    }
  }
</script>

store/index.js

// ...
export const actions = {
  async GET_STARS({ commit }) {
    const { data } = await axios.get('http://my-api/stars')
    commit('SET_STARS', data)
  }
}

路由 query 字符串改变不触发 fetch 方法怎么办?

默认情况下,不会在查询字符串更改时调用 fetch 方法。如果想更改此行为,例如,在编写分页组件时,您可以设置通过页面组件的 watchQuery 属性来监听参数的变化。

validate 方法

在动态路由对应的页面组件中配置一个校验方法用于校验动态路由参数的有效性。校验参数无效返回 404 页面。

validate({ params, query }) {
  return true // 如果参数有效
  return false // 参数无效,Nuxt.js 停止渲染当前页面并显示错误页面
}

async validate({ params, query, store }) {
  // await operations
  return true // 如果参数有效
  return false // 将停止 Nuxt.js 呈现页面并显示错误页面
}

validate({ params, query, store }) {
  return new Promise((resolve) => setTimeout(() => resolve()))
}

Nuxt.js 可以让你在动态路由对应的页面组件(本例为: pages/users/_id.vue )中配置一个校验方法。

  • 如果校验方法返回的值不为 true , Nuxt.js 将自动加载显示 404 错误页面。
export default {
  validate({ params }) {
    // Must be a number
    return /^\d+$/.test(params.id)
  }
}
export default {
  validate({ params, store }) {
    // 校验 `params.id` 是否存在
    return store.state.categories.some(category => category.id === params.id)
  }
}

还可以在验证函数执行期间抛出预期或意外错误:

export default {
  async validate({ params, store }) {
    // 使用自定义消息触发内部服务器 500 错误
    throw new Error('Under Construction!')
  }
}

head 方法

  • 类型: ObjectFunction

使用 head 方法设置当前页面的头部标签,Nuxt 使用了 vue-meta 更新应用的 头部标签(Head)html 属性

head 方法里可通过 this 关键字来获取组件的数据。

<template>
  <h1>{{ title }}</h1>
</template>

<script>
  export default {
    data() {
      return {
        title: 'Hello World!'
      }
    },
    head() {
      return {
        title: this.title,
        meta: [
          {
            hid: 'description',
            name: 'description',
            content: 'My custom description'
          }
        ]
      }
    }
  }
</script>

注意:为了避免子组件中的 meta 标签不能正确覆盖父组件中相同的标签而产生重复的现象,建议利用 hid 键为 meta 标签配一个唯一的标识编号。请阅读 关于 vue-meta 的更多信息

key 属性

  • 类型: StringFunction

设置内部 <router-view> 组件的 key 属性。 key 属性赋值到 <router-view> ,这对于在动态页面和不同路径中进行转换很有用。不同的 key 会使页面组件重新渲染。

export default {
  key(route) {
    return route.fullPath
  }
}

结合 nuxt 组件 中的 nuxtChildKey 属性使用

layout 属性

  • 类型: StringFunction (默认值: 'default' )

layouts 根目录下的所有文件都属于个性化布局文件,可以在页面组件中利用 layout 属性来引用。

export default {
  layout: 'blog', // 使用 layout 属性来为页面指定使用哪一个布局文件, 值为文件名
  // 或
  layout(context) {
    return 'blog'
  }
}

在上面的例子中, Nuxt.js 会使用 layouts/blog.vue 作为当前页面组件的布局文件。

loading 属性

  • 类型: Boolean (默认: true )

指定页面上默认加载进度条的开启或关闭。默认情况下,Nuxt.js 使用自己的组件来显示路由跳转之间的进度条

您可以通过 Configuration 的加载选项 全局禁用或自定义它,但也可以通过将 loading 属性设置为 false 来禁用特定页面:

<template>
  <h1>My page</h1>
</template>

<script>
  export default {
    loading: false
  }
</script>

transition 属性

  • 类型: StringObjectFunction

Nuxt.js 使用 Vue.js 的 transition 组件来实现路由切换时的页面过渡动效。

如果想给某个页面自定义过渡特效的话,只要在该页面组件中配置 transition 字段即可:

export default {
  // 可以是字符
  transition: ''
  // 或对象
  transition: {}
  // 或函数
  transition (to, from) {}
}

string

如果 transition 属性的值类型是字符类型, 相当于设置了动效配置对象的 name 属性: transition.name

export default {
  transition: 'test'
}

Nuxt.js 将使用上面的配置来设置 Vue.js transition 组件,如下:

<transition name="test"></transition>

object

如果 transition 属性的值类型是对象类型:

export default {
  transition: {
    name: 'test',
    mode: 'out-in'
  }
}

Nuxt.js 将使用上面的配置来设置 Vue.js transition 组件,如下:

<transition name="test" mode="out-in"></transition>

transition 允许配置的字段介绍:

属性字段类型默认值描述
nameString"page"所有路由过渡都会用到的过渡名称。
modeString"out-in"所有路由都用到的过渡模式,见 Vue.js transition 使用文档
cssBooleantrue是否给页面组件根元素添加 CSS 过渡类名。如果值为 false ,路由过渡时将只会触发页面组件注册的 Javascript 钩子事件方法(不会设置 css 类名)。
durationIntegern/a在页面切换的持续时间(以毫秒为单位)详情请参考 Vue.js documentation
typeStringn/a指定过滤动效事件的类型,用于判断过渡结束的时间点。值可以是 "transition" 或 "animation"。 默认情况下, Nuxt.js 会自动侦测动效事件的类型。
enterClassStringn/a目标路由动效开始时的类名。 详情请参考 Vue.js transition 使用文档
enterToClassStringn/a目标路由动效结束时的类名。 详情请参考 Vue.js transition 使用文档
enterActiveClassStringn/a目标路由过渡过程中的类名。详情请参考 Vue.js transition 使用文档
leaveClassStringn/a当前路由动效开始时的类名。 详情请参考 Vue.js transition 使用文档
leaveToClassStringn/a当前路由动效结束时的类名。 详情请参考 Vue.js transition 使用文档
leaveActiveClassStringn/a当前路由动效过程中的类名。详情请参考 Vue.js transition 使用文档

你也可以在页面组件事件里面使用 Javascript 来控制过渡动效,可以称之为 JavaScript 钩子方法

  • beforeEnter(el)
  • enter(el, done)
  • afterEnter(el)
  • enterCancelled(el)
  • beforeLeave(el)
  • leave(el, done)
  • afterLeave(el)
  • leaveCancelled(el)

注意:如果使用纯 Javascript 控制路由过渡动效,建议将 transition 组件的 css 属性的值设置为 false 。这样可以避免 Vue 做 CSS 动效相关的侦测逻辑,同时防止 CSS 影响到过渡的动效。

Function

export default {
  transition(to, from) {
    if (!from) {
      return 'slide-left'
    }
    return +to.query.page < +from.query.page ? 'slide-right' : 'slide-left'
  }
}
  • / to /posts => slide-left
  • /posts to /posts?page=3 => slide-left
  • /posts?page=3 to /posts?page=2 => slide-right

middleware 属性

类型: StringArray<String>

为页面设置中间件 middleware

<!-- pages/secret.vue -->
<template>
  <h1>Secret page</h1>
</template>

<script>
  export default {
    middleware: 'authenticated'
  }
</script>
// middleware/authenticated.js
export default function ({ store, redirect }) {
  // 如果用户没有被授权
  if (!store.state.authenticated) {
    return redirect('/login')
  }
}

scrollToTop 属性

  • 类型: Boolean (默认值: false )

scrollToTop 属性用于 控制页面渲染前是否滚动至页面顶部

  • 默认情况下,从当前页面切换至目标页面时,Nuxt.js 会让目标页面滚动至顶部。
  • 但是在 嵌套子路由 的场景下,Nuxt.js 会保持当前页面的滚动位置,除非在子路由的页面组件中将 scrollToTop 设置为 true
<template>
  <h1>子页面组件</h1>
</template>

<script>
  export default {
    scrollToTop: true
  }
</script>

如果你想改变 Nuxt.js 上述的默认的页面滚动逻辑,请参考 scrollBehavior 配置项

watchQuery 属性

  • 类型: Boolean or Array (默认: [] )

监听参数字符串更改 并在更改时执行组件方法 ( asyncData , fetch , validate , layout , ...),为了提高性能,默认情况下禁用。

如果您要 为所有参数字符串设置监听 , 请设置: watchQuery: true .

export default {
  watchQuery: ['page']
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

云裳

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文