Процесс рендеринга родительского компонента React автоматически сжимает рендеринг дочерних компонентов.Это может быть повышение производительности для большинства приложений, но такая ситуация может быть серьезной проблемой.
У меня есть 2 компонента:
- Компонент боковой панели списка файлов
- Компонент текстового редактора (сейчас я использую Slate)
Два компонента являются дочерними компонентами компонента Home.
Когда пользователь щелкает элемент боковой панели, он должен:
- Выделите выбранный элемент
- Установите новое состояние редактора, прочитав текстовый файл
Второй шаг может стать узким местом.Проблема в том, что React тупо сжимает разделенные две операции.Это приводит к тому, что пользователь не может видеть выделение элемента сразу после нажатия!Пользователь должен дождаться чтения файла и установить новое состояние редактора, а затем, наконец, элемент может быть выделен.
Эта задержка плохо влияет на работу пользователя.Вы когда-нибудь использовали текстовый редактор, который реагирует на ваш щелчок примерно через 500 мс?Программа выглядит «медленнее».
componentDidUpdate(prevProps) {
console.log('componentDidUpdate!');
const { currentDir, actions, currentFile } = this.props;
if (prevProps.currentDir !== currentDir) {
updatedFileList(currentDir);
} else if (prevProps.currentFile !== currentFile) {
updateEditorContent(currentFile);
}
}
Это компонент DidUpdate.Это обновляет состояние редактора.
redux-logger.js:1 action SELECT_FILE_LIST_ITEM @ 21:29:18.332
21:29:18.338 redux-logger.js:1 action UPDATE_CURRENT_FILE @ 21:29:18.338
21:29:18.347 Home.js:287 render!!
21:29:18.356 Home.js:44 componentDidUpdate!
21:29:18.366 redux-logger.js:1 action UPDATE_EDITOR_CONTENT @ 21:29:18.357
21:29:18.373 Home.js:287 render!!
21:29:18.678 Home.js:44 componentDidUpdate!
В журнале говорится, что оно componentDidUpdate
d при 21:29:18.356
, но фактический HTML DOM еще не обновлен.Он автоматически обновляет DOM после 21:29:18.678 Home.js:44 componentDidUpdate!
. '
Как разделить два компонента DidUpdates, чтобы отдельно обновить DOM?