从数组中删除项目 - Parent Child - React Hooks
Removing item from array - Parent Child - React Hooks
我正在尝试从数组中删除一个项目。
一个简单的例子,parent 创建了 children 的数组。
const Parent = () => {
const [content, setContent] = useState([]);
useEffect(() => {});
const addContent = event => {
setContent(content => content.concat(
<Child key={content.length} id={content.length} removeItem={(id) => removeContent(id)}/>
));
}
function removeContent (id) {
setContent(content.slice(id, 0));
}
return(
<div onClick={(event) => addContent(event)}>
{content}
</div>
)
}
Child 有一个删除按钮。
const Child = ({id, removeItem}) => {
remove = event => {
removeItem(id);
}
return(
<button onClick={(event) => remove(event)}>
Remove
</button>
)
}
问题
假设我在数组中创建了 4 children:
[0: {child1}, 1: {child2}, 2: {child3}, 3: {child4}]
我将通过单击 child2 的删除按钮删除 child3(索引 2)。
它转到我的 parent removeContent,但我的数组如下所示:
[0: {child1}, 1: {child2}]
这会删除我的整个数组。有谁知道为什么?
发生这种情况是因为您正在使用切片删除项目。您的切片采用两个值,第一个是开始,另一个是结束。您从 id 索引开始并删除右侧的所有内容,然后转到第 0 个索引。所以你所有的项目都被从头到尾删除了。
arr.slice([开始[ 结束]])
从数组中删除项目的更好解决方案是使用 Array.filter 方法。
// 从现有数组中删除选定数组索引的函数。
const removeSelectedItem = (arr, index) => {
return arr.filter((el, i) => index !== i)
}
此函数将从数组中删除所选项目。
arr -> 你的数组。
index -> 要删除的项目的索引。
希望这能回答您的问题。
您的代码几乎没有问题 :
1) 您正在收听 add/remove 单击这两个事件
<div onClick={(event) => addContent(event)}> // <---- listening to add
// Arry of child which has remove , so on click it will trigger both remove and add (for parent)
{content}
// so
</div>
// {content} should be out side of that div
2) slice
return new sub array, slice of array 它不会提供带有删除 id 的数组,而不是你可以使用过滤器(带id)或拼接(带索引)
3) 你不应该在你的状态中存储 jsx ( Do Read )
工作片段:
您可以运行下面的代码片段并查看代码更改。
const { useState , useEffect } = React;
const Child = ({id, index, removeItem}) => {
return(
<button onClick={() => removeItem(index)}>
{id} - Remove
</button>
)
}
var contentId = 0;
const Parent = () => {
const [content, setContent] = useState([]);
useEffect(() => {});
const addContent = event => {
contentId++;
setContent(content => [...content , contentId]);
}
function removeContent (index) {
let clone = [...content]
clone.splice(index, 1)
setContent(clone);
}
return(<div>
<div onClick={(event) => addContent(event)}>
Add Content
</div>
{
content.map((id,i) =>
<Child key={id} id={id} index={i} removeItem={removeContent}/>
)
}
</div>
)
}
ReactDOM.render(<Parent />, document.getElementById('react-root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react-root"></div>
我正在尝试从数组中删除一个项目。
一个简单的例子,parent 创建了 children 的数组。
const Parent = () => {
const [content, setContent] = useState([]);
useEffect(() => {});
const addContent = event => {
setContent(content => content.concat(
<Child key={content.length} id={content.length} removeItem={(id) => removeContent(id)}/>
));
}
function removeContent (id) {
setContent(content.slice(id, 0));
}
return(
<div onClick={(event) => addContent(event)}>
{content}
</div>
)
}
Child 有一个删除按钮。
const Child = ({id, removeItem}) => {
remove = event => {
removeItem(id);
}
return(
<button onClick={(event) => remove(event)}>
Remove
</button>
)
}
问题
假设我在数组中创建了 4 children:
[0: {child1}, 1: {child2}, 2: {child3}, 3: {child4}]
我将通过单击 child2 的删除按钮删除 child3(索引 2)。
它转到我的 parent removeContent,但我的数组如下所示:
[0: {child1}, 1: {child2}]
这会删除我的整个数组。有谁知道为什么?
发生这种情况是因为您正在使用切片删除项目。您的切片采用两个值,第一个是开始,另一个是结束。您从 id 索引开始并删除右侧的所有内容,然后转到第 0 个索引。所以你所有的项目都被从头到尾删除了。
arr.slice([开始[ 结束]])
从数组中删除项目的更好解决方案是使用 Array.filter 方法。
// 从现有数组中删除选定数组索引的函数。
const removeSelectedItem = (arr, index) => {
return arr.filter((el, i) => index !== i)
}
此函数将从数组中删除所选项目。 arr -> 你的数组。 index -> 要删除的项目的索引。
希望这能回答您的问题。
您的代码几乎没有问题 :
1) 您正在收听 add/remove 单击这两个事件
<div onClick={(event) => addContent(event)}> // <---- listening to add
// Arry of child which has remove , so on click it will trigger both remove and add (for parent)
{content}
// so
</div>
// {content} should be out side of that div
2) slice
return new sub array, slice of array 它不会提供带有删除 id 的数组,而不是你可以使用过滤器(带id)或拼接(带索引)
3) 你不应该在你的状态中存储 jsx ( Do Read )
工作片段:
您可以运行下面的代码片段并查看代码更改。
const { useState , useEffect } = React;
const Child = ({id, index, removeItem}) => {
return(
<button onClick={() => removeItem(index)}>
{id} - Remove
</button>
)
}
var contentId = 0;
const Parent = () => {
const [content, setContent] = useState([]);
useEffect(() => {});
const addContent = event => {
contentId++;
setContent(content => [...content , contentId]);
}
function removeContent (index) {
let clone = [...content]
clone.splice(index, 1)
setContent(clone);
}
return(<div>
<div onClick={(event) => addContent(event)}>
Add Content
</div>
{
content.map((id,i) =>
<Child key={id} id={id} index={i} removeItem={removeContent}/>
)
}
</div>
)
}
ReactDOM.render(<Parent />, document.getElementById('react-root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react-root"></div>