在 asyncData 中访问上下文
我们可以从 Nuxt
上下文中访问大量有用的东西来获取数据。它们作为以下键存储在 context
对象中:
|
|
|
它们是额外提供的,并且仅在 Nuxt
中可用,因此我们在 Vue
中找不到它们。我们可以使用 context.<key>
或 { <key> }
来访问它们。因此,让我们在接下来的章节中探讨其中的一些键,看看如何利用它们。
有关 |
访问 req/res 对象
当 asyncData
方法在服务器端执行时,我们可以访问 req
和 res
对象。它们包含来自用户的 HTTP
请求的有用信息。但是,在访问它们之前,我们应该始终使用 if
条件进行检查:
// pages/index.vue
<p>{{ host }}</p>
<script>
export default {
asyncData ({ req, res }) {
if (process.server) {
return { host: req.headers.host }
}
return { host: '' }
}
}
</script>
在上面的代码中,我们使用 if
条件来确保在获取请求头信息之前,asyncData
方法是在服务器端调用的。这两个对象在客户端是不可用的,因此在客户端访问它们时,你会得到 undefined
。因此,当首次在浏览器中加载页面时,我们从上面的代码中得到的结果将是 localhost:3000
,但是当你通过 <nuxt-link>
组件生成的路由重新访问此页面时,除非你刷新该页面,否则你将不会再次看到该信息。
访问动态路由数据
当我们的应用程序中存在动态路由时,我们可以通过 params
键访问动态路由数据。例如,如果我们在 /pages/
目录下有一个 _id.vue
文件,那么我们可以通过 context.params.id
访问路由参数的值,如下所示:
// pages/users/_id.vue
<p>{{ id }}</p>
<script>
export default {
asyncData ({ params }) {
return { id: params.id }
}
}
</script>
在上面的代码中,当你在浏览器中访问 users/1
时,你将得到 1
作为 id
的值。
监听查询变化
默认情况下,asyncData
方法不会在查询字符串发生变化时执行。例如,如果你在你的路由中使用类似 /users?id=<id>
这样的查询,并通过 <nuxt-link>
组件进行导航,那么当你通过 <nuxt-link>
组件的路由从一个查询切换到另一个查询时,asyncData
不会被调用。这是因为为了提高性能,Nuxt
默认禁用了对查询变化的监听。如果你想覆盖这个默认行为,你可以使用 watchQuery
属性来监听特定的参数:
// pages/users/index.vue
<p>{{ id }}</p>
<ul>
<li><nuxt-link :to="'users?id=1'">1</nuxt-link>
<nuxt-link :to="'users?id=2'">2</nuxt-link></li>
</ul>
<script>
export default {
asyncData ({ query }) {
return { id: query.id }
},
watchQuery: ['id']
}
</script>
在上面的代码中,我们监听了 id
参数,因此当你导航到 /users?id=1
时你会得到 1
,而导航到 /users?id=2
时你会得到 2
。如果你想为所有查询字符串设置监听器,只需将 watchQuery
设置为 true
即可。
处理错误
我们可以使用上下文对象中的 error
方法来调用 Nuxt
的默认错误页面并显示错误。你可以通过默认的 params.statusCode
和 params.message
属性传递错误代码和消息:
// pages/users/error.vue
export default {
asyncData ({ error }) {
return error({
statusCode: 404,
message: 'User not found'
})
}
}
如果你想更改传递给 error
方法的默认属性,你可以创建一个自定义错误页面,这在第四章 “添加视图、路由和过渡” 中已经学过。让我们通过以下步骤创建这些自定义错误属性和布局:
-
创建一个你想将自定义属性传递给的页面:
// pages/users/error-custom.vue export default { asyncData ({ error }) { return error({ status: 404, text: 'User not found' }) } }
-
在
/layouts/
目录下创建一个自定义错误页面:// layouts/error.vue <template> <div> <h1>Custom Error Page</h1> <h2>{{ error.status }} Error</h2> <p>{{ error.text }}</p> <nuxt-link to="/">Home page</nuxt-link> </div> </template> <script> export default { props: ['error'], layout: 'layout-error' } </script>
-
为这个错误页面创建一个自定义布局页面:
// layouts/layout-error.vue <template> <nuxt /> </template>
访问 /users/error-custom
时,你应该会看到自定义属性和布局。
你可以在我们的 |
接下来,我们将在下一节中了解如何在 asyncData
方法中使用 HTTP
客户端 Axios
来请求 API
数据。