Reactjs 更新道具是否应该重新渲染整个组件?

Reactjs 更新道具是否应该重新渲染整个组件?,reactjs,redux,Reactjs,Redux,假设我有一个CookingClass组件,它像这样初始化 let teachers = makeTeachers(["Amber", "Jason", "Lily"]) let students = makeStudents(["Hopper"]) <CookingClass teachers={teachers} students={students} /> let teachers=makeTeachers([“Amber”、“Jason”、“Lily”]) let

假设我有一个
CookingClass
组件,它像这样初始化

let teachers = makeTeachers(["Amber", "Jason", "Lily"])
let students = makeStudents(["Hopper"])

<CookingClass
  teachers={teachers}
  students={students}
/>
let teachers=makeTeachers([“Amber”、“Jason”、“Lily”])
let students=makeStudents([“Hopper”])
其中一名教师退学:

let newTeachers = makeTeachers(["Amber", "Jason"])

<CookingClass
  teachers={newTeachers}
/>
让newTeachers=makeTeachers([“Amber”,“Jason”])
它将使整个组件重新渲染。我不确定React是否只计算差异并有效地重新渲染它,或者我必须使用
shouldComponentUpdate
自己处理它


更真实的例子可能是实现一个Google地图,其中有一百万个标记,您希望替换其中一个标记。

您正在更改一个所谓的虚拟DOM节点。对于虚拟节点中的每次更改,都会调用
shouldComponentUpdate()
。如果您不自己实现它,它将始终
返回true

因此,如果您只想在特定情况下重新加载
CookingClass
,那么您必须自己实现它


React的优点是,当本地DOM节点在虚拟DOM中发生更改时,它只会重新呈现这些节点。这是使反应如此迅速的“渲染”。

您正在更改所谓的虚拟DOM节点。对于虚拟节点中的每次更改,都会调用
shouldComponentUpdate()
。如果您不自己实现它,它将始终
返回true

因此,如果您只想在特定情况下重新加载
CookingClass
,那么您必须自己实现它


React的优点是,当本地DOM节点在虚拟DOM中发生更改时,它只会重新呈现这些节点。这是使React如此快速的“呈现”。React使用非常高效的
innerHTML
插入,并且仅针对应用程序VirtualDomainTree的新数据结构中的更改,完全处理realDOM呈现


shouldComponentUpdate()
控制是否应重新计算组件。例如,在渲染静态数据时,应该使用它。组件的输出不会更改,因此您可以返回
false
,组件的第一个版本将永远使用;)

realDOM呈现完全由React处理,使用非常高效的
innerHTML
插入,并且仅用于应用程序VirtualDomTree的新数据结构的更改


shouldComponentUpdate()
控制是否应重新计算组件。例如,在渲染静态数据时,应该使用它。组件的输出不会更改,因此您可以返回
false
,组件的第一个版本将永远使用;)

根据示例代码,该组件每次都将重新渲染

您应该使用()绑定将组件“连接”到存储

// ConnectedCookingClass.js
import { connect } from 'react-redux';
import CookingClass from './CookingClass';

const mapStateToProps = (state) => {
  return {
    teachers: state.teachers,
    students: state.students
  };
};

const ConnectedCookingClass = connect(mapStateToProps)(CookingClass);

export default ConnectedCookingClass;
然后在其他地方使用此组件,如下所示:

// OtherComponent.js
import ConnectedCookingClass from './ConnectedCookingClass';

const OtherComponent = React.createElement({
  render() {
    return (
      <div>
        <ConnectedCookingClass />
      </div>
    );
  }
});

根据您的示例代码,该组件每次都将重新渲染

您应该使用()绑定将组件“连接”到存储

// ConnectedCookingClass.js
import { connect } from 'react-redux';
import CookingClass from './CookingClass';

const mapStateToProps = (state) => {
  return {
    teachers: state.teachers,
    students: state.students
  };
};

const ConnectedCookingClass = connect(mapStateToProps)(CookingClass);

export default ConnectedCookingClass;
然后在其他地方使用此组件,如下所示:

// OtherComponent.js
import ConnectedCookingClass from './ConnectedCookingClass';

const OtherComponent = React.createElement({
  render() {
    return (
      <div>
        <ConnectedCookingClass />
      </div>
    );
  }
});

是的,您应该使用
shouldComponentUpdate
来最小化重新渲染,并使用
s来确保回收。请考虑使用react-redux。它为您解决了这个问题是的,您应该使用
shouldComponentUpdate
来最小化重新渲染,并使用
s来确保回收。请考虑使用react-redux。它为您解决了这个问题值得注意的是,当使用官方
react-redux
绑定时,
shouldComponentUpdate
被实现,并且并不总是返回true。值得注意的是,当使用官方
react-redux
绑定时,
shouldComponentUpdate
被实现,并且并不总是返回true。