JotaiJotai

Jotai
React 原始而灵活的状态管理

Optics

安装

要使用此功能,你必须安装 optics-tsjotai-optics

npm i optics-ts jotai-optics

focusAtom

focusAtom 创建一个新的原子,基于你传递给它的焦点。这将创建一个派生的原子,它将专注于原子的指定部分, 当派生原子更新时,派生者会收到更新通知,并在派生者上完成等效的更新。

看看这个:

const baseAtom = atom({ a: 5 }) // PrimitiveAtom<{a: number}>
const derivedAtom = focusAtom(baseAtom, (optic) => optic.prop('a')) // PrimitiveAtom<number>

所以基本上,我们从一个 PrimitiveAtom<{a: number}> 开始,它有一个 getter 和一个 setter,然后使用 focusAtom 来放大 baseAtoma 属性, 并得到一个 PrimitiveAtom<number>。值得注意的是,这个 derivedAtom 不仅是一个 getter,它也是一个 setter。如果 derivedAtom 更新,那么在 baseAtom 上也会进行等效的更新。

下面的例子很简单,但它是一个起点。focusAtom 支持许多种类型的 optics,包括 LensPrismIsomorphism

要查看更高级的 optics,请参见以下示例:

optics-ts 中文文档:https://ouweiya.github.io/optics-ts-zh

示例

import { atom } from 'jotai'
import { focusAtom } from 'jotai-optics'
const objectAtom = atom({ a: 5, b: 10 })
const aAtom = focusAtom(objectAtom, (optic) => optic.prop('a'))
const bAtom = focusAtom(objectAtom, (optic) => optic.prop('b'))
const Controls = () => {
const [a, setA] = useAtom(aAtom)
const [b, setB] = useAtom(bAtom)
return (
<div>
<span>Value of a: {a}</span>
<span>Value of b: {b}</span>
<button onClick={() => setA((oldA) => oldA + 1)}>Increment a</button>
<button onClick={() => setB((oldB) => oldB + 1)}>Increment b</button>
</div>
)
}

Codesandbox