#redux #react-redux #material-ui #next.js #server-side-rendering
#сокращение #реагировать-redux #материал-пользовательский интерфейс #next.js #рендеринг на стороне сервера
Вопрос:
Привет, я не уверен, ошибка ли это, или я признателен, если кто-нибудь может мне помочь.
Я использовал Next.js v10 с Material-UI и React Redux / Redux в SSR. На самом деле у меня есть поддержка Redux, переданная в useStyles:
const extended = useSelector(state => state.someStore.extended);
const classes = useStyles({
extended
});
и используется в makeStyles:
toolbar: {
height: props => props.extended ? 180 : 600
}
Когда событие, которое обновляет «расширенное», происходит повторный рендеринг. Однако «расширенный» сохранил старое значение 180, но не 600.
Вышесказанное прекрасно в режиме разработки, но в SSR это проблематично. Я попытался использовать styled-components в SSR, и это сработало, как ожидалось.
Я пропустил какую-то конфигурацию в Material UI Redux SSR? Большое спасибо.
Комментарии:
1. Нужна дополнительная информация о том, как вы обновляете
extended
значение (т.Е. Действие, редуктор). Также неясно, какое это имеет отношение к рендерингу на стороне сервера. Существуют ли несоответствия между отображением сервера и клиента?2. Да, я обновил свойство «extended», отправив событие Redux.
Ответ №1:
Redux / React Redux — это нормально. Я должен использовать clsx для решения проблемы.
(Ниже приведены коды всех случаев для Next.js ССР)
СЛУЧАЙ 1 (это работает!):
<Toolbar className={clsx(classes.toolbar, expanded amp;amp; classes.expanded)} />
const useStyles = makeStyles(theme => ({
toolbar: {
height: 180
},
expanded: {
height: 600
}
}));
СЛУЧАЙ 2 (это не работает! (моя оригинальная работа):
const classes = useStyles({ expanded });
<Toolbar className={classes.toolbar} />
const useStyles = makeStyles(theme => ({
toolbar: {
height: props => props.expanded ? 600 : 180
}
}));
СЛУЧАЙ 3 (это работает!):
Хотя это нормально, используя стилизованные компоненты, подобные этому:
<Toolbar expanded={expanded} />
const Toolbar = styled.div`
height: ${props => props.expanded ? '600px' : '180px'};
`;
Ответ №2:
Я думаю, проблема в том, что вы пытаетесь передать expanded
prop в useStyles
хук, но он не ожидает никаких аргументов. Чтобы заставить его работать, вы можете попробовать следующее:
const useStyles = ({ expanded }) =>
makeStyles({
toolbar: {
height: expanded ? 180 : 600
}
});
const SomeComponent = () => {
const expanded = useSelector(state => state.someStore.expanded);
const classes = useStyles({ expanded })();
return <Toolbar className={classes.toolbar} />;
}
Вы также можете обратиться к этому примеру