React.Component和React.PureComponent显示不同的行为

时间:2018-01-05 05:50:01

标签: javascript reactjs

我在下面添加了可运行的代码片段。看到不同  第一个是React.PureComponent版本

class App extends React.PureComponent {
 
  render() {
    console.log('re-render')
    return (
    <div>
     <span>I am parent</span>
     {this.props.children}
    </div>
    )
  }
}

  ReactDOM.render(
    <App>
      <div>
        I am the child
      </div>
    </App>,
    document.getElementById('app')
  )


//setTimeout(render, 1000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
第二个是React.Component版本

class App extends React.Component {
  
  render() {
    console.log('re-render')
    return (
    <div>
     <span>I am parent</span>
     {this.props.children}
    </div>
    )
  }
}

  ReactDOM.render(
    <App>
      <div>
        I am the child
      </div>
    </App>,
    document.getElementById('app')
  )


//setTimeout(render, 1000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

为什么第二个成功运行,而不是第一个?我尝试探究原因,但没有找到任何好的理由

3 个答案:

答案 0 :(得分:4)

我可能错了,但我认为版本React.PureComponent中不存在15.1.0

您获得的错误("Uncaught TypeError: Super expression must either be null or a function, not undefined")通常由拼写错误或扩展不存在的类触发(请参阅this SO post中的详细信息)。

我的建议是让你的第三方库更新,并在这种情况下使用最新版本的React。

反应升级后,这是你自己的例子:

class App extends React.PureComponent {
 
  render() {
    console.log('re-render')
    return (
    <div>
     <span>I am parent</span>
     {this.props.children}
    </div>
    )
  }
}

  ReactDOM.render(
    <App>
      <div>
        I am the child
      </div>
    </App>,
    document.getElementById('app')
  )


//setTimeout(render, 1000)
<script src="https://unpkg.com/react@16.2.0/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16.2.0/umd/react-dom.development.js"></script>
<div id="app"></div>

答案 1 :(得分:1)

在15.3.0版本之后添加了React.PureComponent,因为在第一种情况下会出现错误。 如果您希望第一个案例有效,请查看该片段。我已经更新了反应版本。

class App extends React.PureComponent {
  render() {
    console.log('re-render')
    return (
    <div>
     <span>I am parent</span>
     {this.props.children}
    </div>
    )
  }
}

  ReactDOM.render(
    <App>
      <div>
        I am the child
      </div>
    </App>,
    document.getElementById('app')
  )


//setTimeout(render, 1000)
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div id="app"></div>

供参考,请检查 react-release-version

答案 2 :(得分:0)

React.PureComponent在您的情况下不起作用,因为您使用的是旧版本的ReactJS。实际上,2016年6月29日React 15.3引入了对React.PureComponent的支持。