Запретить повторную визуализацию при отправке функции prop из функционального компонента - PullRequest
0 голосов
/ 01 апреля 2019

При отправке реквизитов в 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 произойдет, как мы хотим.

Однако это больше похоже на взлом, чем на решение.


Как лучше всего отправлять реквизит функции из функционалакомпонентов для дочернего компонента, не вызывая ненужных повторных визуализаций дочернего компонента?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019
Хук

useCallback существует именно для решения этой проблемы. Советую внимательно прочитать официальное руководство по хукам , оно в значительной степени отвечает на все возможные вопросы

  function Component(props) {
    const createRows = useCallback(() =>
      props.data.map(dataToRow);
    ), []); // provide dependencies here

    return <List createRows={createRows}/>;
  }
1 голос
/ 01 апреля 2019
...