Selector
是一組純函數 (Pure function, 註:純函數意指相同的input,永遠會回傳一樣的output,沒有任何副作用(side effect))
Selector
接受 atoms
(共享的狀態) 跟其他的 selectors
(共享的狀態) 作為input,然後在裡面做一點運算,轉換成我們需要的狀態( derived state )回傳output。
當上游 input 傳入的這些狀態被更新、發生改變時,selector function 會被重新評估。就像 atoms
一樣,元件也可以訂閱 selectors
,而且當selectors
改變時,元件也會被重新渲染。
selectors
是基於 state ( atom
/ selectors
) 來計算成我們需要的資料。這樣子我們就可以避免建立多餘的 state ,常常也不用再透過 reducer 來保持 state 的同步與正確性。
除此之外,當所有 state 都是被需要的時候,有了 selectors
之後,我們可以將 atom
最小化、精簡化,除了藉由 selectors
算出我們需要的資料,這些 selectors
也會持續追蹤哪些元件訂閱它、追蹤自己依賴的 state ( atom
/ selectors
), selectors
的存在使我們的程式碼能以 functional 途徑(approach) 提升效率。
Selector
,可以透過 Recoil 官方提供的API ,selector 這個 function 被建立。
const lengthState = atom({
key: "length",
default: 0
});
const circularAreaState = selector({
key: "circularArea",
get: ({ get }) => {
return get(lengthState) * get(lengthState) * 3.14;
}
});
從元件的角度而言, atom
/ selector
使用的介面是相同的,因此我們可以輕易地將 atom
轉成 selector
或是 selector
轉成 atom
。
const [length, setLength] = useRecoilState(lengthState);
const circularArea = useRecoilValue(circularAreaState);