reactjs - 可重用的 React 钩子函数的意外(?)行为或者我做错了什么?
问题描述
我正在尝试编写自己的可重用 useEffect 挂钩函数useEffectOnce()
以仅运行一次(在挂载和卸载时),但这似乎是不可能的。每次重新渲染后都会调用我的函数:https ://codesandbox.io/s/mjx452lvox
function useEffectOnce() {
console.log("I am in useEffectOnce");
useEffect(() => {
console.log("I am in useEffectOnce's useEffect");
return () => {
console.log("i am leaving useEffectOnce's useEffect");
};
}, []);
}
function App() {
const [count, setCount] = useState(0);
useEffectOnce(); // once!?
return (
<div className="app">
<h3>useEffectOnce (my reusable function)... Wait, once!?</h3>
<button onClick={() => setCount(count + 1)}>
You clicked me {count} times
</button>
</div>
);
}
笔记:
- useEffectOnce() 中的 useEffect() 挂钩按预期工作
useEffectOnce(() => {}, []);
什么都没有改变
...然后大惊喜,与可重复使用的 useState 挂钩函数(!?)的行为相同:https ://codesandbox.io/s/2145m37xnr
useButton
每次重新渲染后都会调用我的函数,并且何时是第一个独立的按钮单击。
function useButton(initialCounterValue) {
const [usebuttoncount, setUseButtonCount] = useState(initialCounterValue);
console.log("I am in useButton");
const handleuseButtonClick = () => {
setUseButtonCount(usebuttoncount + 1);
};
return {
usebuttoncount,
onClick: handleuseButtonClick
};
}
function App() {
const [count, setCount] = useState(0);
const useButtonCounter = useButton(0);
return (
<div className="app">
<h3>
useButton (my reusable useState function) is called only when... OMG!?
</h3>
<button onClick={() => setCount(count + 1)}>
You clicked me {count} times
</button>
<br />
<button {...useButtonCounter}>
(useButton hook) You clicked me {useButtonCounter.usebuttoncount} times
</button>
</div>
);
}
解决方案
useEffectOnce
并且useButton
是常规函数。它们应该在每个组件渲染上运行。当组件函数被调用时,没有办法阻止它们被传统的 JavaScript 方法调用(即没有eval
)。
它是useEffect
回调函数(I am in useEffectOnce's useEffect
日志条目),预计在组件挂载时调用一次。所有需要在组件安装上评估的代码都应该驻留在那里。
推荐阅读
- php - 如何使用 php curl 上传照片?
- vb.net - 选项严格打开时的后期绑定
- java - 为什么maven从spring repo下载jar?
- r - 我在一个字符串中有 2-3 个数字,它们之间有空格如何将所有数字添加到新列中?
- api - 使用 Postman 发送冒号标头
- c# - 标签如何不时更新
- git - remote: HTTP Basic: Access denied fatal: Authentication failed
- angular - ERROR 错误:未捕获(在承诺中):错误:无法匹配任何路由。URL 段:“仪表板/用户/添加用户”
- javascript - 如何获取我的 JavaScript 数组的所有子字符串(连续子序列)?
- ruby-on-rails - 按其 has_many 模型的日期差异订购模型