2016-05-25 2 views
12

Кажется, у меня возникают проблемы с нажатием данных в массив состояний. Я пытаюсь достичь это так:Правильный способ ввода в массив состояний

this.setState({ myArray: this.state.myArray.push('new value') }) 

Но я считаю, что это неправильный путь и вызывает проблемы с изменчивостью?

ответ

15

массив толчок возвращает длину

this.state.myArray.push('new value') возвращает длину расширенного массива, вместо самого массива.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push

Я думаю, вы ожидаете, что возвращаемое значение будет массив.

Неизменность

Кажется, это скорее поведение React:

НИКОГДА не мутировать this.state непосредственно, как вызов SetState() впоследствии может заменить мутацию вы сделали. Относитесь к this.state, как если бы это было неизменяемым.

https://facebook.github.io/react/docs/component-api.html

Я думаю, вы могли бы сделать это так (не знаком с React):

var joined = this.state.myArray.concat('new value'); 
this.setState({ myArray: joined }) 
+0

Добро пожаловать, Ответ от @Ginden может быть более удобным для вас, хотя. –

5

Вы можете использовать .concat метод для создания копии вашего массива с новыми данными:

this.setState({ myArray: this.state.myArray.concat('new value') }) 

Но остерегайтесь особого поведения метода .concat при передаче массивов - [1, 2].concat(['foo', 3], 'bar') приведет к [1, 2, 'foo', 3, 'bar'].

4

Вы не должны управлять состоянием вообще. По крайней мере, не напрямую. Если вы хотите обновить свой массив, вы захотите сделать что-то вроде этого.

var newStateArray = this.state.myArray.slice(); 
newStateArray.push('new value'); 
this.setState(myArray: newStateArray); 

Работа с объектом государства напрямую нежелательна. Вы также можете взглянуть на помощников по неизменности React.

https://facebook.github.io/react/docs/update.html

16

Использование ES6 это можно сделать так:

this.setState({ myArray: [...this.state.myArray, 'new value'] }) //simple value 
this.setState({ myArray: [...this.state.myArray, ...[1,2,3] ] }) //another array 

Spread syntax

+0

Я сделал то же самое, есть два случая, когда myArray может иметь значения, и это не будет. поэтому в этом случае, если он уже имеет значения, он работает отлично. Но ни в каких данных ... он не обновляет состояние с «новым значением». Любой солн? – Krina

+0

Он должен работать с любыми массивами, не имеет значения, имеет ли он значения или нет, он все равно будет разрушен. Может быть, в другом месте что-то не так. Не могли бы вы показать пример своего кода? –

Смежные вопросы