Сцена:Когда родительский компонент изменяет свои собственные данные, дочерний компонент будет визуализироваться каждый раз, когда родительский компонент визуализируется без изменения данных дочернего компонента.
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() находится в渲染期间
Завершенный.
так что проблема в начальной сцене должна быть эффективно решена🤔