Reactjs React组件的替代品DidReceiveProps

Reactjs React组件的替代品DidReceiveProps,reactjs,react-lifecycle,Reactjs,React Lifecycle,我正在创建一个聊天应用程序,我有一个名为ChatBox的组件。当用户点击聊天频道时,ChatBox订阅WebSocket。现在,这是在构造函数中完成的。问题是,我现在需要让用户更改频道,但当道具更改时,不会调用构造函数。我可以使用componentDidUpdate,但我必须在每次渲染时将我的道具与旧道具进行比较,这非常不方便 TL;DR:当我的道具被更换时,我需要做点什么。我找到了一个名为componentDidReceiveProps的方法,它非常适合我的情况!但令人遗憾的是,React说这

我正在创建一个聊天应用程序,我有一个名为ChatBox的组件。当用户点击聊天频道时,ChatBox订阅WebSocket。现在,这是在构造函数中完成的。问题是,我现在需要让用户更改频道,但当道具更改时,不会调用构造函数。我可以使用componentDidUpdate,但我必须在每次渲染时将我的道具与旧道具进行比较,这非常不方便

TL;DR:当我的道具被更换时,我需要做点什么。我找到了一个名为componentDidReceiveProps的方法,它非常适合我的情况!但令人遗憾的是,React说这种方法是一种不好的做法,他们不赞成这种做法:

我们学到的最大教训之一是我们的一些遗产 组件生命周期倾向于鼓励不安全的编码实践。。。这些生命周期方法通常 被误解和微妙的误用


我的问题是:产生相同行为的正确方法是什么。检查相关道具是否已更改,如果已更改,请更新插座或执行任何其他需要的操作

componentDidUpdate(prevProps) {
  if (this.props.channel !== prevProps.channel) {
    // do stuff
  }
}
但我必须在每次渲染时将我的道具与我的旧道具进行比较,这非常不方便


是的,您确实需要检查正确的道具是否已更改。您必须使用componentWillReceiveProps来完成此操作。

使用
ComponentDidupDate
。检查相关道具是否已更改,如果已更改,请更新插座或执行任何其他需要的操作

componentDidUpdate(prevProps) {
  if (this.props.channel !== prevProps.channel) {
    // do stuff
  }
}
但我必须在每次渲染时将我的道具与我的旧道具进行比较,这非常不方便


是的,您确实需要检查正确的道具是否已更改。您还必须使用componentWillReceiveProps来执行此操作。

这可以使用挂钩进行复制。如果将依赖项数组设置为包含要查找的道具,则它将仅在该道具更改时运行

为此,您需要将其转换为功能组件,而不是基于类的组件

例如:

import React from 'react'

Function ComponentName(props){
  React.useEffect(() => {
    // Code inside here will run when anything in the dependency array changes
  }, [prop.propName])  //<---Dependency array.  Will watch the prop named "propName" and run the code above if it changes.

  return (
    //Your JSX
  )
}
从“React”导入React
功能组件名称(props){
React.useffect(()=>{
//当依赖项数组中的任何内容发生更改时,此处的代码将运行

},[prop.propName])/可以使用钩子复制此属性。如果将依赖项数组设置为包含要查找的属性,则它将仅在该属性更改时运行

为此,您需要将其转换为功能组件,而不是基于类的组件

例如:

import React from 'react'

Function ComponentName(props){
  React.useEffect(() => {
    // Code inside here will run when anything in the dependency array changes
  }, [prop.propName])  //<---Dependency array.  Will watch the prop named "propName" and run the code above if it changes.

  return (
    //Your JSX
  )
}
从“React”导入React
功能组件名称(props){
React.useffect(()=>{
//当依赖项数组中的任何内容发生更改时,此处的代码将运行
},[prop.propName])//