From dde6c2a8911c912ba00cc8c68b4a71f06fdd2831 Mon Sep 17 00:00:00 2001 From: gehbert Date: Sun, 22 Oct 2023 14:59:34 +0800 Subject: [PATCH] fix: fix some md-links and bad brackets --- langs/en/api/api.md | 16 +++++++++------- langs/es/api/api.md | 2 +- langs/fr/api/api.md | 2 +- langs/ja/api/api.md | 22 +++++++++++----------- langs/ko-kr/api/api.md | 22 +++++++++++----------- langs/ru/api/api.md | 2 +- langs/zh-cn/api/api.md | 18 +++++++++--------- 7 files changed, 43 insertions(+), 41 deletions(-) diff --git a/langs/en/api/api.md b/langs/en/api/api.md index b4ef6e7d..5a8c3021 100644 --- a/langs/en/api/api.md +++ b/langs/en/api/api.md @@ -400,9 +400,9 @@ It will be called again whenever the value of `sourceSignal` changes, and that v You can call `mutate` to directly update the `data` signal (it works like any other signal setter). You can also call `refetch` to rerun the fetcher directly, and pass an optional argument to provide additional info to the fetcher: `refetch(info)`. `data` works like a normal signal getter: use `data()` to read the last returned value of `fetchData`. -But it also has extra reactive properties: `data.loading` tells you if the fetcher has been called but not returned, and `data.error` tells you if the request has errored out; if so, it contains the error thrown by the fetcher. (Note: if you anticipate errors, you may want to wrap `createResource` in an [ErrorBoundary](#).) +But it also has extra reactive properties: `data.loading` tells you if the fetcher has been called but not returned, and `data.error` tells you if the request has errored out; if so, it contains the error thrown by the fetcher. (Note: if you anticipate errors, you may want to wrap `createResource` in an [ErrorBoundary](#errorboundary).) -As of **1.4.0**, `data.latest` will return the last returned value and won't trigger [Suspense](#) and [transitions](#usetransition); if no value has been returned yet, `data.latest` acts the same as `data()`. This can be useful if you want to show the out-of-date data while the new data is loading. +As of **1.4.0**, `data.latest` will return the last returned value and won't trigger [Suspense](#suspense) and [transitions](#usetransition); if no value has been returned yet, `data.latest` acts the same as `data()`. This can be useful if you want to show the out-of-date data while the new data is loading. `loading`, `error`, and `latest` are reactive getters and can be tracked. @@ -572,9 +572,10 @@ createEffect(on(a, (v) => console.log(v), { defer: true })); setA("new"); // now it runs ``` -Please note that on `stores` and `mutable`, adding or removing a property from the parent object will trigger an effect. See [`createMutable`](#createMutable) +Please note that on `stores` and `mutable`, adding or removing a property from the parent object will trigger an effect. See [`createMutable`](#createmutable) ## `catchError` + **New in v1.7.0** ```ts @@ -586,6 +587,7 @@ function catchError(tryFn: () => T, onError: (err: any) => void): T; Wraps a `tryFn` with an error handler that fires if an error occurs below that point. Only the nearest scope error handlers execute. Rethrow to trigger up the line. ## `onError` + **Deprecated for catchError in v1.7** ```ts @@ -1314,13 +1316,13 @@ provides two alternate ways to do similar things: modifyMutable(state.user, reconcile({ firstName: "Jake", lastName: "Johnson", -}); +})); // Modify two fields in batch, triggering just one update modifyMutable(state.user, produce((u) => { u.firstName = "Jake"; u.lastName = "Johnson"; -}); +})); ``` # Component APIs @@ -1629,8 +1631,8 @@ Before using it, consider the closely related primitives [`createMemo`](#creatememo) and [`createRenderEffect`](#createrendereffect). Like `createMemo`, `createComputed` calls its function immediately on updates -(unless you're in a [batch](#batch), [effect](#createEffect), or -[transition](#use-transition)). +(unless you're in a [batch](#batch), [effect](#createeffect), or +[transition](#usetransition)). However, while `createMemo` functions should be pure (not set any signals), `createComputed` functions can set signals. Related, `createMemo` offers a readonly signal for the return value of the diff --git a/langs/es/api/api.md b/langs/es/api/api.md index dbeb4dbb..741514c1 100644 --- a/langs/es/api/api.md +++ b/langs/es/api/api.md @@ -156,7 +156,7 @@ En el segundo, se llamará a `fetchData` tan pronto como `sourceSignal` tenga cu De cualquier manera, puede llamar a `mutate` para actualizar directamente la signal `data` (funciona como cualquier otro emisor de signals). También puede llamar a `refetch` para volver a ejecutar el buscador directamente y pasar un argumento opcional para proporcionar información adicional al buscador: `refetch(info)`. `data` funciona como un receptor de señal normal: usa `data()` para leer el último valor devuelto de `fetchData`. -Pero también tiene dos propiedades extra: `data.loading` te dice si el buscador ha sido llamado pero no devuelto, y `data.error` te dice si la solicitud ha fallado; si es así, contiene el error arrojado por el buscador. (Nota: si prevé errores, es posible que desee incluir `createResource` en un [ErrorBoundary](#).) +Pero también tiene dos propiedades extra: `data.loading` te dice si el buscador ha sido llamado pero no devuelto, y `data.error` te dice si la solicitud ha fallado; si es así, contiene el error arrojado por el buscador. (Nota: si prevé errores, es posible que desee incluir `createResource` en un [ErrorBoundary](#errorboundary).) `loading` y `error` son getters reactivos y pueden recibir seguimiento. diff --git a/langs/fr/api/api.md b/langs/fr/api/api.md index b00d31bf..48be6b13 100644 --- a/langs/fr/api/api.md +++ b/langs/fr/api/api.md @@ -578,7 +578,7 @@ onCleanup(() => unsubscribe()); export function createMutable( state: T | Store, options?: { name?: string } -): Store { +): Store; ``` Créer un nouvel objet Store mutable. Les stores se mettent à jour seulement quand les valeurs changent. Le traçage est fait par l'interception de l'accès de propriété et automatiquement tracé dans des imbrications profondes en utilisant un proxy. diff --git a/langs/ja/api/api.md b/langs/ja/api/api.md index 0be34dc6..2a35509d 100644 --- a/langs/ja/api/api.md +++ b/langs/ja/api/api.md @@ -12,7 +12,7 @@ Solid の JSX コンパイラーは、ほとんどの JSX 式(中括弧内の その結果、通常は依存関係のことを気にする必要はありません。 -(しかし、自動的な依存関係追跡が目的の結果をもたらさない場合は、[依存関係追跡をオーバーライド](#reactive-utilities)できます) +(しかし、自動的な依存関係追跡が目的の結果をもたらさない場合は、[依存関係追跡をオーバーライド](#リアクティブのユーティリティ)できます) このアプローチにより、リアクティビティがコンポーザブルになります。ある関数を別の関数内で呼び出すと、一般に呼び出した関数は呼び出された関数の依存関係を継承することになります。 @@ -95,7 +95,7 @@ const newCount = setCount((prev) => prev + 1); > const [func, setFunc] = createSignal(myFunction); > ``` -[バッチ](#batch)、[Effect](#createEffect)、[トランジション](#use-transition)の中でなければ、Signal は設定するとすぐに更新されます。 +[バッチ](#batch)、[Effect](#createeffect)、[トランジション](#usetransition)の中でなければ、Signal は設定するとすぐに更新されます。 例えば: @@ -214,7 +214,7 @@ Effect 関数の最初の実行は即時ではありません。現在のレン -この最初の実行の後、通常、Effect は依存関係が更新されるとすぐに実行されます([batch](#batch) や [transition](#use-transition) をしている場合を除く)。例えば: +この最初の実行の後、通常、Effect は依存関係が更新されるとすぐに実行されます([batch](#batch) や [transition](#usetransition) をしている場合を除く)。例えば: @@ -415,9 +415,9 @@ const [data, { mutate, refetch }] = createResource(sourceSignal, fetchData); `mutate` を呼び出すことで、`data` Signal を直接更新できます(他の Signal セッターと同じように動作します)。また、`refetch` を呼び出すことでフェッチャーを直接再実行でき、`refetch(info)` のように追加の引数を渡すことで、フェッチャーに追加情報を提供できます。 `data` は通常の Signal のゲッターのように動作します。 `fetchData` の最後の戻り値を読み取るには `data()` を使用します。 -しかし、これには追加のリアクティブなプロパティがあり、`data.loading` はフェッチャーが呼び出されたが返されていないかどうかを示します。そして、`data.error` はリクエストがエラーになったかどうかを示します(注意: もしエラーが予想される場合は `createResource` を [ErrorBoundary](#)でラップするとよいでしょう)。 +しかし、これには追加のリアクティブなプロパティがあり、`data.loading` はフェッチャーが呼び出されたが返されていないかどうかを示します。そして、`data.error` はリクエストがエラーになったかどうかを示します(注意: もしエラーが予想される場合は `createResource` を [ErrorBoundary](#errorboundary)でラップするとよいでしょう)。 -**1.4.0** では、`data.latest` は最後に返された値を返し、[Suspension](#) や [transitions](#usetransition) をトリガーしません。まだ値が返されていない場合は `data()` と同じ動作をします。これは、新しいデータを読み込んでいる間、古くなったデータを表示させたい場合に便利です。 +**1.4.0** では、`data.latest` は最後に返された値を返し、[Suspension](#suspense) や [transitions](#usetransition) をトリガーしません。まだ値が返されていない場合は `data()` と同じ動作をします。これは、新しいデータを読み込んでいる間、古くなったデータを表示させたい場合に便利です。 `loading` と `error` と `latest` はリアクティブゲッターで、追跡が可能です。 @@ -556,7 +556,7 @@ createEffect(on(a, (v) => console.log(v), { defer: true })); setA("new"); // ここで実行される ``` -なお、 `stores` と `mutable` では、親オブジェクトのプロパティを追加したり削除したりすると、Effect が発生することに注意してください。[`createMutable`](#createMutable) を参照してください。 +なお、 `stores` と `mutable` では、親オブジェクトのプロパティを追加したり削除したりすると、Effect が発生することに注意してください。[`createMutable`](#createmutable) を参照してください。 ## `createRoot` @@ -581,7 +581,7 @@ function getOwner(): Owner; 現在実行中のコードを所有するリアクティブスコープを取得します。例えば、現在のスコープ外で後から `runWithOwner` を呼び出す際に渡します。 -内部的には、計算 (Effect、Memo など)は自分のオーナーの子であるオーナーを作成し、`createRoot` や `render` で作成したルートオーナーまでさかのぼります。特に、このオーナーシップツリーによって、Solid はそのサブツリーをトラバースして、すべての [`onCleanup`](#oncleanup) コールバックを呼び出すことによって、破棄された計算を自動的にクリーンアップできます。 +内部的には、計算 (Effect、Memo など)は自分のオーナーの子であるオーナーを作成し、`createRoot` や `render` で作成したルートオーナーまでさかのぼります。特に、このオーナーシップツリーによって、Solid はそのサブツリーをトラバースして、すべての [`onCleanup`](#oncleanup) コールバックを呼び出すことによって、破棄された計算を自動的にクリーンアップできます。 @@ -1252,13 +1252,13 @@ batch(() => { modifyMutable(state.user, reconcile({ firstName: "Jake", lastName: "Johnson", -}); +})); // 2 つのフィールドを一括で変更し、1回だけ更新をトリガーする modifyMutable(state.user, produce((u) => { u.firstName = "Jake"; u.lastName = "Johnson"; -}); +})); ``` # コンポーネント API @@ -1406,7 +1406,7 @@ const Wrapper = (props) => { `children` ヘルパーの重要な点は、 `props.children` にすぐにアクセスして、強制的に子を作成し解決することです。 -これは、例えば、[``](#) コンポーネント内で子を使用する場合など、条件付きレンダリングには望ましくない場合があります。 +これは、例えば、[``](#show) コンポーネント内で子を使用する場合など、条件付きレンダリングには望ましくない場合があります。 たとえば、次のコードは常に子を評価します: @@ -1568,7 +1568,7 @@ function createComputed(fn: (v: T) => T, value?: T): void; 使用する前に、密接に関連するプリミティブである [`createMemo`](#creatememo) と [`createRenderEffect`](#createrendereffect) を検討してみてください。 -`createMemo` と同様に、 `createComputed` は更新があるとすぐにその関数を呼び出します(ただし、[batch](#batch)、[effect](#createEffect)、または [transition](#use-transition) を使用している場合は除く)。 +`createMemo` と同様に、 `createComputed` は更新があるとすぐにその関数を呼び出します(ただし、[batch](#batch)、[effect](#createeffect)、または [transition](#usetransition) を使用している場合は除く)。 ただし、`createMemo` 関数は純粋であるべき(シグナルを更新してはいけません)である一方、 `createComputed` 関数はシグナルを更新できます。 diff --git a/langs/ko-kr/api/api.md b/langs/ko-kr/api/api.md index d8e4e4bb..ef6f615f 100644 --- a/langs/ko-kr/api/api.md +++ b/langs/ko-kr/api/api.md @@ -73,7 +73,7 @@ const newCount = setCount((prev) => prev + 1); > const [func, setFunc] = createSignal(myFunction); > ``` -[batch](#batch), [effect](#createEffect), [transition](#use-transition)에 있는 것이 아니라면, 시그널은 설정하는 즉시 업데이트됩니다. +[batch](#batch), [effect](#createeffect), [transition](#usetransition)에 있는 것이 아니라면, 시그널은 설정하는 즉시 업데이트됩니다. 예를 들어: ```js @@ -162,7 +162,7 @@ createEffect((prev) => { 이펙트 함수의 _첫 번째_ 실행은 바로 실행되지 않으며, 현재 렌더링 단계 이후에 실행되도록 예약됩니다(예: [`render`](#render), [`createRoot`](#createroot), [`runWithOwner`](#runwithowner) 에 전달된 함수를 호출한 후). 첫 번째 실행시까지 대기하려면, 브라우저가 DOM을 렌더링하기 전에 실행되는 [`queueMicrotask`](https://developer.mozilla.org/en-US/docs/Web/API/queueMicrotask) 를 사용하거나, 브라우저 렌더링 후에 실행되는 `await Promise.resolve()` 혹은 `setTimeout(..., 0)` 을 사용하세요. -첫 번째 실행 후, 이펙트는 일반적으로 디펜던시가 업데이트될 때 즉시 실행됩니다([batch](#batch) 혹은 [transition](#use-transition)인 경우는 예외입니다). +첫 번째 실행 후, 이펙트는 일반적으로 디펜던시가 업데이트될 때 즉시 실행됩니다([batch](#batch) 혹은 [transition](#usetransition)인 경우는 예외입니다). 예를 들어: ```js @@ -327,13 +327,13 @@ const [data, { mutate, refetch }] = createResource(sourceSignal, fetchData); 두 번째 경우, `sourceSignal`이 `false`, `null`, `undefined` 이외의 값을 갖는 즉시 `fetchData`가 호출됩니다. `sourceSignal` 값이 변경될 때마다 다시 호출되며, 그 값은 항상 `fetchData` 함수의 첫 번째 인수로 전달됩니다. -`mutate`를 호출해 `data` 시그널을 직접 업데이트((다른 시그널 setter 처럼 동작)할 수 있습니다. +`mutate`를 호출해 `data` 시그널을 직접 업데이트(다른 시그널 setter 처럼 동작)할 수 있습니다. `refetch`를 호출해 fetcher를 직접 다시 실행하고, `refetch(info)`와 같이 옵셔널 인수를 전달하여 fetcher에 추가 정보를 제공할 수 있습니다: . `data`는 일반 시그널 getter처럼 작동합니다: `data()`를 사용해 `fetchData`의 마지막 반환 값을 읽습니다. -하지만 두 가지 추가 리액티브 속성이 있습니다: `data.loading`은 fetcher가 호출되었지만 아직 반환되지 않았는지를 알려주며, `data.error`는 요청에 에러가 발생했는지 알려줍니다; 에러에는 fetcher에서 발생한 오류도 포합됩니다. (참고: 에러가 예상된다면, [ErrorBoundary](#)에 `createResource`를 래핑할 수 있습니다.) +하지만 두 가지 추가 리액티브 속성이 있습니다: `data.loading`은 fetcher가 호출되었지만 아직 반환되지 않았는지를 알려주며, `data.error`는 요청에 에러가 발생했는지 알려줍니다; 에러에는 fetcher에서 발생한 오류도 포합됩니다. (참고: 에러가 예상된다면, [ErrorBoundary](#errorboundary)에 `createResource`를 래핑할 수 있습니다.) -**1.4.0** 버전에서는, `data.latest`는 마지막으로 반환된 값을 반환하며, [Suspense](#)와 [트랜지션](#usetransition)을 트리거하지 않습니다; 아직 값이 반환된 적이 없다면, `data.latest`는 `data()`와 동일하게 작동합니다. 이는 새 데이터를 로딩하는 도중에는 이전 데이터를 보여주고자 하는 경우 유용합니다. +**1.4.0** 버전에서는, `data.latest`는 마지막으로 반환된 값을 반환하며, [Suspense](#suspense)와 [트랜지션](#usetransition)을 트리거하지 않습니다; 아직 값이 반환된 적이 없다면, `data.latest`는 `data()`와 동일하게 작동합니다. 이는 새 데이터를 로딩하는 도중에는 이전 데이터를 보여주고자 하는 경우 유용합니다. `loading`, `error`, `latest`는 리액티브 getter이며 추적 가능합니다. @@ -479,7 +479,7 @@ setA("new"); // 여기서 실행됩니다. ``` `stores`와 `mutable`에서 부모 객체에서 속성을 추가하거나 삭제하면 이펙트가 트리거됩니다. -[`createMutable`](#createMutable) 참조. +[`createMutable`](#createmutable) 참조. ## `createRoot` @@ -1159,13 +1159,13 @@ batch(() => { modifyMutable(state.user, reconcile({ firstName: "Jake", lastName: "Johnson", -}); +})); // batch에서 두 필드를 수정하며, 한 번의 업데이트만 트리거 modifyMutable(state.user, produce((u) => { u.firstName = "Jake"; u.lastName = "Johnson"; -}); +})); ``` # Component APIs @@ -1292,8 +1292,8 @@ const Wrapper = (props) => { }; ``` -`children` 헬퍼의 중요한 측면은 `props.children`에 바로 액세스하므로 자식을 강제로 생성하고 결정해야 한다는 것입니다. -이는 [``](#) 컴포넌트 내에서 자식을 사용하는 것과 같은 조건부 렌더링시에는 바람직하지 않을 수 있습니다. +`children` 헬퍼의 중요한 측면은 `props.children`에 바로 액세스하므로 자식을 강제로 생성하고 결정해야 한다는 것입니다. +이는 [``](#show) 컴포넌트 내에서 자식을 사용하는 것과 같은 조건부 렌더링시에는 바람직하지 않을 수 있습니다. 예를 들어, 다음 코드는 항상 자식을 평가합니다: ```tsx @@ -1434,7 +1434,7 @@ function createComputed(fn: (v: T) => T, value?: T): void; 하지만, `createComputed`는 다른 리액티브 프리미티브보다 더 많은 불필요한 업데이트를 쉽게 일으킬 수 있기 때문에 주의해서 사용해야 합니다. 사용 전에, 밀접하게 관련되어 있는 [`createMemo`](#creatememo)와 [`createRenderEffect`](#createrendereffect)을 고려해보세요. -`createMemo`와 마찬가지로, `createComputed`는 업데이트시 ([batch](#batch), [이펙트](#createEffect), [트랜지션](#use-transition)이 아닌 경우) 즉시 함수를 호출합니다. +`createMemo`와 마찬가지로, `createComputed`는 업데이트시 ([batch](#batch), [이펙트](#createeffect), [트랜지션](#usetransition)이 아닌 경우) 즉시 함수를 호출합니다. 하지만 `createMemo` 함수는 순수(어떤 시그널도 설정하지 않아야 함)해야 하지만, `createComputed` 함수는 시그널을 설정할 수 있습니다. 이와 관련해, `createMemo`는 함수 반환 값에 대해 읽기 전용 시그널을 제공하는 반면, `createComputed`로 동일한 작업을 수행하려면 함수 내에서 시그널을 설정해야 합니다. diff --git a/langs/ru/api/api.md b/langs/ru/api/api.md index 14213040..cdecb298 100644 --- a/langs/ru/api/api.md +++ b/langs/ru/api/api.md @@ -8,7 +8,7 @@ По умолчанию все зависимости функции начинают отслеживаться автоматически в тот момент, когда они вызываются в отслеживаемом контексте (то есть в тот момент, когда функция читает реактивное состояние, например, через геттер Сигнала или через атрибут Store). В результате обычно вам не нужно беспокоиться о том, чтобы указывать зависимости самостоятельно. -(Однако если автоматическое отслеживание зависимостей не даёт нужных вам результатов, вы можете [переопределить отслеживание зависимостей](#reactive-utilities).) +(Однако если автоматическое отслеживание зависимостей не даёт нужных вам результатов, вы можете [переопределить отслеживание зависимостей](#реактивные-утилиты).) Благодаря этому подходу реактивность является _композируемой_: вызов одной функции в другой функции позволяет вызываемой функции (та, что снаружи) наследовать зависимости вызванной функции (та, что внутри). ## `createSignal` diff --git a/langs/zh-cn/api/api.md b/langs/zh-cn/api/api.md index a9010995..9e9e5036 100644 --- a/langs/zh-cn/api/api.md +++ b/langs/zh-cn/api/api.md @@ -1,6 +1,6 @@ # 响应性基础 -Solid 响应性原理大致上是将任何响应性计算封装在函数中,并在其依赖关系更新时重新运行该函数。Solid JSX 编译器还用一个函数包装了大多数 JSX 表达式(括号中的代码),因此当依赖关系发生变化时,它们会自动更新(并触发相应的 DOM 更新)。更准确地说,每当函数在跟踪范围内被调用时,就会自动重新运行该函数,例如 JSX 表达式或构建 “计算” 的 API 调用(`createEffect`, `createMemo` 等)。默认情况下,在跟踪范围内调用函数时,通过检测函数何时读取反应状态(例如,通过 signal getter 或 Store 属性),自动跟踪函数的依赖关系。因此,您通常不需要担心依赖关系。(但是,如果自动依赖项跟踪无法产生您想要的结果,您可以 [覆盖依赖项跟踪](#reactive-utilities))这种方法使响应性可组合:在另一个函数中调用一个函数通常会导致调用函数继承被调用函数的依赖关系。 +Solid 响应性原理大致上是将任何响应性计算封装在函数中,并在其依赖关系更新时重新运行该函数。Solid JSX 编译器还用一个函数包装了大多数 JSX 表达式(括号中的代码),因此当依赖关系发生变化时,它们会自动更新(并触发相应的 DOM 更新)。更准确地说,每当函数在跟踪范围内被调用时,就会自动重新运行该函数,例如 JSX 表达式或构建 “计算” 的 API 调用(`createEffect`, `createMemo` 等)。默认情况下,在跟踪范围内调用函数时,通过检测函数何时读取反应状态(例如,通过 signal getter 或 Store 属性),自动跟踪函数的依赖关系。因此,您通常不需要担心依赖关系。(但是,如果自动依赖项跟踪无法产生您想要的结果,您可以 [覆盖依赖项跟踪](#响应性工具类))这种方法使响应性可组合:在另一个函数中调用一个函数通常会导致调用函数继承被调用函数的依赖关系。 ## `createSignal` @@ -289,9 +289,9 @@ const [data, { mutate, refetch }] = createResource(sourceSignal, fetchData); 您可以调用 `mutate` 来直接更新 `data` signal(它的工作方式与任何其他 signal setter 一样)。您还可以调用 `refetch` 直接重新运行 fetcher,并传递一个可选参数以向 fetcher 提供附加信息:`refetch(info)`。 -`data` 像一个普通的 signal getter 一样工作:使用 `data()` 来读取 `fetchData` 的最后一个返回值。但它还有额外的响应属性:`data.loading` 告诉你是否调用了 fetcher 但没有返回。`data.error` 告诉你请求是否出错,如果出错,它将包含 fetcher 抛出的错误。(注意:如果您预计会出现错误,您可能需要将 `createResource` 包装在 [ErrorBoundary](#) 中 +`data` 像一个普通的 signal getter 一样工作:使用 `data()` 来读取 `fetchData` 的最后一个返回值。但它还有额外的响应属性:`data.loading` 告诉你是否调用了 fetcher 但没有返回。`data.error` 告诉你请求是否出错,如果出错,它将包含 fetcher 抛出的错误。(注意:如果您预计会出现错误,您可能需要将 `createResource` 包装在 [ErrorBoundary](#errorboundary) 中 -从 **1.4.0** 开始,`data.latest` 将返回最后一个返回值,不会触发 [Suspense](#) 和 [transitions](#usetransition)。如果还没有返回值,`data.latest` 的行为与 `data()` 相同。如果您想在加载新数据时显示过期数据,这将很有用。 +从 **1.4.0** 开始,`data.latest` 将返回最后一个返回值,不会触发 [Suspense](#suspense) 和 [transitions](#usetransition)。如果还没有返回值,`data.latest` 的行为与 `data()` 相同。如果您想在加载新数据时显示过期数据,这将很有用。 `loading`、`error` 和 `latest` 是响应式 getter,可以被跟踪。 @@ -458,7 +458,7 @@ createEffect(on(a, (v) => console.log(v), { defer: true })); setA("new"); // 现在会运行了 ``` -请注意,在 `stores` 和 `mutable` 上,从父对象中添加或删除属性会触发 effect。参见[`createMutable`](#createMutable) +请注意,在 `stores` 和 `mutable` 上,从父对象中添加或删除属性会触发 effect。参见[`createMutable`](#createmutable) ## `catchError` @@ -1123,13 +1123,13 @@ batch(() => { modifyMutable(state.user, reconcile({ firstName: "Jake", lastName: "Johnson", -}); +})); // 批量修改两个字段,只触发一次更新 modifyMutable(state.user, produce((u) => { u.firstName = "Jake"; u.lastName = "Johnson"; -}); +})); ``` # 组件 API @@ -1241,7 +1241,7 @@ const Wrapper = (props) => { }; ``` -`children` 工具类的一个重要方面是它强制创建和解析 children,因为它立即访问 `props.children`。这对于条件渲染可能是不可取的,例如,在 [``](#) 组件中使用 children 时。下面的代码总是计算 children: +`children` 工具类的一个重要方面是它强制创建和解析 children,因为它立即访问 `props.children`。这对于条件渲染可能是不可取的,例如,在 [``](#show) 组件中使用 children 时。下面的代码总是计算 children: ```tsx const resolved = children(() => props.children); @@ -1319,7 +1319,7 @@ import { createRenderEffect } from "solid-js"; function createRenderEffect(fn: (v: T) => T, value?: T): void; ``` -render effect 是一种类似于常规 effect 的计算(由 [`createEffect`](#createeffect)) 创建),但在 Solid 计划第一次执行 effect 函数时有所不同。当 `createEffect` 等待当前渲染阶段完成时,`createRenderEffect` 立即调用该函数。因此,effect 在创建和更新 DOM 元素时运行,但可能在创建特定的感兴趣元素之前,并且可能在这些元素连接到文档之前。特别是,[`ref`](#ref) 不会在初始 effect 调用之前设置。事实上,Solid 使用`createRenderEffect` 来实现渲染阶段本身,包括 `ref` 的设置。 +render effect 是一种类似于常规 effect 的计算(由 [`createEffect`](#createeffect) 创建),但在 Solid 计划第一次执行 effect 函数时有所不同。当 `createEffect` 等待当前渲染阶段完成时,`createRenderEffect` 立即调用该函数。因此,effect 在创建和更新 DOM 元素时运行,但可能在创建特定的感兴趣元素之前,并且可能在这些元素连接到文档之前。特别是,[`ref`](#ref) 不会在初始 effect 调用之前设置。事实上,Solid 使用`createRenderEffect` 来实现渲染阶段本身,包括 `ref` 的设置。 render effect 的响应式更新与 effect 相同:它们排队以响应响应式更改(例如,单个 single 更新,或 `batch` 更改,或整个渲染阶段期间的集体更改)并在单个 [`batch`](#batch) 之后(连同效果)。特别是,render effect 中的所有 single 更新都是批处理的。 @@ -1367,7 +1367,7 @@ function createComputed(fn: (v: T) => T, value?: T): void; `createComputed` 是 Solid 中最直接的响应形式,对于构建其他响应性 API 最有用。(例如,其他一些 Solid API 是从 `createComputed` 构建的。)但应该小心使用,因为 `createComputed` 很容易导致比其他响应性 API 更多不必要的更新。在使用它之前,请考虑密切相关的 API [`createMemo`](#creatememo) 和 [`createRenderEffect`](#createrendereffect)。 -与 `createMemo` 一样,`createComputed` 会在更新时立即调用其函数(除非您在 [batch](#batch)、[effect](#createEffect) 或 [transition](#use-transition) 中)。然而,虽然 `createMemo` 函数应该是纯函数(不修改任何 signal),但 `createComputed` 函数可以修改 signal。相关的,`createMemo` 为函数的返回值提供了一个只读 signal,而要对 `createComputed` 做同样的事情,你需要在函数中修改一个 signal。如果可以使用纯函数和`createMemo`,这可能更有效,因为 Solid 优化了 memo 更新的执行顺序,而更新 `createComputed` 中的信号将立即触发响应更新,其中一些可能会变成不必要。 +与 `createMemo` 一样,`createComputed` 会在更新时立即调用其函数(除非您在 [batch](#batch)、[effect](#createeffect) 或 [transition](#usetransition) 中)。然而,虽然 `createMemo` 函数应该是纯函数(不修改任何 signal),但 `createComputed` 函数可以修改 signal。相关的,`createMemo` 为函数的返回值提供了一个只读 signal,而要对 `createComputed` 做同样的事情,你需要在函数中修改一个 signal。如果可以使用纯函数和`createMemo`,这可能更有效,因为 Solid 优化了 memo 更新的执行顺序,而更新 `createComputed` 中的信号将立即触发响应更新,其中一些可能会变成不必要。 与 `createRenderEffect` 一样,`createComputed` 第一次立即调用它的函数。但它们在更新的执行方式上有所不同。虽然 `createComputed` 通常会立即更新,但 `createRenderEffect` 会更新队列以在当前渲染阶段之后运行(与 `createEffect` 一起)。因此,`createRenderEffect` 可以执行更少的整体更新,但稍微不那么即时。