【问题标题】:How to refresh only a single item in React?如何仅刷新 React 中的单个项目?
【发布时间】:2018-12-27 09:06:16
【问题描述】:

我有这个 App React 组件(TypeScript):

class App extends React.Component {

public state = {
    text: ''
}

constructor(props: any) {
    super(props);
    this.state = { text: 'something' };
}

public handleClick = () => {
    const date = `new ! : ${new Date().toString()}`;

    // tslint:disable-next-line:no-console
    console.log('click ! : ' + date);

    this.setState({
        text: date
    });
};

public render() {
    return (
        <div className="App">
            <button onClick={this.handleClick}>Button</button>
            <p>{this.state.text}</p>
            <Hello />
        </div>
    );
}
}

还有这个 Hello 组件:

export class Hello extends React.Component {
@lazyInject("nameProvider")
private readonly nameProvider: IProvider<string>;

public render() {
    return <h1>Hello {this.nameProvider.provide()}!</h1>;
}
}

nameProvider 是一个简单的提供者,它基于随机数返回一个字符串。

单击按钮时,日期会更新,但每次都会重新渲染 Hello 组件。

这是预期的吗?如果是,请解释。

这种行为可以改变吗?

查看完整示例项目here...

【问题讨论】:

  • 如果我知道我的反应(我可能不太清楚),那么过程将是:App 中的状态更改 > 在 App 中渲染,它将重新渲染所有内容,然后计算两者之间的差异内部 DOM 和实际 DOM 内容并更新

标签: reactjs refresh render setstate


【解决方案1】:

您可以通过扩展React.PureComponent 使Hello 组件成为PureComponent,这样它就不会在每个父渲染上重新渲染

export class Hello extends React.PureComponent {

    @lazyInject("nameProvider")
    private readonly nameProvider: IProvider<string>;

    public render() {
        return <h1>Hello {this.nameProvider.provide()}!</h1>;
    }

}

【讨论】:

  • purecomponents 对 props 进行浅层比较,因此可以重新渲染组件,如果要避免完全重新渲染,则必须在 shoulsComponentUpdate 生命周期方法中始终返回 false
  • @MosèRaguzzini 是的,但是 Hello 组件没有收到 props,而且您不想完全阻止 Hello 组件重新渲染。
  • 或者你可以使用memo,因此这是一个相对简单的组件
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多