Selector
2023年01月12日
一、认识
selector
是一个纯函数,入参为 atom
或者其他 selector
。当上游 atom
或 selector
更新时,将重新执行 selector
函数。组件可以像 atom
一样订阅 selector
,当 selector
发生变化时,重新渲染相关组件。
Selector
被用于计算基于 state
的派生数据。这使得我们避免了冗余 state
,通常无需使用 reduce
来保持状态同步性和有效性。作为替代,将最小粒度的状态存储在 atom
中,而其它所有内容根据最小粒度的状态进行有效计算。由于 selector
会追踪需要哪些组件使用了相关的状态,因此它们使这种方式更加有效。
从组件的角度来看,selector
和 atom
具有相同的功能,因此可以交替使用。
二、语法
2.1 创建状态
const fontSizeLabelState = selector({
key: 'fontSizeLabelState',
get: ({get}) => {
const fontSize = get(fontSizeState);
const unit = 'px';
return `${fontSize}${unit}`;
},
});
2.2 使用状态
function FontButton() {
const [fontSize, setFontSize] = useRecoilState(fontSizeState);
const fontSizeLabel = useRecoilValue(fontSizeLabelState);
return (
<>
<div>Current font size: {fontSizeLabel}</div>
<button onClick={() => setFontSize(fontSize + 1)} style={{fontSize}}>
Click to Enlarge
</button>
</>
);
}