consttextState=atom({key:"textState",// unique ID (with respect to other atoms/selectors)
default:"",// default value (aka initial value)
});
Selector
selector 是一个纯函数,入参为 atom 或其他 selector。selector 被用于计算基于 atom 的派生数据,这使得我们避免了冗余 state,将最小粒度的状态存储在 atom 中,而其它所有内容根据最小粒度的状态进行有效计算。当上游 atom/selector 更新时,将重新执行 selector 函数。组件可以像 atom 一样订阅 selector,当 selector 发生变化时,重新渲染相关组件。
定义一个 selector,依赖的 atom 是我们上面定义的 textState,用来获取输入字符长度 :
1
2
3
4
5
6
7
constcharCountState=selector({key:"charCountState",// unique ID (with respect to other atoms/selectors)
get:({get})=>{consttext=get(textState);returntext.length;},});
importReactfrom"react";import{atom,useRecoilState,selector,useRecoilValue}from"recoil";consttextState=atom({key:"textState",// unique ID (with respect to other atoms/selectors)
default:"",// default value (aka initial value)
});constcharCountState=selector({key:"charCountState",// unique ID (with respect to other atoms/selectors)
get:({get})=>{consttext=get(textState);returntext.length;},});exportconstCharacterCounter=()=>{const[char,setChar]=useRecoilState(textState);// selector 没有定义 set,用 useRecoilValue 取值
constcharCount=useRecoilValue(charCountState);return(<div><inputtype="text"value={char}onChange={(e)=>setChar(e.target.value)}/><div>Echo:{char}</div><div>CharacterCount:{charCount}</div></div>);};exportdefaultCharacterCounter;
atom,selector 的 state 的取值和更新函数是相同的,selector 未定义 set 只能用 useRecoilValue 取值,定义 set 之后也能用 useRecoilState,因此 atom 应该是基于 selector 的一个特定封装,帮我们封装好了 set,get,而无须自定义。