Реагировать — дочерние элементы не повторяются

#reactjs

#reactjs

Вопрос:

Я довольно новичок в react и не понимаю, почему мои дочерние элементы не перерисовываются при изменении состояния. Все работает нормально, пока вы не нажмете кнопку добавления столбца. Это чертовски меняет состояние платы, и действительно, кажется, что плата перерисовывается, а столбцы — нет.

 const Board = function() {

  const [board, setBoard] = useState([]);

  useEffect(() => {
    console.log(boardJSON);
    setBoard(boardJSON.board);
  }, [])

  const addColumn = () => {
    console.log('addColumn');
    let inx = board.length   1;
    let col = {userId: 1, columnId: inx, header: 'Bob', cards: []};
    board.push(col);
    board[0].header = "Marge";
    let cardx = {"cardId": 4, "desc": "Break sound barrier", "status": "incomplete"};
    board[0].cards.push(cardx);
    board[1].cards[1].status = "destroyed";
    setBoard(board);
  };

  return (
    <div>
      <div className="board">
      {console.log("parent rerendering", board) // we get this far, but columns don't rerender          
      }
      {board.map((column) => (
        <Column key={column.columnId} column={column} />
        ))}
      </div>
      <button className="add-column-button" onClick={() => {addColumn()}}>
        <img src={plus_sm} />
        Add new column
      </button>
      {console.log("we got to the end", board) // did we get to the end?
      }
    </div>
  );
};

export default Board;
  

Вот что я получил на консоли. На экране после AddColumn ничего не меняется, и мы не получаем сообщений «rendering column». Кажется, что он просто пропускает переназначение.

 parent rerendering Array(0)
Board.js:42 we got to the end Array(0)
Board.js:11 Object
Board.js:31 parent rerendering Array(2)
Board.js:42 we got to the end Array(2)
Column.js:21 rendering column number 1
Column.js:21 rendering column number 2
Column.js:10 column rendering, props received Object
Column.js:10 column rendering, props received Object
Board.js:16 addColumn
Board.js:31 parent rerendering (3) [{…}, {…}, {…}]
Board.js:42 we got to the end (3) [{…}, {…}, {…}]
  

На случай, если вам интересно, это приложение для реагирования на dnd, но я удалил все dnd на случай, если это вызвало проблему. Этого не было.

Ответ №1:

Это потому, что вы изменяете состояние. Смотрите Эту ссылку о том, почему не следует изменять состояние реакции напрямую. Также посмотрите Этот пример, который я сделал, чтобы дать вам представление о том, что произойдет, если вы напрямую измените состояние.

В вашем случае это должно быть:

 const addColumn = () => {
    console.log('addColumn');
    let inx = board.length   1;
    let col = {userId: 1, columnId: inx, header: 'Bob', cards: []};

    const newBoardContent = [...board];

    newBoardContent.push(col);
    newBoardContent[0].header = "Marge";
    let cardx = {"cardId": 4, "desc": "Break sound barrier", "status": "incomplete"};
    newBoardContent[0].cards.push(cardx);
    newBoardContent[1].cards[1].status = "destroyed";
    setBoard(newBoardContent);
};
  

Комментарии:

1. Не знаю, как я это пропустил; отлично работает; большое спасибо.