【问题标题】:Reactjs rendering twiceReactjs 渲染两次
【发布时间】:2019-01-04 08:54:38
【问题描述】:

在我的 reactjs 项目中,组件被渲染了两次。如果我删除 componentDidMount,问题就解决了。但我在我的项目中需要它。我尝试了网上的解决方案,但我不能。

App.js

export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      users: []
    };
  }
  componentDidMount() {
    fetch("https://reqres.in/api/users?page=2")
      .then(res => res.json())
      .then(result => {
        this.setState({
          users: result.data
        });
      });
  }

  render() {
    return (
      <BrowserRouter>
        <Switch>
          <Route exact path="/" render={() => <Home />} />
        </Switch>
      </BrowserRouter>
    );
  }
}

Home.js

export default class Home extends Component {
  render() {
    console.log("Render");
    return (
      <div>
        <h1>console.log render twice</h1>
      </div>
    );
  }
}

https://codesandbox.io/s/wyjk931z6l

console.log 在 Home.js 上工作两次。

【问题讨论】:

  • 会渲染两次,有什么问题吗?这就是 api 调用的工作原理
  • 请解释为什么您认为被多次渲染的组件在某种程度上是不好的。因为这就是 React(或任何其他使用屏幕的软件)的工作方式。

标签: javascript reactjs react-router


【解决方案1】:

您的 App 组件会重新渲染,因为您在 componentDidMount 中进行的 API 调用会导致 setState 成功。因此,即使它们的道具没有改变,子组件也会重新渲染。为了避免这种情况,您可以通过扩展 React.PureComponent 来编写子组件,它通过浅比较 props 和 state 来实现 shouldComponentUpdate

export default class Home extends PureComponent {
  render() {
    console.log("Render");
    return (
      <div>
        <h1>console.log render twice</h1>
      </div>
    );
  }
}

Working demo

【讨论】:

  • 很好的答案,但我们不应该先找出为什么 OP 认为非问题是问题吗?我担心告诉他们shouldComponentUpdate 可能会鼓励一种应该首先避免的不良做法。
  • @ChrisG 是的,你是对的,但是,我确实试图解释 OP 代码中到底发生了什么,并建议使用 PureComponent 而不是自己实现 shouldComponentUpdate
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2016-07-03
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多