При отправке реквизитов в PureComponent
или функциональный компонент вы можете оптимизировать производительность, используя реквизиты, которые не меняются при каждом рендеринге, что предотвратит повторный рендеринг компонента.
При использованииКомпоненты класса это просто:
class Component extends React.Component {
render() {
return <List createRows={this.createRows}/>;
}
createRows = () => this.props.data.map(dataToRow);
}
Учитывая, что List
является либо PureCompoment
, либо функциональным компонентом, опора createRows
никогда не вызовет повторный рендеринг List
.
Но если Component
является функциональным компонентом, это больше невозможно:
function Component(props) {
return <List createRows={createRows}/>;
function createRows() {
return props.data.map(dataToRow);
}
}
Поскольку createRows
создается каждый раз при рендеринге Component
, реквизит изменится,вызывая повторную визуализацию List
каждый раз, когда Component
перерисовывается.Это может привести к большой потере производительности.Также обратите внимание, что createRows
нельзя размещать вне функционального компонента, поскольку он зависит от data
реквизита List
.
Теперь, с введением на крючках, возможнодля удержания createRows
в хуке useState
:
function Component(props) {
const [ createRows ] = useState(() => () =>
props.data.map(dataToRow);
);
return <List createRows={createRows}/>;
}
Так как createRows
сохраняется в хуке состояния, он не будет меняться при каждом рендеринге, и не будет повторного рендеринга List
произойдет, как мы хотим.
Однако это больше похоже на взлом, чем на решение.
Как лучше всего отправлять реквизит функции из функционалакомпонентов для дочернего компонента, не вызывая ненужных повторных визуализаций дочернего компонента?