Javascript React函数与模板重新渲染

Javascript React函数与模板重新渲染,javascript,reactjs,dom,Javascript,Reactjs,Dom,我有一个简单的计数器应用程序 import * as ReactDOM from 'react-dom'; import * as React from 'react'; const app = document.querySelector('#root'); let count = 0; const increment = () => { count++; render(); } var as = {}; const render = () => {

我有一个简单的计数器应用程序

import * as ReactDOM from 'react-dom';
import * as React from 'react';

const app = document.querySelector('#root');
let count = 0;

const increment = () => {
    count++;
    render();
}

var as = {};

const render = () => {
    var Component = () => (
        <div>
            <h2>Differ</h2>
            <h1>123{count}</h1>
            <button onClick={increment}>+</button>
            <div>3333</div>
        </div>
    );
    var template = (
        <div>
            <h2>Differ</h2>
            <h1>123{count}</h1>
            <button onClick={increment}>+</button>
            <div>3333</div>
        </div>
    );
    // If click on increment react re-render only the count "text" element 
    ReactDOM.render(
        template, app
    );
    // If click on increment react re-render the whole component
    // ReactDOM.render(
    //     <Component />, app
    // );
}




render();
如果我使用ReactDOM.rendertemplate,应用程序。react仅重新渲染特定元素

如果我使用ReactDOM.render,应用程序react将重新渲染整个应用程序

它们是相同的组件,为什么会这样呢?组件和模板之间有什么不同

如果我在render函数react外部声明Componenet示例,则只渲染spesific元素

我使用chrome dev tools rendering=>paint flushing检查这一点。

理想情况下,无论如何,您不应该每次都重新渲染整个树。你应该使用

模板和组件之间的区别在于,模板是JSX/React元素,组件是React无状态/功能组件

有关更多信息,请参阅

React还将尝试解决和优化两棵树之间的差异

在第一个示例中,rendertemplate,app-您仍然使用相同的模板元素,因此React将比较其子元素与新子元素,并仅更新其道具已更改的子元素。在第二个示例中,您正在为React.createElementComponent传递一个新的Component实例is syntactical sugar,因此React将完全替换该子树

关于React如何协调树状态。

理想情况下,无论如何,您不应该每次都重新渲染整个树。你应该使用

模板和组件之间的区别在于,模板是JSX/React元素,组件是React无状态/功能组件

有关更多信息,请参阅

React还将尝试解决和优化两棵树之间的差异

在第一个示例中,rendertemplate,app-您仍然使用相同的模板元素,因此React将比较其子元素与新子元素,并仅更新其道具已更改的子元素。在第二个示例中,您正在为React.createElementComponent传递一个新的Component实例is syntactical sugar,因此React将完全替换该子树


关于React如何协调树状态。

我认为在这种情况下,React认为组件类型相同,因此它会递归到组件的子级。如果您重新定义组件,它会考虑不同的类型。我认为在这种情况下,React会认为组件类型相同,因此它会递归到组件的子级。如果重新定义组件,它会考虑不同的类型。
class Component extends React.Component {
  state = { count: 0 }

  render() {
    const onClick = () => { this.setState(({ count }) => ({ count: count + 1 }))}
    return (
      <button>{this.state.count}</button>
    )
  }
}