preactjs / preact-compat

ATTENTION: The React compatibility layer for Preact has moved to the main preact repo.
http://npm.im/preact-compat
MIT License
949 stars 148 forks source link

refs failed to rewire when rendering to different child types #448

Closed jo32 closed 4 years ago

jo32 commented 6 years ago

may be a critical bug:

class MorphingComponent extends React.Component {
  state = {activated: false};

  _toggleActivatedState = () => {
    this.setState({activated: !this.state.activated});
  };

  render() {
    var toggleActivatedState = this._toggleActivatedState;
    return !this.state.activated
      ? <a ref="x" onClick={toggleActivatedState} />
      : <b ref="x" onClick={toggleActivatedState} />;
  }
};

var a = ReactDOM.render(
  <MorphingComponent />,
  document.body
);

console.log(ReactDOM.findDOMNode(a.refs.x).tagName); // shoud be 'A' and got 'A'

a._toggleActivatedState()

console.log(ReactDOM.findDOMNode(a.refs.x).tagName); // shoud be 'B' but got 'A'

https://jsfiddle.net/jo32/br14jL3v/

developit commented 6 years ago

Hmm - I think the compat code is to blame here. Good find.

marvinhagemeister commented 4 years ago

This is resolved in Preact X :tada: