useData()
vike-react/vike-vue/vike-solidYou need
vike-react/vike-vue/vike-solidto be able to useuseConfig(). If you don't usevike-{react,vue,solid}then see Withoutvike-{react,vue,solid}.
The useData() component hook allows you to access the value returned by the data() hook.
See Guides > Data Fetching for an introduction about
useData()and fetching data in general.
You can also access the data over
pageContext.data. In factconst { data } = usePageContext()returns the same value asuseData().Using
pageContext.datainstead ofuseData()makes sense if you want to access the data in Vike hooks sinceuseData()only works inside UI components (not inside Vike hooks).
For example:
// /pages/product/@id/SomeComponent.js
// Environment: server & client
import { useData } from 'vike-react/useData' // or vike-vue / vike-solid
/* ... */
// Inside any React/Vue/Solid component
const data = useData()
const { name, price } = data// /pages/product/@id/SomeComponent.ts
// Environment: server & client
import { useData } from 'vike-react/useData' // or vike-vue / vike-solid
import type { Data } from './+data'
/* ... */
// Inside any React/Vue/Solid component
const data = useData<Data>()
const { name, price } = data// /pages/product/@id/+data.js
// Environment: server
export { data }
async function data(pageContext) {
let product = await Product.findById(pagContext.routeParams.id)
// `product` is serialized and passed to the client. Therefore, we pick only the
// data the client needs in order to minimize what is sent over the network.
product = { name: product.name, price: product.price }
return product
}// /pages/product/@id/+data.ts
// Environment: server
export { data }
export type Data = Awaited<ReturnType<typeof data>>
import type { PageContextServer } from 'vike/types'
async function data(pageContext: PageContextServer) {
let product = await Product.findById(pagContext.routeParams.id)
// `product` is serialized and passed to the client. Therefore, we pick only the
// data the client needs in order to minimize what is sent over the network.
product = { name: product.name, price: product.price }
return product
}Using type inference as shown above is usually what you want, but if you want to enforce a type instead:
// +data.ts
export { data }
export type { Data }
import type { PageContextServer } from 'vike/types'
type Data = /* the type you want to enforce */
function data(pageContext: PageContextServer): Promise<Data> {
// ...
}Without vike-{react,vue,solid}
In case you don't use a UI framework Vike extension vike-react/vike-vue/vike-solid, you can implement useData() yourself.
In general, for improved DX, we recommend using a
useData()implementation. But you don't have to as shown at API >+data()hook > Withoutvike-{react,vue,solid}.
Examples:
- /packages/create-vike-core/boilerplate-react/renderer/useData.js (React + JavaScript)
- /packages/create-vike-core/boilerplate-react-ts/renderer/useData.ts (React + TypeScript)
- /packages/create-vike-core/boilerplate-vue/renderer/useData.js (Vue + JavaScript)
- /packages/create-vike-core/boilerplate-vue-ts/renderer/useData.ts (Vue + TypeScript)
vike-react> /hooks/useData.tsxvike-vue> /hooks/useData.tsvike-solid> /hooks/useData.tsx