javascript - React Intercept 组件卸载(功能组件和类组件)

标签 javascript reactjs

当 React 卸载组件时,我需要始终拦截,无论它是否是 FunctionalClass基于组件。

这是我的案例:

function observe(component) {
  const p = component.type.prototype;
  const delegate = p.componentWillUnmount || function noop() {};

  if(!delegate.__decorated) {
    p.componentWillUnmount = function() {
      console.log('I am going to be unmounted');

      return delegate.apply(this, arguments);
    }

    p.componentWillUnmount.__decorated = true;
  }

  return component;
}

class Comp extends React.Component {

  render() {

    return (<h1>Hello World</h1>);
  }
}

class App extends React.Component {

  render() {
    const active = this.state && this.state.active;
    const toggle = () => this.setState({
      active: !active,
    });

    return (
      <div>
        <button onClick={toggle}>Toggle</button>
        <hr />
        {active && observe(<Comp />)}
      </div>
    );
  }
}

现在,如您所见,我每次都能挂机 <Comp />被卸载。 这正是我需要的

<Comp /> 发生时,情况将发生巨大变化是一个功能组件:

function observe(component) {
  const p = component.type.prototype;
  const delegate = p.componentWillUnmount || function noop() {};

  if(!delegate.__decorated) {
    p.componentWillUnmount = function() {
      console.log('I am going to be unmounted');

      return delegate.apply(this, arguments);
    }

    p.componentWillUnmount.__decorated = true;
  }

  return component;
}



function Comp() {

  return (<h1>Hello World</h1>);
}


class App extends React.Component {

  render() {
    const active = this.state && this.state.active;
    const toggle = () => this.setState({
      active: !active,
    });

    return (
      <div>
        <button onClick={toggle}>Toggle</button>
        <hr />
        {active && observe(<Comp />)}
      </div>
    );
  }
}

所以,我的问题是:

如何 Hook 功能组件?

我可以改变方法(或使用 React 内部 Apis),我只需要始终拦截作为参数传递给 observe 的组件的更改。 .

最佳答案

你不能。功能组件还没有生命周期。

与其直接搞乱功能组件,不如将功能组件包装在一个带有 HOC 的类中。您可以使用重组 toClass为此。

function observe(component) => {
  const classComponent = toClass(component):
  const p = classComponent.type.prototype;
  const delegate = p.componentWillUnmount || function noop() {};

  if(!delegate.__decorated) {
    p.componentWillUnmount = function() {
      console.log('I am going to be unmounted');

      return delegate.apply(this, arguments);
    }

    p.componentWillUnmount.__decorated = true;
  }

  return classComponent;
}

或者直接复制 here 中的代码.

关于javascript - React Intercept 组件卸载(功能组件和类组件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46988652/

相关文章:

javascript - 更改高 map 中的图例大小?

jquery - 如何在react.js中更改滚动导航栏的背景和文本颜色?

javascript - 在不同的 .env 文件中设置 PUBLIC_URL (create-react-app)

reactjs - Redux-i18n 访问 React 组件外部的 t() 函数,例如行动中的创造者

javascript - GET 请求不会仅在 Node.JS 内返回?

javascript - 借助 color jquery 或任何其他方法保存颜色

javascript - 如何为 CSS 垂直下拉菜单添加延迟

javascript - 对嵌套对象使用 Lodash countBy

html - 将 <a> 链接定位在具有响应行为的 <image> 上

javascript - 为什么在加载 View 和单击 ASP.NET MVC 中的 Html.ActionLink 之间,我的 routeValues 变量会发生变化?