Javascript 反应挂钩设置器不';阵列拼接后的t触发器重新加载
我有这样一个父组件:Javascript 反应挂钩设置器不';阵列拼接后的t触发器重新加载,javascript,reactjs,frontend,Javascript,Reactjs,Frontend,我有这样一个父组件: import React from "react"; import Test from "./Test"; function App() { const [configs, setConfigs] = React.useState([1, 2, 3]) return ( <div> {configs.map(((oneConfig, index) =>
import React from "react";
import Test from "./Test";
function App() {
const [configs, setConfigs] = React.useState([1, 2, 3])
return (
<div>
{configs.map(((oneConfig, index) =>
<Test
config={oneConfig}
remove={() => {
configs.splice(index, 1);
setConfigs(configs);
console.log(222)
}}
/>))
}
</div>
);
}
export default App;
我希望当我单击“deleteconfig[I]”标记时,相应的div
将被删除,但不是这样
在函数和控制台行开头的父组件中设置断点后,我发现在执行setConfigs
方法后,父组件没有重新呈现
知道为什么会这样吗?我如何实现从
configs
中删除元素的目标?问题在于remove
属性:
配置拼接(索引1);
splice
变异配置
状态,直接在React中变异状态是不允许的
尝试重写删除道具,如下所示:
remove={() => setConfigs(prev => {
let left = prev.slice(0, index); // Everything before configs[index]
let right = prev.slice(index + 1); // Everything after configs[index]
return [...left, ...right];
})}
这会将configs
状态设置为之前的状态,而没有单击其删除按钮的oneConfig
。控制台中是否有错误?如果您使用react developers工具,是否可以检查它是否确实已从州的configs
中删除?公平点。重写。非常感谢,很有效。在地图里移动真是一种糟糕的做法,但我找不到其他方法来做这项工作。我不会说它糟糕,只是要小心你在做什么。另一方面,请考虑在代码中设置<代码>键 PROP,因为您通过<代码> MAP< /代码>生成了它们的数组。像
这样的东西就可以了。
remove={() => setConfigs(prev => {
let left = prev.slice(0, index); // Everything before configs[index]
let right = prev.slice(index + 1); // Everything after configs[index]
return [...left, ...right];
})}