React 组件基本优化实践记录

发布于 2023-05-04 20:20:55 字数 3223 浏览 57 评论 0

最常用的 shouldComponentUpdate

通过 shouldComponentUpdate 判断组件状态更新时是否重新渲染组件,如果 props 中数据对象数组有太多层慎用 <Component {...this.props} />

慎用setState

render 函数里面要用到的东西放 props/state(影响 view),其他变量则不放进去,写成模块内的私有变量(跨实例共享)或者组件实例上的变量。这样可以避免执行无效的 render 操作。

绑定事件写法

每次组件 render 时引用函数一样,所以当父组件 render 时不会导致 MyInput 组件重新渲染

update = (e) => {
  this.props.update(e.target.value)
}
render() {
  return <MyInput onChange={this.update} />
}

固定默认空对象或数组

接收后端参数值最好添加一个默认值防止出错,可在组件中添加一个componentDidCatch(error, info)捕捉错误

static defaultValue = {}
render () {
  return  <Item data={i || defaultValue} />
}

复杂状态与简单状态不共用一个组件

以下组件代码中,最好将 ul 列表部分抽出成一个纯组件。防止 input 值多次改变重新渲染组件也会将列表部分重新渲染。

change = (e) => {
  this.setState({ value: e.target.value });
}
render() {
  return (
    <div>
      <ul>
        {this.state.items.map((item, key) => <li key={key}>item</li>)}
      </ul>
      <input value={this.state.value} onChange={this.change} />
    </div>
  )
}

puerComponent

puerComponet 浅比较,shallowEqual 会比较 Object.keys(state | props) 的长度是否一致,每一个 key 是否两者都有,并且是否是一个引用,也就是只比较了第一层的值。state 改变频率高则不建议使用。

if (this._compositeType === CompositeTypes.PureClass) {
  shouldUpdate = !shallowEqual(prevProps, nextProps)
  || !shallowEqual(inst.state, nextState);
}

如果 PureComponent 里有 shouldComponentUpdate 函数的话,直接使用 shouldComponentUpdate 的结果作为是否更新的依据,没有 shouldComponentUpdate 函数的话,才会去判断是不是 PureComponent ,是的话再去做 shallowEqual 浅比较。推荐阅读React PureComponent 使用指南

将无状态组件写成 functional components

const ImgComp = (props) => {
  return <img src={props.url} />;
}

constant elements

将不变的 HTML 代码抽离赋值给一个变量,jsx 会当成一个值减少解析过程。

const _ref = <span>Hello World</span>;
class Component extends Component {
  render() {
    return (
      <div className={this.props.className}>
        {_ref}
      </div>
    );
  }
}

利用修饰器处理传入connect参数

@connect(
  state => ({
    day: state.IndexReducers.day
  }),
  dispatch => ({
    setSendMessage: data => {
      dispatch(setSendMessageActions(data));
    }
  })
)
export default class App extends Component {
  // ...
}

引入 babel-react-optimize

引入 babel-preset-react-optimize preset 来提高 React 组件性能。该 preset 做了以下事情:

  • transform-react-constant-elements 识别并转换可以转成常量的组件
  • transform-react-remove-prop-types 删除 propTypes
  • transform-react-pure-class-to-function 尽可能把 class 组件转为 functional 组件

利用 Perf 分析渲染性能

Perf 是 react 官方提供的性能分析工具,会展示出不必要的组件渲染次数。点击Chrome 插件地址安装。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

葬心

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

qq_eQNo9e

文章 0 评论 0

内心旳酸楚

文章 0 评论 0

mb_BlPo2I8v

文章 0 评论 0

alipaysp_ZRaVhH1Dn

文章 0 评论 0

alipaysp_VP2a8Q4rgx

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文