跳到主要内容

Selector

2023年01月12日
柏拉文
越努力,越幸运

一、认识


selector 是一个纯函数,入参为 atom 或者其他 selector。当上游 atomselector 更新时,将重新执行 selector 函数。组件可以像 atom 一样订阅 selector,当 selector 发生变化时,重新渲染相关组件。

Selector 被用于计算基于 state 的派生数据。这使得我们避免了冗余 state,通常无需使用 reduce 来保持状态同步性和有效性。作为替代,将最小粒度的状态存储在 atom 中,而其它所有内容根据最小粒度的状态进行有效计算。由于 selector 会追踪需要哪些组件使用了相关的状态,因此它们使这种方式更加有效。

从组件的角度来看,selectoratom 具有相同的功能,因此可以交替使用。

二、语法


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>
</>
);
}