I need to always intercept when React unmounts a Component, no matter if that is a Functional or Class based component.
Here is my case:
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>
    );
  }
}
Now, as you can easily see, I am able to hook on every time <Comp /> gets unmounted. That is just what I need.
Things will dramatically change when that <Comp /> is a functional component: 
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>
    );
  }
}
So, my question is:
I can change approach (or use React internal Apis), I just need to always intercept changes on a component passed as arguments for observe.
You can't. Functional components don't have lifecycles (yet).
Instead of messing with the functional component directly, why don't you just wrap the functional component in a class with a HOC. You could use recompose toClass for this.
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;
}
Or just copy the code from here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With