Sta*_*n_K 6 javascript reactjs react-hooks
我有一个自定义的反应钩子:
function useItem(id) {
const [value, setValue] = useState();
useEffect(() => {
databaseRead(id).then(i => setValue(i));
}, [id]);
function setItem(i) {
setValue(i);
}
function writeItem(i) {
databaseWrite(id, i);
}
return [value, setItem, writeItem];
}
Run Code Online (Sandbox Code Playgroud)
在组件中使用这样的钩子时,每次值更改时返回的 writeItem 函数都会更改(大概是因为我每次都创建一个新数组)。
当我在像这样的 Item 中使用钩子时,如何避免重新呈现 Button 组件?
function Item(props) {
const [item, setItem, writeItem] = useItem(props.id);
return(
<>
<ItemEditor data={item} setItem={setItem}/>
<Button onPress={writeItem}/>
</>
)
}
Run Code Online (Sandbox Code Playgroud)
我目前的工作但笨拙的方法是从我的钩子中返回一个 useRef 对象而不是数组:
function useItem(id) {
const retVal = useRef({
value: value,
setItem: setItem,
writeItem: writeItem
}).current;
const [dirty, setDirty] = useState();
function makeDirty() { setDirty(Math.random()); }
//and instead of setValue(i) do retVal.value=i; makeDirty();
return retVal;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
您可以使用useCallback钩子来记忆函数,以便在每次渲染时不会再次创建它们
function useItem(id) {
const [value, setValue] = useState();
useEffect(() => {
databaseRead(id).then(i => setValue(i));
}, [id]);
const setItem = useCallback(function(i) {
setValue(i);
}, []);
const writeItem = useCallback(function(i) {
databaseWrite(id, i);
}, [id]) // this depends on id, and need to be recreated on id change
return [value, setItem, writeItem];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4662 次 |
| 最近记录: |