javascript - 如何在 3rd 方事件处理程序中使用最新的状态/值?
问题描述
给定类似的东西:
function MapControl() {
const [countries, setCountries] = useContext(CountriesContext)
useEffect( () => {
ThirdPartyApi.OnSelectCountry((country) => {
setCountries([...countries, country])
})
})
return (<ThirdPartyApi.Map />)
}
我的问题是调用setCountries
无法按预期工作,因为countries
数组没有从ThirdPartyApi
.
什么是一种干净的建模方法?我可以在事件处理程序中更新一个本地可变数组,但这不会countries
从其他组件中获取任何更改,因此感觉注定会导致问题。
解决方案
您可以使用功能更新来使用最新值修改您的状态,而不是从陈旧的闭包中捕获它:
function MapControl() {
const [countries, setCountries] = useContext(CountriesContext)
useEffect( () => {
ThirdPartyApi.OnSelectCountry((country) => {
setCountries((prev) => [...prev, country])
})
return () => {
// unregister event handler
}
}, [])
return (
<ThirdPartyApi.Map />
)
}
还要确保指定你的依赖项,useEffect()
这样你就不会在每次重新渲染时触发你的副作用。在这种情况下,您的副作用没有任何依赖关系,因此它应该是 empty []
。
最后,确保在卸载组件时清理您的效果。在这种情况下,您需要在从useEffect()
.
推荐阅读
- vue.js - 如何一次处理 Vuex 中的对象突变
- youtube-dl - youtube-dl 和 aria2c - 基于带有 YouTube 链接的列表批量下载并根据文件名列表保存每个文件
- python - Visual Studio Code:当我检查 3 次时弹出“无效语法”
- assembly - 如何识别磁盘和 CD/DVD 上的扇区、磁道?
- xslt-2.0 - 使用 XSLT 2.0 版将 Word 文件表行跨度转换为 XML
- api - 当请求 API 的自定义标头错误时,将 http 状态代码设置为 417
- c++ - Foreach 但跳过前 N 个项目?
- spring-boot - 打包工作的 Spring Tool Suite 应用程序时出错
- compiler-construction - 请给我解释一下“编译器。龙书”练习2.2.1的解决方案
- java - Java Compiler / VM 是否优化用于在调试器中检查的临时变量