更改状态时避免组件更新

时间:2020-05-27 06:44:27

标签: reactjs typescript react-chartjs

背景

我有一个React组件,其中包括另外两个组件。我的组件包括一个图表(使用react-charts构建),另一个是简单的输入字段。我最初不可见,但是当有人单击那里的图标时,它变得可见。

问题,状态改变时孩子会放弃

现在的问题是,每当我切换此输入字段时,它都会自动刷新我的图形。实际上,当我在输入字段中键入内容时,它也会刷新图形。我认为随着我更新状态变量,它会重新呈现图形。我想停止这种行为。有关如何执行此操作的任何建议。

组件屏幕截图(https://i.imgur.com/zeCQ6FC.png

组件代码

<div className="row">
  <DealGraph ref={this.dealRef} />
  <div className="col-md-4">
    <div className="row">
      <div style={style} className="col-md-12 bg-white border-radius-10  default-shadow">
        <h3 className="sub-heading roboto" style={border}>
          Create Deals
        </h3>
        <input
          type="text"
          name="deal"
          className="form-control mgt-30"
          value="Deal One"
          readOnly
        />
        <button
          type="button"
          onClick={this.showAddBlock}
          style={button}
          className="golden-button create-deal-button"
        >
          <i className="fa fa-plus"></i>
        </button>
        {addDealStatus ? (
          <div className="col-md-12 add-deal-box pd-0-0">
            <input
              type="text"
              className="form-control mgt-30 mgb-10"
              name="add-deals"
              placeholder="Add Deals"
            />
            <button type="button" className="golden-button flex all-center">
              Add
            </button>
          </div>
        ) : null}
      </div>
    </div>
  </div>
</div>

切换功能

showAddBlock=() => {
  this.setState({addDealStatus:!this.state.addDealStatus})
}

4 个答案:

答案 0 :(得分:1)

使用PureComponent

要停止从父级重新渲染子级组件,您应该使子级成为纯组件。

import React from 'react';

class DealGraph extends React.PureComponent { // notice PureComponent

  render() {
    const { label, score = 0, total = Math.max(1, score) } = this.props;

    return (
      <div>
        /* Your graph code */
      </div>
    )
  }

}

答案 1 :(得分:0)

使用来自Recompose的{pure} HOC

您可以使用纯HOC中包装的功能组件进行重构

import React from 'react';
import { pure } from 'recompose';

function DealGraph(props) {
  return (
    <div>
      /* Your graph code */
    </div>
  )
}

export default pure(DealGraph); // notice pure HOC

答案 2 :(得分:-1)

一种快速的解决方案是将输入移动到自己的组件中。

更复杂的解决方案是像您的React: Parent component re-renders all children, even those that haven't changed on state change所述,在shouldComponentUpdate组件中改编DealGraph函数

答案 3 :(得分:-1)

默认情况下,渲染每个组件时都会对shouldComponentUpdate进行检查.React组件默认情况下不实现shouldComponentUpdate,因此我们可以实现一个shouldComponentUpdate。或将子类作为纯组件。