Я пытаюсь переместить открытое состояние диалогового окна material-ui в режим редукции, чтобы предотвратить его закрытие при повторном отображении, но у меня возникли проблемы с диалоговым окном при повторном отображении. Несмотря на то, что состояние сохраняется в Redux, и диалоговое окно остается открытым всякий раз, когда происходит повторное отображение, открытое состояние остается открытым, но диалоговое окно отображает открытую анимацию (постепенное появление), что несколько раздражает.
Студенты. js (родительский компонент модального)
const Students = ({
app: { studentsPage: { savedAddDialogOpen }},
setStudentsPageAddDialogOpen}) => {
// Create the local states
const [dialogOpen, setDialogOpen] = React.useState(savedAddDialogOpen);
const dialogOpenRef = React.useRef(savedAddDialogOpen);
// Change redux dialog open
const setReduxDialogState = () => {
setStudentsPageAddDialogOpen(dialogOpenRef.current, savedAddDialogOpen);
};
// Open add student dialog
const dialogClickOpen = () => {
setDialogOpen(true);
dialogOpenRef.current = true;
setTimeout(() => setReduxDialogState(), 300);
};
// Close add student dialog
const dialogClose = () => {
setDialogOpen(false);
dialogOpenRef.current = false;
setTimeout(() => setReduxDialogState(), 300);
};
return (
<Container>
{/* Add student modal */}
<AddStudentModal dialogOpen={dialogOpen} dialogClose={dialogClose} />
</Container>
)
}
// Set the state for this component to the global state
const mapStateToProps = (state) => ({
app: state.app,
});
AddStudentModal. js
const AddStudentModal = ({
dialogOpen, dialogClose
}) => {
return (
<Dialog
open={dialogOpen}
>
{/* Lots of stuff*/}
<DialogActions>
<Button onClick={dialogClose}>
Close dialog
</Button>
</DialogActions>
</Dialog>
)
};
Надеюсь, этого должно быть достаточно. Я попытался проверить, действительно ли открытое состояние действительно правильно, когда происходит повторное рендеринг, и это правильно каждый раз, но похоже, что диалог закрывается при повторном рендеринге, независимо от того, что такое открытое состояние, и только спустя несколько мс фактически замечает, что оно должно быть открытое.
Любая помощь будет принята с благодарностью.
Редактировать 1: Обнаружено, что она не имеет никакого отношения к открытому состоянию, полученному из избыточного кода, если я использую open = {true}, она все еще мигает, так что, вероятно, проблема с самим Material-UI?
Редактировать 2: PrivateRoute. js
const PrivateRoute = ({
auth: { isAuthenticated, loadingAuth },
user: { loggedInUser },
component: Component,
roles,
path,
setLastPrivatePath,
...rest
}) => {
useEffect(() => {
if (path !== '/dashboard' && path !== '/profile') {
setLastPrivatePath(path);
}
// Prevent any useless errors with net line:
// eslint-disable-next-line
}, [path]);
// If we are loading the user show the preloader
if (loadingAuth) {
return <Preloader />;
}
// Return the component (depending on authentication)
return (
<Route
{...rest}
render={props =>
!isAuthenticated ? (
<Redirect to="/login" />
) : (loggedInUser && roles.some(r => loggedInUser.roles.includes(r))) ||
roles.includes('any') ? (
<Component {...props} />
) : (
<NotAuthorized />
)
}
/>
);
};
// Set the state for this component to the global state
const mapStateToProps = state => ({
auth: state.auth,
user: state.user
});