Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React从数组状态删除项不会重新渲染_Javascript_Reactjs - Fatal编程技术网

Javascript React从数组状态删除项不会重新渲染

Javascript React从数组状态删除项不会重新渲染,javascript,reactjs,Javascript,Reactjs,我需要从我的数组状态中删除一个项,但它不能按我需要的方式工作。我从服务器的详细信息obj中获取状态,并将其保存到name。它是一个对象数组 const [name, setName] = useState( [...details?.name] || [] ); 我的添加功能可根据需要工作: const addName = () => { nameForm.validateFields().then(values => { setName([...nam

我需要从我的数组状态中删除一个项,但它不能按我需要的方式工作。我从服务器的详细信息obj中获取状态,并将其保存到
name
。它是一个对象数组

const [name, setName] = useState(
    [...details?.name] || []
);
我的添加功能可根据需要工作:

const addName = () => {
    nameForm.validateFields().then(values => {
      setName([...name, values]);
      nameForm.resetFields();
      setModalVisible(false);
    });
 };
但是,remove函数不起作用。在第一次调用函数时,我可以工作,但每次再次调用该函数时,它都使用名称状态的初始声明。例如,如果数组的大小为4,则第一次调用将删除一个元素,该元素的大小为3。如果我再次调用该函数,名称仍然是大小4

const removeName = (obj) => {
    setName([...name.filter(i => i !== obj)]);
};

您不能使用
来比较对象==操作员。相反,您需要比较对象的一些属性。您没有说明对象具有哪些属性,但假设它们具有id属性:

setName([...name.filter(i => i.id !== obj.id)]);

将起作用。

您无法使用
比较对象==操作员。相反,您需要比较对象的一些属性。您没有说明对象具有哪些属性,但假设它们具有id属性:

setName([...name.filter(i => i.id !== obj.id)]);

会有用的。

我试过了,但运气不好。问题是项目确实被删除了,但它从原始状态而不是新状态中删除了它。原始状态是什么意思?如果你在Chrome中使用react-dev工具,你看到状态被更新了吗?我试过了,但没有成功。问题是项目确实被删除了,但它从原始状态而不是新状态中删除了它。原始状态是什么意思?如果您在Chrome中使用react-dev工具,您是否看到状态正在更新?