Представление не обновляется при изменении данных, реагирует,js

#javascript #reactjs #jsx

Вопрос:

Я новичок в реагировании, я программирую функцию onAdd() , когда я вызываю ее, она должна добавить элемент state , а затем я обновляю крючок новым элементом setBooks(state) .

 const state = {
  books: [
    { id: 0, rating: 4, title: "Harry Potter y el cáliz de fuego", image: "libro01.jpg"},
    { id: 1, rating: 3, title: "The shining", image: "libro02.jpg" },
    { id: 2, rating: 5, title: "Código Da Vinci", image: "libro03.jpg" },
    { id: 3, rating: 5, title: "El principito", image: "libro04.jpg" },
    { id: 4, rating: 5, title: "Sobrenatural", image: "libro05.jpg" },
  ],
  copyBooks: []
};

function App() {

  const [books, setBooks] = useState(state);

  const onAdd = (item)=>{
    //add new item to books
    console.log('Add: ', item);
    const id = state.books[state.books.length-1].id  ;
    item['id'] = id;
    state.books.push(item);
    setBooks(state);
  }

  return (
    <div className="App">
      <Menu onadd={onAdd}/>
      <List items={books.books}/>
    </div>
  );
}
 

это прекрасно работает внутри, я печатаю объект «книги», и он обновлен.
Когда я пытаюсь распечатать данные дочернего <List /> компонента, они не печатаются, пока я не внесу изменения на сервере и они не будут обновлены.
Я пришел к выводу, что проблема в том, что компонент списка <List /> не обновляется.

books относится к крючкам и books.books к данным.

Я не знаю, как я могу это решить, я знаю, что это что-то базовое, но я начинаю с этой технологии.

Ответ №1:

Ваша onAdd функция изменяет состояние, то есть React видит ту же ссылку на объект, что и раньше, и не будет обновляться. Чтобы убедиться, что произойдет обновление, скопируйте массив и установите состояние новой копии:

 const onAdd = (item) => {
  //add new item to books
  console.log('Add: ', item);
  const id = state.books[state.books.length-1].id   1;
  item['id'] = id;
  const newBooks = [...state.books, item];
  setBooks({ ...state, books: newBooks });
}
 

Правка: кстати, я мог бы порекомендовать несколько менее запутанную терминологию при именовании переменных. Локальная books переменная фактически ссылается на все состояние, а затем books.books ссылается на фактические книги… это приведет к ошибкам, потому что это очень запутанно.

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

1. Большое вам спасибо, это уже работает. Вы правы, я должен переименовать эти запутанные переменные.