react 解决:容器组件更新,导致内容组件重绘

import React from "react";
import ReactDOM from "react-dom";

class App extends React.Component {
  state = {
    list: [1, 2, 3, 4, 5]
  };

  listChange = index => {
    const newList = this.state.list.slice();
    newList[index] = newList[index] + 1;
    this.setState({ list: newList });
  };

  render() {
    return (
      <div>
        {this.state.list.map((str, index) => (
          <Item
            key={index}
            str={str}
            index={index}
            changeHandle={this.listChange}
          />
        ))}
      </div>
    );
  }
}

// 使用Pure提高性能
class Item extends React.PureComponent {
  // class Item extends React.Component {
  // 手动控制是否重绘
  // shouldComponentUpdate(nextProps, nextState) {
  //   if (nextProps.str === this.props.str) {
  //     return false;
  //   }
  //   return true;
  // }
  itemClick = () => {
    this.props.changeHandle(this.props.index);
  };
  render() {
    console.log("i'm render! ");
    return (
      <div
        style={{
          backgroundColor: `#${this.props.str}03121`,
          marginBottom: "5px"
        }}
        onClick={this.itemClick}
      >
        {this.props.str}
      </div>
    );
  }
}


// 容器组件更新,子组件不需要重绘
// Container独立管理状态
// 它看到的子组件(this.props.children)是End传给他的,不需要重新用调用React.createElement创建,所以this.props.children是不变的
class Container extends React.Component {
  state = {
    number: 1
  };
  updata = () => {
    this.setState({ number: this.state.number + 1 });
  };
  render() {
    return (
      <div>
        <p onClick={this.updata}>
          click to updata Container! {this.state.number}
        </p>
        {this.props.children}
      </div>
    );
  }
}

const End = () => {
  return (
    <Container>
      <App />
    </Container>
  );
};

ReactDOM.render(<End />, document.getElementById("container"));

转载于:https://www.cnblogs.com/hideonbush/p/10820438.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值