Почему объект состояния в react не обновляется должным образом? Развернутая и свернутая версии объекта различаются

#javascript #reactjs

#javascript #reactjs

Вопрос:

Вот картинка того, что я получаю на консоли <br><br>
Вот изображение того, что я получаю на консоли в Chrome

Я использую React.js , а объект, показанный на изображении, является элементом массива, который является частью объекта состояния. Я не понимаю, что происходит. Объект показывает, чего от него ожидают при сворачивании. Но когда я разворачиваю его с помощью кнопки со стрелкой вправо, расширенная версия объекта выдает этот результат. Кто-нибудь может, пожалуйста, сказать мне, что здесь происходит? Я хочу уточнить, что я не использовал setState для обновления состояния до этого состояния, так как хотел убедиться, что избегаю повторного рендеринга.

вот код для того, что я сделал, чтобы обновить состояние

 if (this.props.currentNumberingScheme === 'a') {
  var edge = this.state.edgeList[i];
  edge.from.data = String.fromCharCode(parseInt(edge.from.data)   64);
  edge.to.data = String.fromCharCode(parseInt(edge.to.data)   64);
  console.log('GRAPH: updated edge', edge.from.data, edge.to.data);
  console.log('GRAPH: updated edge', this.state.edgeList[0].from.data, this.state.edgeList[0].to.data);
  console.log('GRAPH: transformed edge list', this.state.edgeList[0].from);
  console.log('GRAPH: updated edge', this.state.edgeList[0].from.data, this.state.edgeList[0].to.data);
}
 

когда я регистрирую edge.from.data и edge.to.data , вывод на самом деле является ‘A’ и ‘B’ (как и ожидалось). когда я регистрируюсь this.state.edgeList[0].from , происходит явление, показанное на изображении. Кто-нибудь может, пожалуйста, уточнить??

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

1. Не могли бы вы добавить код к тому, что вы делаете?

Ответ №1:

Я бы рекомендовал ознакомиться с документами о состоянии реакции. Хотя на этой странице явно не рассматривается проблема, с которой вы столкнулись.

Проблема в том, что вы определяете переменную edge this.state примерно так:

 var edge = this.state.edgeList[i];
edge.from.data = String.fromCharCode(parseInt(edge.from.data) 64);
edge.to.data = String.fromCharCode(parseInt(edge.to.data) 64);
 

Эти вторые две строки изменяют edge объект, но не обновляются this.state с их измененными значениями. Поэтому, когда вы входите edge.from.data в систему и edge.to.data видите правильные значения, но когда вы регистрируете this.state.edgeList[0].from свои отображаемые данные, они не были обновлены.

Опять же, это связано с тем, что при изменении возвращаемый из this.state него объект не изменяется this.state .

Если вам действительно требуется объект с прямой изменчивостью, который не повторяется при изменении, вы, вероятно, могли бы использовать ref . Но, скорее всего, вам следует просто использовать обычный старый объект.