javascript - 当数组的值改变时如何更新 UI
问题描述
我通过迭代skidList 数组来显示每个skid 的名称。
我还提供了一个按钮“复制”,单击时调用 insertSkid 和调用 deleteSkid 的“删除”。
在 insertSkid 中,我正在更新 skidList 数组。
但是,Modal.Body 不会在对 skidList 数组进行更改时更新 Skid 名称。
这是我的代码。
const CreateNewTab = () => {
const [skidList, setSkidList] = useState([]);
let newSkid = {};
newSkid[name] = "PEN";
let newSkidList = [];
newSkidList.push(newSkid);
setSkidList(newSkidList);
const insertSkid = skid => {
let newSkidList = skidList;
newSkidList.push(skid);
setSkidList(newSkidList);
console.log("Added New Skid" + skidList.length);
};
const deleteSkid = (index) => { setSkidList([...skidList.splice(index, 1)]); }
return (
<Modal
backdrop="static"
show={true}
centered
dialogClassName={"createnewskid-modal"}
>
<Modal.Body>
{skidList.flatMap((skid, index) => (
<div>
{skid[name]}
<Button onClick={insertSkid.bind(this,skid)}>copy</Button>
<Button onClick={()=> deleteSkid(index)}>delete</Button>
<Divider />
</div>
))}
</Modal.Body>
</Modal>
)
}
解决方案
您提供的代码存在几个问题。如前所述,useEffect() 钩子在此处用于处理skid 数组的初始化:
useEffect(()=>{
let newSkid = {name: "PEN"};
setSkidList([...skidList, newSkid])
},[])
// The empty array second param tells the component to only execute the above code once on mount
注意:这里使用扩展运算符 (...) 来生成一个基于我们附加 newSkid 的skidList 的新列表。
接下来,您应该使用刚刚描述的相同方法在 insertSkid 函数中更新您的列表:
const insertSkid = (skid) =>{
setSkidList([...skidList, skid])
}
最后,我建议不要绑定你的函数,而是在 onclick 道具中使用匿名函数:
onClick = {() => insertSkid(skid)}
推荐阅读
- python - 如何限制 scipy.integrate.quad 中的函数调用次数?
- apache-kafka - 来自 MSK 集群的 AWS lambda 缺少 kafka 消息头
- java - 从蓝牙传入的字符串缺少字符
- automated-tests - WebRTC 应用程序的 QA 自动化
- mysql - 在 CPanel 上续集 ECONNREFUSED
- javascript - 方法不等待 Promise 解决
- mysql - 输出用户没有的记录
- azure-application-insights - 使用始终返回 0 的 Kusto 查询语言返回十进制值
- python - 如何声明 HDF5r 属性数据类型:在 R 和 Python 之间传输数据
- python - 基于逻辑条件将数值转换为字符串值的问题