在组件状态下从arrays中移除元素
我正试图find在组件状态下从数组中移除元素的最佳方法。 由于我不应该直接修改this.state
variables,是否有更好的方法(更简洁)从数组中删除元素比我在这里?
onRemovePerson: function(index) { var newData = this.state.data.slice(); //copy array newData.splice(index, 1); //remove element this.setState({data: newData}); //update state },
谢谢。
你可以使用来自react-addons-update
的update()
不变性帮助器 ,它有效地做了同样的事情,但是你在做什么是好的。
this.setState({ data: update(this.state.data, {$splice: [[index, 1]]}) })
做到这一点,我见过的最干净的方法是filter
:
removeItem(index) { this.setState({ data: this.state.data.filter((_, i) => i !== index) }); }
我相信引用setState()
内的this.state
不鼓励https://facebook.github.io/react/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous
文档推荐使用带有callback函数的setState()
,以便在发生更新时在运行时传入prevState。 所以这就是它的样子:
使用不带ES6的Array.prototype.filter
removeItem : function(index) { this.setState(function(prevState){ return { data : prevState.data.filter(function(val, i) { return i !== index; })}; }); }
使用带有ES6箭头函数的Array.prototype.filter
removeItem(index) { this.setState((prevState) => ({ data: prevState.data.filter((_, i) => i !== index) })); }
使用不变性帮手
import update from 'immutability-helper' ... removeItem(index) { this.setState((prevState) => ({ data: update(prevState.data, {$splice: [[index, 1]]}) })) }
使用传播
function removeItem(index) { this.setState((prevState) => ({ data: [...prevState.data.slice(0,index), ...prevState.data.slice(index+1)] })) }
请注意,在每个实例中,无论使用this.setState()
技术, this.setState()
都会传递一个callback,而不是引用旧的this.state
;
这里是使用ES6扩展语法在状态中从数组中删除元素的一种方法。
onRemovePerson: (index) => { const data = this.state.data; this.setState({ data: [...data.slice(0,index), ...data.slice(index+1)] }); }
正如在上面ephrion的回答中所提到的那样,filter()可能会很慢,特别是对于大数组,因为它会循环查找已经确定的索引。 这是一个干净但低效的解决scheme。
作为替代,可以简单地“分割”所需的元素并连接片段。
var dummayArray = []; this.setState({data:dummyArray.concat(this.state.data.slice(0,index),this.state.data.slice(index))})
希望这可以帮助!
你可以使用这个函数,如果你想删除元素(没有索引)
removeItem(item) { this.setState(prevState => { data: prevState.data.filter(i => i !== item) }); }
我正在使用这个,希望它没有问题和帮助。
removeItem(item){ const index = this.state.yourArray.indexOf(item); if (index < 0 ) return this.state.yourArray.splice(index, 1) this.setState({yourArray: this.state.yourArray}) }
这是一个简单的方法来做到这一点:
removeFunction(key){ const data = {...this.state.data}; //Duplicate state. delete data[key]; //remove Item form stateCopy. this.setState({data}); //Set state as the modify one. }
希望能帮助到你!!!