From d21e6023df4daceae15385f7a97286b87c6e8e3c Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Oct 2026 06:59:13 +0000 Subject: [PATCH 1/2] docs(i18n): Update translations Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_017CVYgh4Z3FF6nevFuk5yQF --- website/i18n/es/code.json | 16 +- .../i18n/es/docs/core/api/AsyncBoundary.md | 3 + website/i18n/es/docs/core/api/Controller.md | 5 +- .../es/docs/core/api/DataClientPlugin.vue.md | 2 +- .../i18n/es/docs/core/api/DevToolsManager.md | 31 +++- website/i18n/es/docs/core/api/Manager.md | 5 +- .../es/docs/core/api/getDefaultManagers.md | 2 +- website/i18n/es/docs/core/api/useCache.md | 6 +- website/i18n/es/docs/core/api/useLoading.md | 35 +---- .../es/docs/core/concepts/error-policy.md | 2 +- .../es/docs/core/concepts/expiry-policy.md | 148 +++++++----------- .../i18n/es/docs/core/concepts/managers.md | 7 +- .../es/docs/core/concepts/normalization.md | 16 ++ .../i18n/es/docs/core/concepts/validation.md | 116 ++++++-------- .../core/getting-started/data-dependency.md | 108 +++---------- .../es/docs/core/getting-started/resource.md | 6 +- .../docs/core/shared/_StreamManagerDemo.mdx | 2 +- .../i18n/es/docs/core/shared/_useLoading.mdx | 64 ++------ website/i18n/es/docs/graphql/README.md | 2 +- .../es/docs/rest/api/_EndpointLifecycle.mdx | 5 + .../es/docs/rest/guides/mocking-unfinished.md | 2 +- .../es/docs/rest/guides/partial-entities.md | 109 +++++-------- .../es/docs/rest/guides/relational-data.md | 95 ++--------- .../docs/rest/shared/_optimisticTransform.mdx | 27 ++++ .../es/docusaurus-theme-classic/navbar.json | 8 - website/i18n/pt-BR/code.json | 16 +- .../i18n/pt-BR/docs/core/api/AsyncBoundary.md | 3 + .../i18n/pt-BR/docs/core/api/Controller.md | 5 +- .../docs/core/api/DataClientPlugin.vue.md | 2 +- .../pt-BR/docs/core/api/DevToolsManager.md | 31 +++- website/i18n/pt-BR/docs/core/api/Manager.md | 5 +- .../pt-BR/docs/core/api/getDefaultManagers.md | 2 +- website/i18n/pt-BR/docs/core/api/useCache.md | 6 +- .../i18n/pt-BR/docs/core/api/useLoading.md | 35 +---- .../pt-BR/docs/core/concepts/error-policy.md | 2 +- .../pt-BR/docs/core/concepts/expiry-policy.md | 148 +++++++----------- .../i18n/pt-BR/docs/core/concepts/managers.md | 7 +- .../pt-BR/docs/core/concepts/normalization.md | 16 ++ .../pt-BR/docs/core/concepts/validation.md | 116 ++++++-------- .../core/getting-started/data-dependency.md | 108 +++---------- .../docs/core/getting-started/resource.md | 6 +- .../docs/core/shared/_StreamManagerDemo.mdx | 2 +- .../pt-BR/docs/core/shared/_useLoading.mdx | 64 ++------ website/i18n/pt-BR/docs/graphql/README.md | 2 +- .../docs/rest/api/_EndpointLifecycle.mdx | 5 + .../docs/rest/guides/mocking-unfinished.md | 2 +- .../docs/rest/guides/partial-entities.md | 109 +++++-------- .../pt-BR/docs/rest/guides/relational-data.md | 95 ++--------- .../docs/rest/shared/_optimisticTransform.mdx | 27 ++++ .../docusaurus-theme-classic/navbar.json | 8 - website/i18n/zh-Hans/code.json | 16 +- .../zh-Hans/docs/core/api/AsyncBoundary.md | 3 + .../i18n/zh-Hans/docs/core/api/Controller.md | 5 +- .../docs/core/api/DataClientPlugin.vue.md | 2 +- .../zh-Hans/docs/core/api/DevToolsManager.md | 29 +++- website/i18n/zh-Hans/docs/core/api/Manager.md | 5 +- .../docs/core/api/getDefaultManagers.md | 2 +- .../i18n/zh-Hans/docs/core/api/useCache.md | 6 +- .../i18n/zh-Hans/docs/core/api/useLoading.md | 35 +---- .../docs/core/concepts/error-policy.md | 2 +- .../docs/core/concepts/expiry-policy.md | 148 +++++++----------- .../zh-Hans/docs/core/concepts/managers.md | 7 +- .../docs/core/concepts/normalization.md | 16 ++ .../zh-Hans/docs/core/concepts/validation.md | 116 ++++++-------- .../core/getting-started/data-dependency.md | 108 +++---------- .../docs/core/getting-started/resource.md | 6 +- .../docs/core/shared/_StreamManagerDemo.mdx | 2 +- .../zh-Hans/docs/core/shared/_useLoading.mdx | 64 ++------ website/i18n/zh-Hans/docs/graphql/README.md | 2 +- .../docs/rest/api/_EndpointLifecycle.mdx | 5 + .../docs/rest/guides/mocking-unfinished.md | 2 +- .../docs/rest/guides/partial-entities.md | 109 +++++-------- .../docs/rest/guides/relational-data.md | 95 ++--------- .../docs/rest/shared/_optimisticTransform.mdx | 27 ++++ .../docusaurus-theme-classic/navbar.json | 8 - website/translate/lock/es.json | 57 +++---- website/translate/lock/pt-BR.json | 57 +++---- website/translate/lock/zh-Hans.json | 59 +++---- 78 files changed, 1032 insertions(+), 1605 deletions(-) diff --git a/website/i18n/es/code.json b/website/i18n/es/code.json index 8b0c8a478376..8eb6d38f74d8 100644 --- a/website/i18n/es/code.json +++ b/website/i18n/es/code.json @@ -1,10 +1,10 @@ { "theme.Playground.liveEditor": { - "message": "Editor en vivo", + "message": "Editor", "description": "The live editor label of the live codeblocks" }, "theme.Playground.result": { - "message": "Resultado", + "message": "Vista previa en vivo", "description": "The result label of the live codeblocks" }, "theme.ErrorPageContent.title": { @@ -849,8 +849,7 @@ "message": "Código" }, "dataColocation.label": { - "message": "Árbol de componentes donde cada componente que renderiza datos los lee directamente del store con useSuspense(): User para CurrentUser y Avatar, Post para PostBody y Comment para CommentList. Un cambio vuelve a renderizar solo esos componentes y nada más del árbol", - "description": "Accessible label of the data co-location diagram on the Render Data page" + "message": "Árbol de componentes donde cada componente que renderiza datos los lee directamente del store con useSuspense(): User para CurrentUser y Avatar, Post para PostBody y Comment para CommentList. Un cambio vuelve a renderizar solo esos componentes y nada más del árbol" }, "collectionLists.label": { "message": "Tres listas guardadas en el store a partir de getTodos({ userId: 1 }), getTodos({ userId: 2 }) y getTodos(). Un todo con userId 1 creado por push o unshift entra en la lista de userId 1 y en la lista sin filtro, al final o al principio, y nunca en la lista de userId 2, porque una lista solo recibe un elemento cuando todos los argumentos con los que se obtuvo aparecen en la llamada. remove lo saca de esas mismas listas; move lo saca de la lista de userId 1 y lo mete en la de userId 2, y la lista sin filtro lo conserva", @@ -935,5 +934,14 @@ "optimisticRace.optimistic": { "message": "optimista", "description": "Under \"Other\" and \"Data Client\" in the race condition diagram: these rows show a counter with optimistic updates" + }, + "frameworkSelector.selectProtocol": { + "message": "Seleccionar protocolo" + }, + "playground.fixtures.error": { + "message": "error" + }, + "playground.fixtures.delay": { + "message": "retraso" } } diff --git a/website/i18n/es/docs/core/api/AsyncBoundary.md b/website/i18n/es/docs/core/api/AsyncBoundary.md index 435d845a5c42..6b579abbc065 100644 --- a/website/i18n/es/docs/core/api/AsyncBoundary.md +++ b/website/i18n/es/docs/core/api/AsyncBoundary.md @@ -109,6 +109,9 @@ export default function App() { Manejador de suscripción para restablecer el estado de error ante eventos como los cambios de ubicación de la URL. Es ideal para colocar un límite que envuelva los componentes de enrutamiento. +Cuando el contenido cambia por una prop, como el id del elemento seleccionado, y no por un evento de `listen`, añade `key={id}` a +la frontera para borrar el error del elemento anterior. + Un ejemplo con [Anansi Router](https://www.npmjs.com/package/@anansi/router), que usa la suscripción de [history](https://www.npmjs.com/package/history). diff --git a/website/i18n/es/docs/core/api/Controller.md b/website/i18n/es/docs/core/api/Controller.md index bfc981bc4aa4..e40388a27d55 100644 --- a/website/i18n/es/docs/core/api/Controller.md +++ b/website/i18n/es/docs/core/api/Controller.md @@ -31,7 +31,7 @@ de renderizado y de recuperación de datos. class Controller { /*************** Action Dispatchers ***************/ fetch(endpoint, ...args): ReturnType; - fetchIfStale(endpoint, ...args): ReturnType | undefined; + fetchIfStale(endpoint, ...args): ReturnType | Denormalize; expireAll({ testKey }): Promise; invalidate(endpoint, ...args): Promise; invalidateAll({ testKey }): Promise; @@ -265,7 +265,8 @@ post.pk(); ### fetchIfStale(endpoint, ...args) {#fetchIfStale} -Hace fetch solo si el endpoint se considera '[obsoleto](../concepts/expiry-policy.md#stale)'. +Hace fetch solo si el endpoint se considera '[obsoleto](../concepts/expiry-policy.md#stale)' o [inválido](../concepts/expiry-policy.md#invalid), +y devuelve la misma Promise que [fetch()](#fetch). En caso contrario, devuelve de forma síncrona los datos en caché, sin hacer fetch. Esto puede ser útil al precargar datos, ya que evita obtener de más datos que aún están actualizados. diff --git a/website/i18n/es/docs/core/api/DataClientPlugin.vue.md b/website/i18n/es/docs/core/api/DataClientPlugin.vue.md index 3120ac09096c..126ccf99c46d 100644 --- a/website/i18n/es/docs/core/api/DataClientPlugin.vue.md +++ b/website/i18n/es/docs/core/api/DataClientPlugin.vue.md @@ -56,7 +56,7 @@ import MyManager from './MyManager'; const app = createApp(App); app.use(DataClientPlugin, { - managers: [...getDefaultManagers(), new MyManager()], + managers: [new MyManager(), ...getDefaultManagers()], }); ``` diff --git a/website/i18n/es/docs/core/api/DevToolsManager.md b/website/i18n/es/docs/core/api/DevToolsManager.md index e7da6ffa6797..0bef62a51db6 100644 --- a/website/i18n/es/docs/core/api/DevToolsManager.md +++ b/website/i18n/es/docs/core/api/DevToolsManager.md @@ -90,8 +90,9 @@ const managers = getDefaultManagers({ ## Acceso programático al store {#controllers} En modo de desarrollo, `DevToolsManager` registra cada [Controller](/docs/api/Controller) en -`globalThis.__DC_CONTROLLERS__`, un `Map` cuya clave es el nombre de la conexión de devtools. Esto funciona -en navegadores, React Native y Node. +`globalThis.__DC_CONTROLLERS__`, un `Map` cuya clave es el nombre de la conexión de devtools. También registra las +acciones despachadas más recientes de cada uno en `globalThis.__DC_ACTIONS__`, bajo la misma clave. Esto funciona +en navegadores, React Native y Node, con o sin la extensión Redux DevTools. ```js title="Browser DevTools console" // List all registered providers @@ -102,14 +103,36 @@ __DC_CONTROLLERS__.values().next().value.getState(); // Get state by name __DC_CONTROLLERS__.get('Data Client: My App').getState(); + +// Last 10 actions, including the ones dispatched while the page loaded +__DC_ACTIONS__.get('Data Client: My App').slice(-10); ``` Esto es útil para que los asistentes de programación con IA que usan [Chrome DevTools MCP](https://developer.chrome.com/blog/chrome-devtools-mcp) o [Expo MCP](https://docs.expo.dev/eas/ai/mcp/) inspeccionen e interactúen programáticamente con el store. Cada :react[[DataProvider](/docs/api/DataProvider)]:vue[[DataClientPlugin](./DataClientPlugin.md) instalado] se registra de forma independiente, por lo que -se admiten sin problema varios :react[providers]:vue[apps] en la misma página. +se admiten varios :react[providers]:vue[apps] en la misma página. Cuando un nombre ya está en uso, el siguiente +se registra como `'Data Client: My App (2)'`, y así sucesivamente; define `name` para dar a cada uno una clave reconocible. Donde no hay `window`, como en +el renderizado en el servidor, un store reemplaza al anterior con el mismo nombre, ya que los stores por petición nunca se limpian. + +El registro de acciones conserva hasta el doble de [`maxAge`](https://github.com/reduxjs/redux-devtools/blob/main/extension/docs/API/Arguments.md#maxage) +acciones (100 por defecto) y omite los mismos fetches duplicados que omite la extensión. Para mantener bajo su uso de memoria, solo las +20 acciones más recientes conservan sus `args` y `response`; las más antiguas conservan `type`, `key`, `endpoint`, `meta` y las respuestas +de error. Mientras un endpoint hace [polling](/rest/api/RestEndpoint#pollfrequency), el registro conserva solo sus últimas +`maxPollingActions` acciones por cada clave (endpoint y args) (4 por defecto, los dos últimos sondeos), para que el polling no desplace todo lo demás: + + + +```ts +const managers = getDefaultManagers({ + // highlight-next-line + devToolsManager: { maxPollingActions: 10 }, +}); +``` + + -Los controllers se eliminan del mapa cuando se llama a `cleanup()`. +Los controllers y sus registros se eliminan cuando se llama a `cleanup()`. Nada de esto existe en las compilaciones de producción. ## Más información {#more-info} diff --git a/website/i18n/es/docs/core/api/Manager.md b/website/i18n/es/docs/core/api/Manager.md index 538c35269b0d..1048a13a7cda 100644 --- a/website/i18n/es/docs/core/api/Manager.md +++ b/website/i18n/es/docs/core/api/Manager.md @@ -99,11 +99,14 @@ instala una sola vez por aplicación, así que los managers se crean una sola ve import MyManager from './MyManager'; // highlight-next-line -const managers = [...getDefaultManagers(), new MyManager()]; +const managers = [new MyManager(), ...getDefaultManagers()]; ``` +Las acciones pasan por los managers en el orden del array. Coloca tus managers personalizados antes de los predeterminados: [NetworkManager](./NetworkManager.md) +resuelve él mismo la mayoría de las acciones FETCH en lugar de pasarlas al siguiente. + ## Flujo de control {#control-flow} Los managers se integran con el store de :react[DataProvider]:vue[DataClientPlugin] mediante sus ciclos de vida y su middleware. Orquestan flujos de control diff --git a/website/i18n/es/docs/core/api/getDefaultManagers.md b/website/i18n/es/docs/core/api/getDefaultManagers.md index 5408e13137a3..c9a9d54fb965 100644 --- a/website/i18n/es/docs/core/api/getDefaultManagers.md +++ b/website/i18n/es/docs/core/api/getDefaultManagers.md @@ -106,7 +106,7 @@ const managers = getDefaultManagers({ ``` `IdlingNetworkManager` puede evitar los tirones retrasando los fetch sin [sideEffect](/rest/api/Endpoint#sideeffect) (de solo lectura/GET) -hasta que terminen las animaciones. Funciona en la web mediante [requestIdleCallback](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback), y en React Native mediante InteractionManager.runAfterInteractions. +hasta que terminen las animaciones. Funciona en la web mediante [requestIdleCallback](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback), y en React Native mediante InteractionManager.runAfterInteractions (o requestIdleCallback desde React Native 0.87, que eliminó InteractionManager). ::: diff --git a/website/i18n/es/docs/core/api/useCache.md b/website/i18n/es/docs/core/api/useCache.md index 3610e278829b..6224f15fa69f 100644 --- a/website/i18n/es/docs/core/api/useCache.md +++ b/website/i18n/es/docs/core/api/useCache.md @@ -16,8 +16,10 @@ import { RestEndpoint } from '@data-client/rest'; Renderizado de datos sin el fetch. -Accede a la respuesta de cualquier [Endpoint](/rest/api/Endpoint). Si la respuesta no existe, devuelve -`undefined`. Esto puede usarse para comprobar la existencia de un `Endpoint's`, por ejemplo para la autenticación. +Accede a la respuesta de cualquier [Endpoint](/rest/api/Endpoint). Devuelve `undefined` hasta que se obtiene, se establece o +se puede inferir a partir de las entities que ya están en el store, y de nuevo tras una invalidación (consulta [Comportamiento](#behavior)). +Eso significa "no cargado", no "no existe en el servidor", así que úsalo para datos que carga otro código, como +el usuario actual que obtiene un flujo de inicio de sesión. `useCache()` reacciona a las [mutaciones](../getting-started/mutations.md) de los datos y vuelve a renderizar solo cuando es necesario. diff --git a/website/i18n/es/docs/core/api/useLoading.md b/website/i18n/es/docs/core/api/useLoading.md index dc89475a3d6d..e7419b307eb0 100644 --- a/website/i18n/es/docs/core/api/useLoading.md +++ b/website/i18n/es/docs/core/api/useLoading.md @@ -61,13 +61,13 @@ export const PostResource = resource({ }); ``` -```html title="PostDetail.vue" collapsed +```html title="PostDetail.vue" route="/posts/:id" collapsed - - -``` - Devuelve la función envuelta junto con los [refs](https://vuejs.org/api/reactivity-core.html#ref) `loading` y `error`. @@ -206,7 +185,7 @@ de la regla [react-hooks/exhaustive-deps](https://www.npmjs.com/package/eslint-p ```typescript export default function useLoading< F extends (...args: any) => Promise, ->(func: F, deps: readonly any[] = []): [F, boolean]; +>(func: F, deps: readonly any[] = []): [F, boolean, Error | undefined]; ``` ::: diff --git a/website/i18n/es/docs/core/concepts/error-policy.md b/website/i18n/es/docs/core/concepts/error-policy.md index 14e550ffc295..985f9890a739 100644 --- a/website/i18n/es/docs/core/concepts/error-policy.md +++ b/website/i18n/es/docs/core/concepts/error-policy.md @@ -40,7 +40,7 @@ Un error soft sigue mostrando los últimos datos. Los errores hard (y los soft s - @@ -123,41 +123,28 @@ export default function TimePage({ id }) { } ``` -```tsx title="Navigator" collapsed -import React from 'react'; -import { AsyncBoundary } from '@data-client/react'; -import TimePage from './TimePage'; - -function Navigator() { - const [id, setId] = React.useState('1'); - const handleChange = e => setId(e.currentTarget.value); +```tsx title="Navigator" layout collapsed +export default function Navigator({ children }) { return (
-
- - -
- loading...
}> - - + + {children}
Current Time:
); } -render(); ``` ::: :::vue -```html title="TimePage.vue" +```html title="TimePage.vue" route="/time/:id" start="/time/1" - +```html title="Navigator.vue" layout collapsed ``` @@ -255,10 +241,10 @@ const NoRetryResource = resource({ [Endpoint.invalidIfStale](/rest/api/Endpoint#invalidifstale) elimina el estado '[stale](#stale)', de modo que los datos que caducan se consideran '[invalid](#invalid)' de inmediato. -Esto se demuestra porque el componente se suspende en cuanto sus datos pasan a stale. Si los datos aún -están dentro del tiempo de caducidad, simplemente sigue mostrándolos. +Esto se demuestra porque la página se suspende en cuanto sus datos pasan a stale:react[ (la navegación espera en la barra de progreso)]. +Si los datos aún están dentro del tiempo de caducidad, simplemente sigue mostrándolos. - @@ -322,41 +308,28 @@ export default function TimePage({ id }) { } ``` -```tsx title="Navigator" collapsed -import React from 'react'; -import { AsyncBoundary } from '@data-client/react'; -import TimePage from './TimePage'; - -function Navigator() { - const [id, setId] = React.useState('1'); - const handleChange = e => setId(e.currentTarget.value); +```tsx title="Navigator" layout collapsed +export default function Navigator({ children }) { return (
-
- - -
- loading...
}> - - + + {children}
Current Time:
); } -render(); ``` ::: :::vue -```html title="TimePage.vue" +```html title="TimePage.vue" route="/time/:id" start="/time/1" - +```html title="Navigator.vue" layout collapsed ``` @@ -409,7 +381,7 @@ A veces queremos obtener datos nuevos mientras seguimos mostrando los datos anti [Controller.fetch](../api/Controller#fetch) se puede usar para desencadenar un fetch mientras se siguen mostrando los datos anteriores. Esto se puede hacer incluso con datos 'fresh'. -); [Controller.expireAll()](../api/Controller.md#expireAll) establece en [Stale](#stale) el [estado de caducidad](#expiry-status) de todas las respuestas que coincidan con `testKey`. -); Usar el [schema Invalidate](/rest/api/Invalidate) nos permite invalidar _cualquier_ endpoint que dependa de esa [entity](/rest/api/Entity) en su respuesta. Si el endpoint usa la entity dentro de un [Array](/rest/api/Array), simplemente se eliminará de ese [Array](/rest/api/Array). - @@ -12,11 +13,26 @@ import TabItem from '@theme/TabItem'; import LanguageTabs from '@site/src/components/LanguageTabs'; import Link from '@docusaurus/Link'; import SchemaTable from '../shared/\_schema_table.mdx'; +import PosterVideo from '@site/src/components/PosterVideo'; +import useBaseUrl from '@docusaurus/useBaseUrl'; Las [Entities](/rest/api/Entity) tienen una clave primaria. Esto permite un acceso sencillo mediante una tabla de búsqueda. Así resulta fácil encontrar, actualizar, crear o eliminar los mismos datos, sin importar en qué endpoint se hayan usado. + + + + + - - - - + + + + + + + + ``` @@ -255,10 +241,10 @@ const NoRetryResource = resource({ [Endpoint.invalidIfStale](/rest/api/Endpoint#invalidifstale) elimina o status '[stale](#stale)', fazendo com que dados que expiram sejam imediatamente considerados '[invalid](#invalid)'. -Isso é demonstrado pelo componente que suspende assim que seus dados ficam stale. Se os dados ainda estiverem -dentro do tempo de expiração, ele simplesmente continua a exibi-los. +Isso é demonstrado pela página que suspende assim que seus dados ficam stale:react[ (a navegação aguarda a barra de progresso)]. +Se os dados ainda estiverem dentro do tempo de expiração, ela simplesmente continua a exibi-los. - @@ -322,41 +308,28 @@ export default function TimePage({ id }) { } ``` -```tsx title="Navigator" collapsed -import React from 'react'; -import { AsyncBoundary } from '@data-client/react'; -import TimePage from './TimePage'; - -function Navigator() { - const [id, setId] = React.useState('1'); - const handleChange = e => setId(e.currentTarget.value); +```tsx title="Navigator" layout collapsed +export default function Navigator({ children }) { return (
-
- - -
- loading...
}> - - + + {children}
Current Time:
); } -render(); ``` ::: :::vue -```html title="TimePage.vue" +```html title="TimePage.vue" route="/time/:id" start="/time/1" - +```html title="Navigator.vue" layout collapsed ``` @@ -409,7 +381,7 @@ render(); [Controller.fetch](../api/Controller#fetch) pode ser usado para disparar um fetch enquanto ainda se mostram os dados anteriores. Isso pode ser feito mesmo com dados 'fresh'. -); [Controller.expireAll()](../api/Controller.md#expireAll) define o [status de expiração](#expiry-status) de todas as respostas que correspondem a `testKey` como [Stale](#stale). -); Usar o [schema Invalidate](/rest/api/Invalidate) nos permite invalidar _qualquer_ endpoint que dependa dessa [entity](/rest/api/Entity) em sua resposta. Se o endpoint usa a entity em um [Array](/rest/api/Array), ela simplesmente será removida desse [Array](/rest/api/Array). - @@ -12,11 +13,26 @@ import TabItem from '@theme/TabItem'; import LanguageTabs from '@site/src/components/LanguageTabs'; import Link from '@docusaurus/Link'; import SchemaTable from '../shared/\_schema_table.mdx'; +import PosterVideo from '@site/src/components/PosterVideo'; +import useBaseUrl from '@docusaurus/useBaseUrl'; [Entities](/rest/api/Entity) têm uma chave primária. Isso permite acesso fácil por meio de uma tabela de consulta. Assim, é simples encontrar, atualizar, criar ou excluir os mesmos dados, não importa em qual endpoint eles foram usados. + + + + + - - - - + + + + + + + + ``` @@ -255,10 +241,10 @@ const NoRetryResource = resource({ [Endpoint.invalidIfStale](/rest/api/Endpoint#invalidifstale) 去掉了“[过时](#stale)”状态,使得 过期的数据立即被视为“[无效](#invalid)”。 -在演示中,组件的数据一旦过时,组件就会挂起。如果数据仍在 -过期时间之内,组件就会继续展示它。 +在演示中,页面的数据一旦过时,页面就会挂起:react[(导航会在进度条上等待)]。 +如果数据仍在过期时间之内,就会继续展示它。 - @@ -322,41 +308,28 @@ export default function TimePage({ id }) { } ``` -```tsx title="Navigator" collapsed -import React from 'react'; -import { AsyncBoundary } from '@data-client/react'; -import TimePage from './TimePage'; - -function Navigator() { - const [id, setId] = React.useState('1'); - const handleChange = e => setId(e.currentTarget.value); +```tsx title="Navigator" layout collapsed +export default function Navigator({ children }) { return (
-
- - -
- loading...
}> - - + + {children}
Current Time:
); } -render(); ``` ::: :::vue -```html title="TimePage.vue" +```html title="TimePage.vue" route="/time/:id" start="/time/1" - +```html title="Navigator.vue" layout collapsed ``` @@ -409,7 +381,7 @@ render(); [Controller.fetch](../api/Controller#fetch) 可以用来触发获取,同时仍展示 之前的数据。即使数据是“新鲜”的,也可以这样做。 -); [Controller.expireAll()](../api/Controller.md#expireAll) 会把所有与 `testKey` 匹配的响应的[过期状态](#expiry-status)设置为[过时](#stale)。 -); 在这个示例中,[使 endpoint 失效](../api/Controller.md#invalidate):react[会显示加载 fallback,因为此时数据不允许展示]:vue[会重新获取它,即使其数据仍然新鲜]。 -); 使用 [Invalidate schema](/rest/api/Invalidate),我们可以让响应中依赖该 [Entity](/rest/api/Entity) 的_任意_ endpoint 失效。如果 endpoint 在 [Array](/rest/api/Array) 中使用了该 Entity,它只会被从该 [Array](/rest/api/Array) 中移除。 - @@ -12,10 +13,25 @@ import TabItem from '@theme/TabItem'; import LanguageTabs from '@site/src/components/LanguageTabs'; import Link from '@docusaurus/Link'; import SchemaTable from '../shared/\_schema_table.mdx'; +import PosterVideo from '@site/src/components/PosterVideo'; +import useBaseUrl from '@docusaurus/useBaseUrl'; [Entity](/rest/api/Entity) 拥有主键,因此可以通过查找表轻松访问。 这样一来,无论同一份数据出现在哪个 endpoint 中,你都能方便地查找、更新、创建或删除它。 + + + + +