【问题标题】:Changing an array item creates an unlimited nested copy of itself?更改数组项会创建其自身的无限嵌套副本?
【发布时间】:2020-07-02 19:51:03
【问题描述】:

我尝试在输入字段中设置一个数字并使其保持状态。但是,当我尝试设置数组的状态时,它不会被填充,当我使用匿名函数尝试它时,它会创建类似

{
    "btm": {
        "btm": {
            "btm": {...}, 
            "top": 100}, 
        "top": 100}, 
    "top": 100
}

执行此操作的代码如下:

const Numbers = (props) => {
    const [numbers, setNumbers] = useState({"btm": "1", "top": "100"});
    
    const fromNumber = (n) => {
        console.log(numbers);
        setNumbers((n) => {
            const copy = numbers;
            copy["btm"] = n;
            return copy;
        });
    }

return (
            <>
                <input variant="toolbar-input" defaultValue={numbers["btm"]} onChange={e => fromNumber(e.target.value)} />
            </>
);
}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    当你使用 useState 时,你可以这样做:

    const Numbers = (props) => {
      const [numbers, setNumbers] = useState({ btm: "1", top: "100" });
    
      const fromNumber = (n) => {
        console.log(numbers);
        setNumbers({...numbers, btm: n});
      };
    
      return (
        <>
          <input
            variant="toolbar-input"
            defaultValue={numbers["btm"]}
            onChange={(e) => fromNumber(e.target.value)}
          />
        </>
      );
    };
    

    请注意,地图具有唯一键,因此您可以继续使用 ES6 扩展语法。

    【讨论】:

      【解决方案2】:

      您在这里覆盖了变量n

      const fromNumber = (n) => {
        console.log(numbers);
        setNumbers((n) => {
          const copy = numbers;
          copy["btm"] = n;
          return copy;
        });
      }
      

      这里n是从输入接收到的值:

      const fromNumber = (n) => {
      

      这里n是变量numbers之前的状态:

      setNumbers((n) => {
      

      因此,您将旧状态嵌套在新状态中。

      【讨论】:

      【解决方案3】:

      您在此处使用相同的变量名 - const fromNumber = (n) =&gt; {... 和此处为 setNumbers((n) =&gt; {...

      您也可以使用 ES6 传播语法并将状态更新功能转换为:

      setNumbers((prevNumbers) => ({
         ...prevNumbers,
         btm: n,
      }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2016-11-22
        • 1970-01-01
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多