如何过滤数组并将值添加到状态
How to filter an array and add values to a state
我的当前状态为:
const [data, setData] = useState([
{ id: 1, name: "One", isChecked: false },
{ id: 2, name: "Two", isChecked: true },
{ id: 3, name: "Three", isChecked: false }
]);
我通过状态映射并在 div 中显示数据,并调用 onClicked 函数在单击时切换 isChecked
值:
const clickData = index => {
const newDatas = [...data];
newDatas[index].isChecked = !newDatas[index].isChecked;
setData(newDatas);
const newSelected = [...selected];
const temp = datas.filter(isChecked==true) // incomplete code, struggling here.
const temp = datas.isChecked ?
};
我有另一个空状态,叫做 clicked:
const[clicked, setClicked] = setState([])
。我想将所有 isChecked 为 true 的对象从 datas 数组添加到此数组。我该怎么做?
假设您以类似的方式遍历数据:
{data.map((obj, index) => <div key={index} onClick={handleClick}>{obj.name}</div>}
您可以添加一个数据属性,在其中为该元素分配选中的值,如下所示:
{data.map((obj, index) => <div key={index} data-checked={obj.isChecked} data-index={index} onClick={handleClick}>{obj.name}</div>}
由此,您现在可以在 handleClick
函数被调用时更新您的 isClicked
状态,例如:
const handleClick = (event) => {
event.preventDefault()
const checked = event.target.getAttribute("data-checked")
const index = event.target.getAttribute("data-index")
// everytime one of the elements get clicked, it gets added to isClicked array state if true
If (checked) {
let tempArr = [ ...isClicked ]
tempArr[index] = checked
setClicked(tempArr)
}
}
这将允许您在项目被点击时将它们一一添加到数组中,但是如果您希望一次点击添加所有真实值,那么您只需要编写 handleClick
如下:
const handleClick = (event) => {
event.preventDefault()
// filter data objects selecting only the ones with isChecked property on true
setClicked(data.filter(obj => obj.isChecked))
}
我很抱歉,因为我一直在 phone 打字,所以缩进有点偏离。希望这对您有所帮助!
为了您的理解,我只是添加了 checkBox 和 onChange 事件,而不是使用 div 和 onClick 事件
import React, { useState, useEffect } from "react";
import "./style.css";
export default function App() {
const [data, setData] = useState([
{ id: 1, name: "One", isChecked: false },
{ id: 2, name: "Two", isChecked: true },
{ id: 3, name: "Three", isChecked: false }
]);
const [clicked, setClicked] = useState([]);
const clickData = index => {
let tempData = data.map(res => {
if (res.id !== index) {
return res;
}
res.isChecked = !res.isChecked;
return res;
});
setClicked(tempData.filter(res => res.isChecked));
};
useEffect(() => {
setClicked(data.filter(res => res.isChecked));
}, []);
return (
<div>
{data.map((res, i) => (
<div key={i}>
<input
type="checkbox"
checked={res.isChecked}
key={i}
onChange={() => {
clickData(res.id);
}}
/>
<label>{res.name}</label>
</div>
))}
{clicked.map(({ name }, i) => (
<p key={i}>{name}</p>
))}
</div>
);
}
我的当前状态为:
const [data, setData] = useState([
{ id: 1, name: "One", isChecked: false },
{ id: 2, name: "Two", isChecked: true },
{ id: 3, name: "Three", isChecked: false }
]);
我通过状态映射并在 div 中显示数据,并调用 onClicked 函数在单击时切换 isChecked
值:
const clickData = index => {
const newDatas = [...data];
newDatas[index].isChecked = !newDatas[index].isChecked;
setData(newDatas);
const newSelected = [...selected];
const temp = datas.filter(isChecked==true) // incomplete code, struggling here.
const temp = datas.isChecked ?
};
我有另一个空状态,叫做 clicked:
const[clicked, setClicked] = setState([])
。我想将所有 isChecked 为 true 的对象从 datas 数组添加到此数组。我该怎么做?
假设您以类似的方式遍历数据:
{data.map((obj, index) => <div key={index} onClick={handleClick}>{obj.name}</div>}
您可以添加一个数据属性,在其中为该元素分配选中的值,如下所示:
{data.map((obj, index) => <div key={index} data-checked={obj.isChecked} data-index={index} onClick={handleClick}>{obj.name}</div>}
由此,您现在可以在 handleClick
函数被调用时更新您的 isClicked
状态,例如:
const handleClick = (event) => {
event.preventDefault()
const checked = event.target.getAttribute("data-checked")
const index = event.target.getAttribute("data-index")
// everytime one of the elements get clicked, it gets added to isClicked array state if true
If (checked) {
let tempArr = [ ...isClicked ]
tempArr[index] = checked
setClicked(tempArr)
}
}
这将允许您在项目被点击时将它们一一添加到数组中,但是如果您希望一次点击添加所有真实值,那么您只需要编写 handleClick
如下:
const handleClick = (event) => {
event.preventDefault()
// filter data objects selecting only the ones with isChecked property on true
setClicked(data.filter(obj => obj.isChecked))
}
我很抱歉,因为我一直在 phone 打字,所以缩进有点偏离。希望这对您有所帮助!
为了您的理解,我只是添加了 checkBox 和 onChange 事件,而不是使用 div 和 onClick 事件
import React, { useState, useEffect } from "react";
import "./style.css";
export default function App() {
const [data, setData] = useState([
{ id: 1, name: "One", isChecked: false },
{ id: 2, name: "Two", isChecked: true },
{ id: 3, name: "Three", isChecked: false }
]);
const [clicked, setClicked] = useState([]);
const clickData = index => {
let tempData = data.map(res => {
if (res.id !== index) {
return res;
}
res.isChecked = !res.isChecked;
return res;
});
setClicked(tempData.filter(res => res.isChecked));
};
useEffect(() => {
setClicked(data.filter(res => res.isChecked));
}, []);
return (
<div>
{data.map((res, i) => (
<div key={i}>
<input
type="checkbox"
checked={res.isChecked}
key={i}
onChange={() => {
clickData(res.id);
}}
/>
<label>{res.name}</label>
</div>
))}
{clicked.map(({ name }, i) => (
<p key={i}>{name}</p>
))}
</div>
);
}