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

IT技术 javascript reactjs
2021-04-15 10:48:23

React.js 中angular 的 $ watch函数等价于什么?

我想监听状态变化并调用像 getSearchResults() 这样的函数。

componentDidMount: function() {
    this.getSearchResults();
}
6个回答

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

componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
需要在另一个组件中的属性更新时触发一个方法(通过回调向上一个,通过 prop 向下一个),并且添加componentDidUpdate带有 prop 的组件是正确的处方。谢谢你。
2021-05-23 10:48:23
我认为这是保证状态更改通知的最佳方法,这正是 OP 所要求的。但请注意,如果您否决了 shouldComponentUpdate 中的更新,则这些方法都不会在状态更改后触发。
2021-05-29 10:48:23
componentWillUpdate 已弃用。
2021-05-29 10:48:23
componentDidUpdate接收新道具时是否也不会触发,不一定只是在状态改变时触发?
2021-06-05 10:48:23
2021-06-14 10:48:23

我没有使用过 Angular,但是阅读上面的链接,您似乎正在尝试为不需要处理的东西编写代码。您对 React 组件层次结构中的状态进行更改(通过 this.setState()),React 将导致您的组件重新渲染(有效地“监听”更改)。如果您想从层次结构中的另一个组件“收听”,那么您有两个选择:

  1. 从公共父级向下传递处理程序(通过props)并让它们更新父级的状态,从而导致父级下方的层次结构被重新渲染。
  2. 或者,为了避免在层次结构中级联处理程序的爆炸式增长,您应该查看通量模式,它将您的状态移动到数据存储中,并允许组件观察它们的变化。Fluxxor插件是管理这个非常有用的。
但是当您需要获取使用(部分)状态作为 url / 参数的远程数据时呢?
2021-05-22 10:48:23
接得好。redux解决它是正确的方法,尤其是对于大型项目和多团队开发。
2021-05-27 10:48:23
@RnMss - 查看 redux 和 reducers ( redux.js.org/docs/basics/Reducers.html ) 并重新选择 ( github.com/reactjs/reselect )。
2021-06-02 10:48:23

在 2020 年,您可以像这样使用 useEffect 钩子监听状态变化

export function MyComponent(props) {
    const [myState, setMystate] = useState('initialState')

    useEffect(() => {
        console.log(myState, '- Has changed')
    },[myState]) // <-- here put the parameter to listen
}
但是我如何将它用于类组件?
2021-06-16 10:48:23

自 2019 年的 React 16.8 使用useStateuseEffect Hooks以来,以下现在是等效的(在简单情况下):

AngularJS:

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

<input ng-model="name" />

react:

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

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

我认为您应该在 Component Lifecycle 下面使用,就好像您有一个输入属性在更新时需要触发您的组件更新那么这是最好的地方,因为它将在渲染之前被调用,您甚至可以更新组件状态反映在视图上。

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}
componentWillReceiveProps 已被弃用:reactjs.org/docs/...
2021-05-28 10:48:23