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

Eni*_*lek 127 javascript reactjs

在React.js中,angular的$ watch函数等价是多少?

我想监听状态更改并调用类似getSearchResults()的函数.

componentDidMount: function() {
    this.getSearchResults();
}
Run Code Online (Sandbox Code Playgroud)

Der*_*ger 298

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

componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
Run Code Online (Sandbox Code Playgroud)

  • `componentWillUpdate`已被弃用:https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html (24认同)
  • 需要在另一个组件中的属性更新时触发一个方法(通过回调向上一个,通过道具向下一个),并在组件中添加"componentDidUpdate",其中prop是正确的处方.谢谢你. (5认同)
  • `componentWillUpdate` 已弃用。 (4认同)
  • 当收到新的 props 时,`componentDidUpdate` 是否也会触发,不一定只是在状态改变时触发? (2认同)

edo*_*lin 31

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

  1. 从普通父项传递处理程序(通过props)并让它们更新父项的状态,从而导致父项下面的层次结构被重新呈现.
  2. 或者,为了避免层次结构中的处理程序爆炸,您应该查看通量模式,它将您的状态移动到数据存储中,并允许组件监视它们的更改.该Fluxxor插件是管理这个非常有用的.

  • 但是当你需要获取使用(部分)状态作为url/a参数的远程数据时呢? (3认同)

Apr*_*ion 30

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

AngularJS:

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

<input ng-model="name" />
Run Code Online (Sandbox Code Playgroud)

反应:

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

<input value={name} onChange={e => setName(e.target.value)} />
Run Code Online (Sandbox Code Playgroud)


小智 28

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

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}
Run Code Online (Sandbox Code Playgroud)

  • componentWillReceiveProps已被弃用:https://reactjs.org/docs/react-component.html#unsafe_componentwillreceiveprops (4认同)

小智 20

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

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

    useEffect(() => {
        console.log(myState, '- Has changed')
    },[myState]) // <-- here put the parameter to listen
}
Run Code Online (Sandbox Code Playgroud)

  • 但我如何将它用于类组件呢? (10认同)
  • “useEffect”的这种用法本身总是会导致额外的渲染——有没有办法避免这种情况? (3认同)
  • @Philzen,如果您将依赖项数组作为“useEffect”的第二个参数传递(即上例中的[myState]),则仅当依赖项数组中的变量之一发生更改时,组件才会重新渲染。 (2认同)

小智 14

如果您使用像 这样的钩子const [ name , setName ] = useState (' '),您可以尝试以下操作:

 useEffect(() => {
      console.log('Listening: ', name);
    }, [name]);
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法获得 useEffect 的旧值?假设名称一开始是空的,然后我在其中输入 I,然后在 useEffect 中我会得到 i,但是如果我想获得先前的状态任何想法怎么办 (2认同)

Shi*_*pta 5

如上所述使用 useState 和 useEffect 是绝对正确的方法。但是,如果 getSearchResults 函数返回订阅,则 useEffect 应该返回一个负责取消订阅订阅的函数。useEffect 返回的函数将在每次更改依赖项(上例中的名称)之前和组件销毁时运行