如何在react.js中监听状态变化?


Answers:


37

我没有使用过Angular,但是阅读了上面的链接,看来您正在尝试为不需要处理的内容编写代码。您对React组件层次结构中的状态进行更改(通过this.setState()),React将导致您的组件重新呈现(有效地“侦听”更改)。如果要从层次结构中的另一个组件“监听”,则有两个选择:

  1. 将处理程序从公共父级传递下来(通过props),并让它们更新父级的状态,从而导致父级下面的层次结构被重新呈现。
  2. 另外,为避免处理程序在层次结构中层叠泛滥,您应该查看流通模式,该模式将您的状态移动到数据存储中,并允许组件监视它们的更改。该Fluxxor插件是管理这个非常有用的。

3
但是,当您需要获取使用状态(一部分)作为url /参数的远程数据时,该怎么办呢?
RnMss '16

@RnMss-查看redux和reducers(redux.js.org/docs/basics/Reducers.html),然后重新选择(github.com/reactjs/reselect)。
edoloughlin

320

状态更改时,将调用以下生命周期方法。您可以使用提供的参数和当前状态来确定是否有意义的更改。

componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)

5
当另一个组件中的属性被更新时需要触发一个方法(通过回调向上一个属性,通过prop向下一个属性),并且使用prop添加componentDidUpdate该组件是正确的处方。谢谢你
基思DC

我认为这是保证状态更改通知的最佳方法,这是OP要求的。但是请注意,如果您在shouldComponentUpdate中否决了更新,则状态更改后,这些方法都不会触发。
MidnightJava

28

1
componentDidUpdate不会在收到新道具时也不会开火,不一定只是在状态改变时开火?
安迪·麦卡洛(Andy mccullough)

1
componentWillUpdate不推荐使用。
肖恩

29

我认为您应该在“组件生命周期”下使用,就像您有一个输入属性,该属性在更新时需要触发您的组件更新一样,这是最好的选择,因为它将在渲染之前被调用,甚至可以将组件状态更新为反映在视图上。

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}

6
componentWillReceiveProps已被弃用:reactjs.org/docs/...
约翰Skoumbourdis

14

从2019年使用useStateuseEffect Hooks的React 16.8 开始,以下内容等效(在简单情况下):

AngularJS:

$scope.name = 'misko'
$scope.$watch('name', getSearchResults)

<input ng-model="name" />

反应:

const [name, setName] = useState('misko')
useEffect(getSearchResults, [name])

<input value={name} onChange={e => setName(e.target.value)} />

2

如上所述,将useState与useEffect一起使用绝对是正确的方法。但是,如果getSearchResults函数返回预订,则useEffect应该返回一个负责取消预订的函数。从useEffect返回的函数将在每次更改依赖项(在上述情况下为名称)之前运行,并且在组件销毁之前运行


1

已经有一段时间了,但供以后参考:可以使用shouldComponentUpdate()方法。

更新可能是由于道具或状态的更改引起的。重新渲染组件时,将按以下顺序调用这些方法:

static getDerivedStateFromProps() 
shouldComponentUpdate() 
render()
getSnapshotBeforeUpdate() 
componentDidUpdate()

参考:https : //reactjs.org/docs/react-component.html


您必须从中返回一个布尔值,shouldComponentUpdate因此它可能不适用于此用例。
肖恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.