【问题标题】:React hooks state not updating when mapping映射时反应挂钩状态未更新
【发布时间】:2021-03-02 22:53:26
【问题描述】:

当用户单击它们时,我正在尝试更新一行按钮。我将按钮存储在我映射的状态中。当我 console.log 我可以看到网格状态发生变化,但它不会重新呈现我的按钮。我哪里错了?

const Step = ({ active, changeGridByVal, val }) => {
  return <>
    <button onClick={() => changeGridByVal(val)}>{active ? 'X' : 'O'}</button>
  </>
}

const TryPage = () => {

  const [grid, setGrid] = useState([
    ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
  ])

  function changeGridByVal(val){
    const note = val[0]
    const step = val.substring(2)
    const copy = grid
    copy[note][step] = 'X'
    setGrid(copy)
    console.log(grid)
  }
  
  return <> 
    {grid[0].map((e, i) => {
      return <Step key={i} val={`0-${i}`} changeGridByVal={changeGridByVal} active={e === '' ? false : true}></StepNote>
    })}
    </>
}

【问题讨论】:

    标签: reactjs react-hooks state


    【解决方案1】:
      function changeGridByVal(val){
        const note = val[0]
        const step = val.substring(2)
        const copy = grid
        copy[note][step] = 'X'
        setGrid(copy)
        console.log(grid)
      }
    

    copy 实际上不是副本,它是原始数组,只是名称不同。当你设置状态时,react 在新旧状态之间做一个 === 并看到它们是同一个数组,所以它不会重新渲染。

    相反,您需要创建一个新数组,这意味着在您更改的每个级别都制作一个副本:

    function changeGridByVal(val){
        const note = val[0]
        const step = val.substring(2)
        const copy = [...grid];
        copy[note] = [...grid[note]];
        copy[note][step] = 'X';
        setGrid(copy)
      }
    

    【讨论】:

    【解决方案2】:

    尽管您创建了状态数组的“副本”,但您正在直接改变状态。但坦率地说,如果我正确地理解了您的小应用程序,还有一种更简单的方法可以将它们组合在一起。

    您似乎只是想在 O 和 X 之间切换按钮。我希望您这样做:

    import { useState } from "react";
    
    const Step = ({ active, changeGridByVal, index }) => (
      <button onClick={() => changeGridByVal(index)}>{active ? "X" : "O"}</button>
    );
    
    const TryPage = () => {
      const [grid, setGrid] = useState([["O", "O", "O", "O", "O", "O"]]);
    
      const changeGridByVal = (index) => {
        setGrid([
          grid[0].map((btn, i) => {
            if (index === i) return btn === "O" ? "X" : "O";
            else return btn;
          })
        ]);
      };
    
      return (
        <>
          {grid[0].map((e, i) => {
            return (
              <Step
                key={i}
                index={i}
                changeGridByVal={changeGridByVal}
                active={e !== "O"}
              ></Step>
            );
          })}
        </>
      );
    };
    
    export default TryPage;
    

    沙盒:https://codesandbox.io/s/admiring-worker-hoxyg?file=/src/App.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 2021-10-23
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多