Reactjs 反应-如何使用动态属性更新状态,而不首先在状态中定义它?
我在下面做的方式不起作用:Reactjs 反应-如何使用动态属性更新状态,而不首先在状态中定义它?,reactjs,Reactjs,我在下面做的方式不起作用: const [number, setNumber] = React.useState({}) 要使其正常工作,唯一的方法是按以下方式定义属性: setNumber(prevNumber => ({ ...prevNumber, [num]: (prevNumber[num] + 1) || 0, })) 我不知道我将拥有多少属性(例如1-5或1-10),也不想预先定义所有属性。任何帮助都会很好。多谢各位 更新:“完整代码”: const [nu
const [number, setNumber] = React.useState({})
要使其正常工作,唯一的方法是按以下方式定义属性:
setNumber(prevNumber => ({
...prevNumber,
[num]: (prevNumber[num] + 1) || 0,
}))
我不知道我将拥有多少属性(例如1-5或1-10),也不想预先定义所有属性。任何帮助都会很好。多谢各位
更新:“完整代码”:
const [number, setNumber] = React.useState({
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
})
//我得到的是:{4:4,5:1}
//如果我有initialState,我想要得到的是:{1:0,2:0,3:0,4:4,5:1}
常数审查=[
{片名:“电影1”,评级:4},
{片名:“电影2”,评级:5},
{片名:“电影3”,评级:4},
{片名:“电影4”,评级:4},
{标题:“电影4”,评级:4}
];
函数App(){
const[number,setNumber]=useState({1:0,2:0,3:0,4:0,5:0});
常量func=(num)=>{
setNumber((prevNumber)=>({
…以前的数字,
[num]:(prevNumber[num]| | 0)+1 | | 0
}));
};
常量getNumbers=()=>{
返回评论。映射((评论)=>{
func(审查、评级);
});
};
控制台日志(“编号:”,编号);
返回(
希洛
);
}
prevNumber[num]可能未定义,因此您需要对此进行回退
试试这个:
[num]:((prevNumber[num]| | 0)+1)| | 0,
在澄清了您的需求之后,这里是一个更新的
因为您没有4以下的数字,所以它们永远不会被设置,因为num永远不会是1
因此,您需要检查下面的数字是否已经存在,如果没有,请用0填充
// what i get is:{4: 4, 5: 1}
//what I wanted and get if i have initialState is: {1: 0, 2: 0, 3: 0, 4: 4, 5: 1}
const reviews = [
{ title: "movie1", rating: 4 },
{ title: "movie2", rating: 5 },
{ title: "movie3", rating: 4 },
{ title: "movie4", rating: 4 },
{ title: "movie4", rating: 4 }
];
function App() {
const [number, setNumber] = useState({ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 });
const func = (num) => {
setNumber((prevNumber) => ({
...prevNumber,
[num]: (prevNumber[num] || 0) + 1 || 0
}));
};
const getNumbers = () => {
return reviews.map((review) => {
func(review.rating);
});
};
console.log("number: ", number);
return (
<div>
<button onClick={getNumbers}>helo</button>
</div>
);
}
这将获取当前的数字,并在将增加的数字上添加一个。
它创建一个具有较小数字的数组,并检查这些数字是否已经存在,若不存在,则用0填充
{0:0,1:0,2:0,3:0,4:4,5:1}
如果您遇到“类型”问题,只需将状态变量定义为“任意”。const[number,setNumber]=React.useState({}),但请记住:使用“any”类型不是一个好的实践,必须避免。实际上,它是有效的,我不再出错,但回退并不能完全有效。如果prevNumber[num]未定义,它将保持未定义状态,在这种情况下它将不会为0,除非我在state中再次将其预定义为0。因此,如果您使用此代码,并使用num=1调用它,那么之后1将不会为1?我更新了我的问题,并添加了更多代码,使其更清晰。这是一本书。并且您不必在rating对象中声明任何要更新的内容。我不知道你为什么认为这可以解决你的问题。你确定你正在用({})向useState添加一个空的obejct,但是在小提琴中它也不起作用,或者我不清楚我想要什么。在i fiddle中,仅显示属性4和5(具有值的属性),其他属性不显示。我希望值为0的其他对象不被忽略,也不理解为什么会发生这种情况,因此,我希望有{1:0,2:0,3:0,4:16,5:4},而不是现在的{“4:16”,如果y评论没有5个对象,但假设有10个对象,它将上升到10个
const lowerNumbers = Array.from(Array(num)).reduce((aggregate,_,i) => {
aggregate[i] = aggregate[i] || 0
return aggregate
}, {
...prevNumber,
[num]: (prevNumber[num] || 0) + 1
})
return lowerNumbers
});