【问题标题】:data won't refresh in the dom数据不会在 dom 中刷新
【发布时间】:2020-11-29 17:12:58
【问题描述】:

我的 useState 有问题,当我在我的 useState 中更新我的数据时,我的渲染中的数据没有改变

我的使用状态:

 const [data,setData] = useState(question.choices.reduce((prev,cur) => {
        prev[cur.uuid] = {
            uuid: cur.uuid,
            checked:false,
            qte:0,
            choicePoint:cur.choicePoints,
            name:cur.name
        }
        return prev
    },{} as Record<string,ICheckBox>));

我用它来显示我的数据:

 question.choices && question.choices.map(e => (
                    <div key={e.uuid}>
                     <Checkbox key={e.uuid} checked={data[e.uuid].checked} onClick={() => {handleCheckBox(e)}}>{e.name}</Checkbox>
                    </div>
                ))

还有我的函数 HandleCheckBox :

 const handleCheckBox = (choice:IChoice) =>{
        if(data[choice.uuid].checked == true){
            data[choice.uuid].checked = false;
        }else if((data[choice.uuid].checked == false)){
            data[choice.uuid].checked = true;
        }
    }

如果有人有想法,这个错误很奇怪我不明白为什么我的“选中”在我点击它时没有改变。

【问题讨论】:

    标签: reactjs typescript use-state


    【解决方案1】:

    你正在改变你的状态。这是一个突变:

    data[choice.uuid].checked = false;
    

    你不应该改变你的状态,你应该提供一个新的状态并用你的状态设置器函数设置它。这就是为什么你有一个setData

    function handleCheckbox(choice) {
      setData((prev) => ({
        ...prev,
        [choice.uid]: {
          checked: !prev[choice.uid].checked,
        },
      }));
    }
    

    【讨论】:

    • 我愿意:const d = data; if(d[choice.uuid].checked == true){ d[choice.uuid].checked = false; }else if((data[choice.uuid].checked == false)){ d[choice.uuid].checked = true; } setData(d); 也不工作,如果我关闭我的组件并重新打开它,我的复选框会被选中....
    • prev 表示先前(或某些使用当前名称)状态。我们在这里做一个functional update。你应该阅读所有关于 hooks API 的文档。你不需要这个if/else,你只是在切换值。尝试使用我的示例。另外,你还在改变你的状态。
    • prev 和 cur 仅在我使用 reduce 时才有效?,您的示例实际上不起作用...
    • reduce无关。每当您使用当前状态时,您都应该使用它。只需浏览文档即可。对于您的问题,沙箱将非常有用。你可以使用codesandbox
    【解决方案2】:
    const handleCheckBox = (choice:IChoice) =>{
            setData((prev) => ({
                ...prev,
                [choice.uuid]: {
                    checked: !prev[choice.uuid].checked,
                }
            } as Record<string,ICheckBox>));
          }
    

    是正确的方法,谢谢 devserkan

    【讨论】:

    • 欢迎您,但您不需要自己再次提供答案 :) 您已经接受了我的,这是正确的方式。
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 2021-07-15
    • 2012-08-09
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多