我有一个对象数组,其中每个对象都有一个onclick事件。我将对象数组映射到组件。我有一个按钮,可以在其中更改变量的值。
如果单击按钮,它将更改变量的值,但是当我在其中一个组件上触发onclick事件时,它将不使用变量的更改后的值。(我猜这是正常的行为,因为该事件在创建时已绑定到该组件。)
虽然,如何在组件的onClick事件中使用更新后的变量值?
首先,我声明我的变量
const [myVariable, setMyVariable] = useState("first value");
const [mymap, setmymap] = useState([
{
key: 1,
name: "one",
onClick: event => handleClick(event)
},
{
key: 2,
name: "two",
onClick: event => handleClick(event)
}
]);
setVariable是我的第一个按钮的onClick事件,它会更改变量的值
const setVariable = () => {
setMyVariable("second value");
};
handleClick是我组件的onClick事件
const handleClick = () => {
console.log(myVariable);
};
在这里,我返回了带有我的MyComponent映射的UI
return (
<div>
<button onClick={setVariable}>Set variable</button>
<h1>{myVariable}</h1>
{mymap.map(element => (
<MyComponent key={element.key} onclickevent={element.onClick} />
))}
</div>
);
在这个示例中,将事件存储在每个mymap
项目中看起来都是多余的。如果没有理由,那么较简单的版本将按预期工作:
import React, { useState, useCallback } from "react";
const MyComponent = ({onclickevent}) => (<div>
<button onClick={onclickevent}>
Use variable from MyComponent
</button>
</div>);
const MyPage = props => {
const [myVariable, setMyVariable] = useState("first value");
// handler changes only when `myVariable` changes
const clickHandler = useCallback(() => {
console.log(myVariable);
}, [myVariable]);
// removing handlers from state
const [mymap, setmymap] = useState([
{
key: 1,
name: "one"
},
{
key: 2,
name: "two"
}
]);
return (
<div>
<button onClick={() => setMyVariable("second value")}>Set another value</button>
<h1>{myVariable}</h1>
{mymap.map(element => (
<MyComponent key={element.key} onclickevent={clickHandler} />
))}
</div>
);
};
export default MyPage;
在上面的方法中,将处理程序存储在一个状态中,然后在迭代状态元素时获取它,然后将mymap.map(el => el.onClick)
其直接传递给子代(示例显示这些子代还是一样)。但是我们还需要确保处理程序不是陈旧的,并根据期望的值进行更改:
const clickHandler = useCallback(() => {
console.log(myVariable);
}, [myVariable]);
问题中提供的更新的Codesandbox示例:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句