javascript - 在子组件中传递和调用的函数无权访问父状态值
问题描述
我有一个父组件和一个子组件。
父组件具有我想要访问的状态变量。
我将一个函数传递给子组件并在那里调用它 onClick。
但是,状态变量的值已过时 - 而不是当前值。
function Parent(props) {
const [items, setItems] = useState([]);
function getItems () {
console.log(items); // always prints "[]"
}
useEffect(() => {
thirdPartyApiCall().then((fetchedItems) =>
let newItems = fetchedItems.map(item => <Child id={item.id} getItems={getItems}/>)
setItems(newItems); // populates items array. "{items}" elements correctly displayed on web page
);
}, []);
}
function Child(props) {
return <button onClick={props.getItems}>{props.id}</button>
}
解决方案
你可能想看看 javascript闭包是如何工作的。
将给出正在发生的事情的基本概念。
useEffect
由于依赖关系,只会运行一次。所以当子组件被渲染items
时是一个空数组([]
)。您的子组件将始终具有items
asuseEffect
没有被调用的这个实例 updated items
。
希望这有帮助。
编辑:1
您可能希望您的父组件看起来像这样。
function Parent(props) {
const [items, setItems] = useState([]);
function getItems () {
console.log(items); // always prints "[]"
}
useEffect(() => {
thirdPartyApiCall().then((fetchedItems) =>
setItems(newItems);
);
}, []);
return newItems.map(item => <Child key={item.id} id={item.id} getItems={getItems}/>)
}
推荐阅读
- javascript - 有什么办法可以让带有输入和排序的工具提示都应用于VueJS中的同一个标题?
- python - 我如何知道 Python 是否会在 Spyder IDE 中引发异常?
- python - 如何修复 Import object_detection/protos/image_resizer.proto 但未使用
- angular - Ngx-guage 百分比值
- c++ - 如何在cryptoki中重命名容器名称
- unit-testing - 是否可以选择在 Spock 中动态生成 n 个测试
- dbt - dbt可以连接同一个项目的不同数据库吗?
- reactjs - 为什么 React 菜单选择不保持选择?
- javascript - 如何修复弹性框的文本溢出
- html - CSS删除图像周围的空白