不改变状态的react过滤器方法

IT技术 javascript reactjs ecmascript-6 setstate
2021-05-03 16:53:09

我目前的状态是这样的:

state = { items : [{id: 1, text: 'test words'}, {id: 2, text: 'another test'}]

这是我从数组中删除对象的函数,试图避免改变状态。

handleRemove(passedInId) {

  const myItems = this.state.items

  const newArray = myItems.filter(item => item.id !== passedInId)

  this.setState(prevState => ({
    items: prevState.items = newArray
  }))

  console.log('handle remove runned', passedInId, myItems, newArray)

}

它运行良好,但想知道在继续我的生活之前它是否不是反模式

非常感谢!!

2个回答

您的功能几乎是正确的,并且您的想法是正确的。在您的情况下,您不需要使用带有 mutator 函数的 setState 版本,而只需执行以下操作:

handleRemove(passedInId) {

  const myItems = this.state.items

  const newArray = myItems.filter(item => item.id !== passedInId)

  this.setState({
    items: newArray
  })

  console.log('handle remove runned', passedInId, myItems, newArray)

}

老实说,这很简单,一个班轮就可以做到:

handleRemove(passedInId) {
  this.setState({items: this.state.items.filter(item => item.id !== passedInId)})
}

这是一种反模式。React 处理状态更改,您的对象不会发生变异。这就是 setState 的用途。我猜你不想更新你的状态以避免重新渲染你的组件。您可以创建一个类变量并根据需要更新它,而无需触发重新渲染。像这样的东西:

class MyComponent extends React.Component {
  constructor(props) {
    this.state = {};
    this.items = [{id: 1, text: 'test words'}, {id: 2, text: 'another test'}];
  }

  handleRemove(passedInId) {
    this.items = this.items.filter(item => item.id !== passedInId)
  }
}