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
  });