Loading...
Loading...
Compare original and translation side by side
+data+data+Page.vue+data.jsuseData()+guard.js+title+descriptionthrow render()throw redirect()clientOnly()+Page.vue+data.jsuseData()+guard.js+title+descriptionthrow render()throw redirect()clientOnly()+Page.vueuseData()+Page.vueuseData()export type Data = Awaited<ReturnType<typeof data>>throw render(404)export type Data = Awaited<ReturnType<typeof data>>throw render(404)<slot />+data<slot />+datathrow redirect('/login')throw render(401)throw redirect('/login')throw render(401)<!-- /pages/movies/+Page.vue -->
<script setup lang="ts">
import { useData } from 'vike-vue/useData'
import type { Data } from './+data'
const { movies } = useData<Data>()
</script>
<template>
<h1>Movies</h1>
<ul>
<li v-for="movie in movies" :key="movie.id">
{{ movie.title }}
</li>
</ul>
</template>// /pages/movies/+data.ts
export type Data = Awaited<ReturnType<typeof data>>
export async function data() {
const movies = await fetchMovies()
return { movies }
}<!-- /pages/movies/+Page.vue -->
<script setup lang="ts">
import { useData } from 'vike-vue/useData'
import type { Data } from './+data'
const { movies } = useData<Data>()
</script>
<template>
<h1>Movies</h1>
<ul>
<li v-for="movie in movies" :key="movie.id">
{{ movie.title }}
</li>
</ul>
</template>// /pages/movies/+data.ts
export type Data = Awaited<ReturnType<typeof data>>
export async function data() {
const movies = await fetchMovies()
return { movies }
}<!-- /pages/+Layout.vue -->
<script setup>
import Navigation from '../components/Navigation.vue'
</script>
<template>
<Navigation />
<main>
<slot />
</main>
</template><!-- /pages/+Layout.vue -->
<script setup>
import Navigation from '../components/Navigation.vue'
</script>
<template>
<Navigation />
<main>
<slot />
</main>
</template>// /pages/admin/+guard.ts
import { redirect } from 'vike/abort'
export async function guard(pageContext) {
if (!pageContext.user) {
throw redirect('/login')
}
if (!pageContext.user.isAdmin) {
throw render(403, 'Admin access required')
}
}// /pages/admin/+guard.ts
import { redirect } from 'vike/abort'
export async function guard(pageContext) {
if (!pageContext.user) {
throw redirect('/login')
}
if (!pageContext.user.isAdmin) {
throw render(403, 'Admin access required')
}
}| File | Purpose |
|---|---|
| Page component |
| Layout wrapper |
| Server-side data fetching |
| Route protection |
| Page/directory configuration |
| Page title |
| Custom head tags |
| 文件 | 用途 |
|---|---|
| 页面组件 |
| 布局容器 |
| 服务端数据获取 |
| 路由保护 |
| 页面/目录配置 |
| 页面标题设置 |
| 自定义页面头部标签 |
| Suffix | Runs On |
|---|---|
| Server only (default for +data) |
| Client only |
| Both server and client |
| 后缀 | 运行环境 |
|---|---|
| 仅服务端(+data默认使用) |
| 仅客户端 |
| 服务端与客户端均可运行 |
windowdocumentclientOnly()passToClient+data+datathrow<slot />clientOnly()windowdocumentpassToClient+data+dataredirect()render()<slot />| Excuse | Reality |
|---|---|
| "I'll add SEO later" | Missing titles hurt from day one |
| "Guards can return false" | Guards must |
| "I can access window in +data" | |
| "pageContext has everything" | Use |
| 借口 | 实际情况 |
|---|---|
| "我之后再添加SEO内容" | 缺失页面标题从上线第一天就会影响效果 |
| "路由守卫可以返回false" | 路由守卫必须抛出 |
| "我可以在+data中访问window" | |
| "pageContext包含所有内容" | 请使用 |
pages/
+config.ts # Applies to ALL pages
+Layout.vue # Global layout
(marketing)/
+Layout.vue # Nested inside global layout
about/+Page.vue # Has both layouts
admin/
+guard.ts # Applies to all admin pages
+config.ts # Admin-specific config
users/+Page.vue # Protected by guardpages/
+config.ts # 应用于所有页面
+Layout.vue # 全局布局
(marketing)/
+Layout.vue # 嵌套在全局布局内
about/+Page.vue # 同时应用两种布局
admin/
+guard.ts # 应用于所有admin页面
+config.ts # 管理员专属配置
users/+Page.vue # 受路由守卫保护pageContext.PagepageContext.datapageContext.configpageContext.routeParamspageContext.urlOriginalpageContext.urlPathnamepageContext.urlParseduser+config.tsexport default {
passToClient: ['user']
}pageContext.PagepageContext.datapageContext.configpageContext.routeParamspageContext.urlOriginalpageContext.urlPathnamepageContext.urlParseduser+config.tsexport default {
passToClient: ['user']
}Every Vike + Vue page must have:
1. +Page.vue component
2. +data.ts for server data (if needed)
3. useData() for type-safe data access
4. Error handling for edge cases
5. SEO tags for public pages每个Vike + Vue页面必须包含:
1. +Page.vue组件
2. 如需服务端数据,添加+data.ts
3. 使用useData()进行类型安全的数据访问
4. 针对边缘情况添加错误处理
5. 公开页面需配置SEO标签