javascript - 使用 setItem 设置多个状态值和使用 useEffect 这样做有什么区别?
问题描述
我的应用程序中有一个重置按钮,用于重置我的功能组件的一些变量:
const [selectedItem, setSelectedItem] = useState(0);
const [a, setA] = useState('a');
const [b, setB] = useState('blue');
<button onClick={e => ???}>clicky</button>
<button onClick={e => ???}>clicky</button>
有两种方法可以“重置”数据:使用 监视selectedItem
更改useEffect
,或者使用一个处理程序来执行此操作:
<button onClick ={e => setSelectedItem(e.target.value)} />
useEffect(() => {
setA(Math.random())
setB(Math.random())
}, [selectedItem])
or
<button onClick ={e => handler(e.target.value)} />
const handler = item => {
setSelectedItem(Math.random())
setA(Math.random())
setB(Math.random())
}
这些方法之间的实际区别是什么?钩子文档说使用 useEffect 来执行副作用,但我不明白为什么这种方法不能正常工作。
解决方案
这些方法有什么区别?
我将尝试分三点回答这个问题。
心智模型 你需要“思考效果”。UseEffect 钩子让您可以执行需要异步发生的副作用(从 API 获取数据,操作 DOM)。
基于此,最好使用 UseEffect 来处理副作用,这样您就不会混淆您的大学。
异步 您需要记住 useEffect 是一个异步函数,但您的事件处理程序是同步函数。这可能导致完全不同的行为,也许您在这里没有看到奇怪的行为,但也许在其他示例中,您会开始注意到这一点。
React 机制 的最后一个区别要注意它你需要了解 React 更新状态机制,react 会通过补丁来更新状态。这意味着在您的事件处理程序中,三态将导致一次重新渲染,因为它们将同时发生。在您的 useEffect 不是这种情况下,您正在更新其中一个案例重新渲染,然后您正在执行将重新渲染新案例的效果。
也许还有其他差异,但我现在能看到什么。
我希望这是一个有用的答案。
推荐阅读
- java - 无法从 java spring api 获取资源,可能是 jpa 故障
- logging - DI ILogger的正确方法
在派生类中 - azure - Azure 文件共享路径与使用 ARM 模板的容器实例卷路径映射
- wso2 - 如何获取 wso2 esb 代理参数
- linux - ssh_exchange_identification:远程主机linux服务器关闭到Mac机器的连接
- authentication - Azure SQL DB - 如何创建新的登录名、访问受限的用户?
- opam - 如何在旧的不可用版本中安装 opam 包?
- r - R(RStudio)控制台编码问题
- python - 导入“embed_video.fields”无法解析 Pylance 报告缺少导入
- loops - 在批处理文件的 for 循环中设置随机变量值会产生错误