Я экспериментирую с новым Context API и хуками. Я создал приложение с боковой панелью (древовидная структура), нижним колонтитулом и страницей основного контента. У меня есть провайдер контекста
const ContextProvider: FunctionComponent = (props) => {
const [selected, setSelected] = useState(undefined);
const [treeNodes, setTreeNodes] = useState([]);
return (
<MyContext.Provider
value={{
actions: {
setSelected,
setTreeNodes
},
selected,
treeNodes
}}
>
{props.children}
</MyContext.Provider>
);
Я являюсь моим компонентом контента. У меня есть DetailsList (интерфейс Office Fabric), содержащий около 1000 элементов. Когда я нажимаю на элемент в списке, я хочу обновить выбранный элемент в контексте. Это работает, но это действительно медленно. Для выбора элемента в списке требуется около 0,5-1 секунды. Список виртуализирован. Я попробовал это на сборке производства. Все немного лучше, но при нажатии на список есть заметная задержка.
Нижний колонтитул использует myContext для отображения информации о выбранном элементе.
Вот немного кода из моего компонента
const cntx = useContext(MyContext);
const onClick = (item) => {
cntx.actions.setSelected(item);
};
Я неправильно использую контекст?
Я создал образец песочницы для демонстрации. Вы можете прокрутить до примерно 100-го индекса и щелкнуть пару раз, чтобы увидеть, как он перестает отвечать.
https://codesandbox.io/s/0m4nqxp4m0
Это проблема с Fabric DetailsList? Это повторяется много раз? Я полагаю, что проблема связана со «сложным» компонентом DatePicker, но я не понимаю, почему DetailsList переопределяется? Он не использует никаких свойств контекста в функции рендеринга. Я ожидаю, что только компонент нижнего колонтитула будет перерисовываться при каждом изменении контекста