Split
splitAtom
splitAtom
工具在你想要获取列表中每个元素的原子时非常有用。
它适用于包含列表的读/写原子。在这样的原子上使用时,它返回一个原子,
该原子本身包含一个原子列表,每个原子对应于原始列表中的相应项。
一个简化的类型签名可能是:
type SplitAtom = <Item>(arrayAtom: PrimitiveAtom<Array<Item>>): Atom<Array<PrimitiveAtom<Item>>>
此外,splitAtom
返回的原子在 write
方向包含一个调度函数(自 v1.6.4 起),
这在你想要一种简单的方式来修改原始原子的操作,如remove
、insert
和move
时非常有用。
请参阅下面的示例以了解使用方法。
Codesandbox
import { Provider, atom, useAtom, PrimitiveAtom } from 'jotai'import { splitAtom } from 'jotai/utils'import './styles.css'const initialState = [{task: 'help the town',done: false,},{task: 'feed the dragon',done: false,},]const todosAtom = atom(initialState)const todoAtomsAtom = splitAtom(todosAtom)type TodoType = (typeof initialState)[number]const TodoItem = ({todoAtom,remove,}: {todoAtom: PrimitiveAtom<TodoType>remove: () => void}) => {const [todo, setTodo] = useAtom(todoAtom)return (<div><inputvalue={todo.task}onChange={(e) => {setTodo((oldValue) => ({ ...oldValue, task: e.target.value }))}}/><inputtype="checkbox"checked={todo.done}onChange={() => {setTodo((oldValue) => ({ ...oldValue, done: !oldValue.done }))}}/><button onClick={remove}>remove</button></div>)}const TodoList = () => {const [todoAtoms, dispatch] = useAtom(todoAtomsAtom)return (<ul>{todoAtoms.map((todoAtom) => (<TodoItemtodoAtom={todoAtom}remove={() => dispatch({ type: 'remove', atom: todoAtom })}/>))}</ul>)}const App = () => (<Provider><TodoList /></Provider>)export default App