我有一个使用 Hooks 的功能组件:
function Component(props) {
const [ items, setItems ] = useState([]);
// In a callback Hook to prevent unnecessary re-renders
const handleFetchItems = useCallback(() => {
fetchItemsFromApi().then(setItems);
}, []);
// Fetch items on mount
useEffect(() => {
handleFetchItems();
}, []);
// I want this effect to run only when 'props.itemId' changes,
// not when 'items' changes
useEffect(() => {
if (items) {
const item = items.find(item => item.id === props.itemId);
console.log("Item changed to " item.name);
}
}, [ items, props.itemId ])
// Clicking the button should NOT log anything to console
return (
<Button onClick={handleFetchItems}>Fetch items</Button>
);
}
该组件items
在挂载时获取一些并将它们保存到状态。
该组件接收一个itemId
prop(来自 React Router)。
每当props.itemId
发生变化时,我希望它触发一个效果,在这种情况下将其记录到控制台。
问题是,由于效果也依赖于items
,因此无论何时items
发生变化,效果也会运行,例如当items
按下按钮重新获取 时。
这可以通过将前props.itemId
一个存储在单独的状态变量中并比较两者来解决,但这似乎是一个黑客并添加了样板。使用 Component 类可以通过比较 中的当前和以前的 props 来解决这个问题componentDidUpdate
,但是使用功能组件是不可能的,这是使用 Hooks 的要求。
仅当其中一个参数发生变化时,触发依赖于多个参数的效果的最佳方法是什么?
附注。Hooks 是一种新事物,我认为我们都在尽最大努力弄清楚如何正确地使用它们,所以如果我的想法在你看来是错误的或尴尬的,请指出。