我似乎有问题将数据推入一个状态数组。 我正试图以这种方式实现它:
this.setState({ myArray: this.state.myArray.push('new value') })
但我相信这是不正确的方式,并导致问题的可变性?
我似乎有问题将数据推入一个状态数组。 我正试图以这种方式实现它:
this.setState({ myArray: this.state.myArray.push('new value') })
但我相信这是不正确的方式,并导致问题的可变性?
当前回答
你可以使用.concat方法创建包含新数据的数组副本:
this.setState({ myArray: this.state.myArray.concat('new value') })
但是要注意.concat方法在传递数组-[1,2]时的特殊行为。concat(“foo”3,'酒吧')将导致(1、2、“foo”,3,'酒吧']。
其他回答
这条准则对我很有用:
fetch('http://localhost:8080')
.then(response => response.json())
.then(json => {
this.setState({mystate: this.state.mystate.push.apply(this.state.mystate, json)})
})
如果你使用:
const[myArr, setMyArr] = useState([]);
添加:
setMyArr([...myArr, value]);
至于移除:
let index = myArr.indexOf(value);
if(index !== -1)
setPatch([...myArr.slice(0, index), ...myArr.slice(index, myArr.length-1)]);
数组push返回长度
this.state.myArray。push('new value')返回扩展数组的长度,而不是数组本身。array .prototype.push()
我猜您希望返回值是数组。
不变性
这似乎是React的行为:
千万不要变异。直接调用setState() 替换您所做的突变。对待这个问题。就像它是那样的状态 immutable.React.Component。
我猜,你会这样做(不熟悉React):
var joined = this.state.myArray.concat('new value');
this.setState({ myArray: joined })
绝不建议直接改变状态。
在以后的React版本中,推荐的方法是在修改状态时使用updater函数来防止竞争条件:
将字符串推到数组的末尾
this.setState(prevState => ({
myArray: [...prevState.myArray, "new value"]
}))
将字符串推到数组的开头
this.setState(prevState => ({
myArray: ["new value", ...prevState.myArray]
}))
将对象推到数组的末尾
this.setState(prevState => ({
myArray: [...prevState.myArray, {"name": "object"}]
}))
将对象推到数组的开头
this.setState(prevState => ({
myArray: [ {"name": "object"}, ...prevState.myArray]
}))
你根本不应该管理这个国家。至少,不是直接的。如果你想要更新你的数组,你会想要这样做。
var newStateArray = this.state.myArray.slice();
newStateArray.push('new value');
this.setState(myArray: newStateArray);
直接处理状态对象是不可取的。你也可以看看React的不可变性帮助。
https://facebook.github.io/react/docs/update.html