Сцена:Когда родительский компонент изменяет свои собственные данные, дочерний компонент будет визуализироваться каждый раз, когда родительский компонент визуализируется без изменения данных дочернего компонента.
1. Узнайте о компоненте React.PureComponent
Скажи это первымshouldComponentUpdateЭта функция жизненного цикла, которая управляет визуализацией компонента, возвращая true или false, может эффективно избежать бессмысленного или повторного рендеринга компонента.Избегайте ненужных двойных вычислений, сокращайте потери ресурсов и повышайте производительность..
shouldComponentUpdate(nextProps, nextState) {
if(this.props.value === nextProps.value) {
return false; // 判断props接收的参数value有无变化,无变化则返回false,组件不渲染
}
}
Компоненты класса наследуютсяComponentВместо этого наследуются компонентыPureComponentкомпоненты, вам не нужно писатьshouldComponentUpdateФункция жизненного цикла определяет, изменились ли параметры для управления отрисовкой компонента.
наследование дочерних компонентовPureComponentкомпонента, он определит, изменились ли входящие параметры, и если изменений нет, рендеринг дочернего компонента будет предотвращен.
PureComponentСлабые стороны компонентов:
- Предусмотрены только простые алгоритмы сравнения.
- сложные структуры данных передаются по значению,
PureComponentКомпоненты не могут принимать правильные решения.
- Функциональные компоненты не могут наследовать
PureComponentкомпоненты.
2. Узнайте о React.memo()
React 16.6.0 официально выпустил React.memo(), который является компонентом более высокого порядка.
import React, { memo } from 'react';
const Child = memo(function Child(props) {
return(
<h1>{props.value}</h1>
)
});
export default Child;
React.memo()а такжеReact.PureComponentСходства и различия компонентов:
Другое: React.memo() есть函数组件, React.PureComponent — это类组件.
То же самое: это поверхностное сравнение полученных параметров реквизита для решения проблемы эффективности компонента во время выполнения и оптимизации поведения компонента при повторном рендеринге.
3. Давайте поговорим о useMemo
useMemo() выпущен в React 16.8.0.
React.memo()Это нужно для того, чтобы судить, повторяется ли рендеринг функционального компонента.
useMemo()Является ли определение того, выполняется ли часть логики функции повторно.
import React, { memo, useState, useMemo } from "react";
function App() {
const [value, setValue] = useState(0);
const increase = useMemo(() => {
if(value > 2) return value + 1;
}, [value]);
return (
<div>
<Child value={value} />
<button
type="button"
onClick={() => {
setValue(value + 1);
}}
>
value:{value},increase:{increase || 0}
</button>
</div>
);
}
const Child = memo(function Child(props) {
console.log('Child render')
return <h1>value:{props.value}</h1>;
});
export default App;
useMemo() зависит от значения, определяющего увеличение параметра:
const increase = useMemo(() => {
if(value > 2) return value + 1;
}, [value]);
Начальное значение значения равно 0. Когда значение значения увеличивается до значения, превышающего 2, начинает назначаться увеличение, а после назначения увеличение всегда будет больше значения на 1.
Дочерний компонент
const Child = memo(function Child(props) {
console.log('Child render')
return <h1>value:{props.value}</h1>;
})
- Компонент memo определяет, обновляется ли значение, переданное props.Если есть обновление, значение, отображаемое дочерним компонентом, обновляется, и консоль выводит Child render
- Чтобы четко видеть роль memo, вы можете изменить значение, передаваемое дочернему компоненту, на увеличение,
<Child value={increase} /> - Когда увеличение равно 0, дочерний компонент не будет отображаться.
- Нажмите кнопку, чтобы увеличить значение, когда
value > 2Когда , параметр увеличения обновляется, поэтому дочерний компонент Child будет рендериться, а консоль выведет Child render
4. Параметры useMemo()
Если вы использовали useEffect(), вы, вероятно, знаете роль второго параметра useEffect(). useMemo() — это то же самое, что и useEffect().
Первый параметр useEffect() — это функция выполнения, затем... второй параметр:
- Если второй параметр пуст, эта часть логики будет выполняться каждый раз при рендеринге компонента, и не будет судить о том, выполняется ли логика повторно в соответствии с входящим значением атрибута, поэтому бессмысленно писать useMemo() .
- Если второй параметр является пустым массивом, он будет выполняться только один раз при рендеринге компонента, и обновление значения входящего свойства не будет иметь никакого эффекта.
- Таким образом, второй параметр useMemo() должен передавать зависимые параметры в массиве.
useMemo(() => { // to do somthing... }, [value])
5. Время выполнения useMemo()
useMemo()Должно быть возвращаемое значение, а возвращаемое значение непосредственно участвует в рендеринге, поэтому useMemo() находится в渲染期间Завершенный.
так что проблема в начальной сцене должна быть эффективно решена🤔