首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React:冗余生命周期钩子

React:冗余生命周期钩子
EN

Stack Overflow用户
提问于 2017-05-05 03:03:09
回答 2查看 182关注 0票数 0

嗨,我有多个具有相同生命周期钩子的react组件。有没有一个好的设计实践来处理这个问题?

一开始,我试着使用组合。为我的子组件创建包装器。然后,我尝试用componentWillMount为包装器创建一个生命周期钩子。

代码语言:javascript
复制
class Wrapper extends React.Component {
   componentWillMount() {
      if(this.props.status == "not logged in") browserHistory.push("/login")
   }
   render() {
      return {
         <div>{this.props.children}</div>
      }
   }
}

但是,我随后意识到,只有在最初呈现包装器时才会触发componentWillMount。因此,对子组件的任何更改都不会触发componentWillMount。一个解决方案可以是一个生命周期钩子,当子组件改变时触发,但我已经看过了,我不认为它存在。

另一种解决方案是使用继承并创建定义生命周期钩子的父类。

代码语言:javascript
复制
class Parent extends React.Component {
   componentWillMount() {
      if(this.props.status == "not logged in") browserHistory.push("/login")
   }
}

然后我可以用以下命令创建继承它的组件:

代码语言:javascript
复制
class Child extends Parent {
  ...
}

然而,我听说由于性能和冲突,React组件的继承不是一个好主意。

有什么想法吗?或者我可能需要使用冗余代码?只是在寻找一个优雅的解决方案。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2018-10-31 11:40:51

如果您想尝试使用新的React Hooks方法来实现这一点,下面的自定义钩子将实现您想要的功能

代码语言:javascript
复制
const routeLoggedOutUser = loginStatus => {
  useEffect(
    () => {
      if (loginStatus === "not logged in")
        browserHistory.push("/login");
    },
    [loginStatus]
  );
};

您只需调用相关函数组件中的自定义钩子,如下所示:

代码语言:javascript
复制
function Inner({ status }) {
  routeLoggedOutUser(status);
  return <div>A component with status {status}</div>;
}

基于此条件的路由有点可疑,但您可能希望重新考虑在应用程序中的确切位置接收此登录状态更新,以便重新路由逻辑只发生一次。

沙盒代码,仔细看一下right here

票数 0
EN

Stack Overflow用户

发布于 2018-11-12 05:54:44

React Hooks是一个新的API,旨在解决这个问题(以及其他问题)。它使得在组件之间重用有状态逻辑变得更容易。在您的例子中,您可以编写一个名为useLogoutStatus的自定义钩子。约定是以单词use开始钩子,这样钩子ESLint插件就可以知道它是一个钩子,并确保该钩子的使用遵循rules of hooks

代码语言:javascript
复制
function useLogoutStatus(loginStatus) {
  useEffect(
    () => {
      if (loginStatus === 'not logged in') {
        browserHistory.push('/login');
      }
    },
    [loginStatus], // This tells React to only run `useEffect` when `loginStatus` has changed.
  );
};

在你的组件中,你可以这样做:

代码语言:javascript
复制
function Profile(props) {
  useLogoutStatus(props.status);

  return ...;
}

function Feed(props) {
  useLogoutStatus(props.status);

  return ...;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43790889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档