У мене є випадок, коли мені потрібно знати, чи користувач увійшов чи ні, перш ніж сторінка буде надана на сервер і повернена мені за допомогою Next.js, щоб уникнути зміни мерехтіння в інтерфейсі користувача.
Я зміг зрозуміти, як не допустити доступу користувача до деяких сторінок, якщо він уже ввійшов у систему за допомогою цього компонента HOC ...
export const noAuthenticatedAllowed = (WrappedComponent: NextPage) => {
const Wrapper = (props: any) => {
return <WrappedComponent {...props} />;
};
Wrapper.getInitialProps = async (ctx: NextPageContext) => {
let context = {};
const { AppToken } = nextCookie(ctx);
if (AppToken) {
const decodedToken: MetadataObj = jwt_decode(AppToken);
const isExpired = () => {
if (decodedToken.exp < Date.now() / 1000) {
return true;
} else {
return false;
}
};
if (ctx.req) {
if (!isExpired()) {
ctx.res && ctx.res.writeHead(302, { Location: "/" });
ctx.res && ctx.res.end();
}
}
if (!isExpired()) {
context = { ...ctx };
Router.push("/");
}
}
const componentProps =
WrappedComponent.getInitialProps &&
(await WrappedComponent.getInitialProps(ctx));
return { ...componentProps, context };
};
return Wrapper;
};
І це чудово працює.
Тепер, як я можу створити подібний компонент HOC, щоб обернути його, скажімо, "_app.tsx", щоб я міг передати "userAuthentication" опору на кожну окрему сторінку, отримавши маркер і зрозуміти, чи закінчився термін його дії чи ні, і на основі що я можу показати користувачеві належний інтерфейс користувача без цього дратівливого мерехтливого ефекту?
Я сподіваюся, що ви можете мені допомогти в цьому, я намагався зробити це так само, як я створив вищевказаний HOC, але я не міг цього зробити, тим більше, що Typescript не робить це легше своїми дивними помилками :(
Edit == ============================================
Я зміг створити такий компонент HOC і передати профі userAuthenticated
на кожну сторінку, як ця ...
export const isAuthenticated = (WrappedComponent: NextPage) => {
const Wrapper = (props: any) => {
return <WrappedComponent {...props} />;
};
Wrapper.getInitialProps = async (ctx: NextPageContext) => {
let userAuthenticated = false;
const { AppToken} = nextCookie(ctx);
if (AppToken) {
const decodedToken: MetadataObj = jwt_decode(AppToken);
const isExpired = () => {
if (decodedToken.exp < Date.now() / 1000) {
return true;
} else {
return false;
}
};
if (ctx.req) {
if (!isExpired()) {
// ctx.res && ctx.res.writeHead(302, { Location: "/" });
// ctx.res && ctx.res.end();
userAuthenticated = true;
}
}
if (!isExpired()) {
userAuthenticated = true;
}
}
const componentProps =
WrappedComponent.getInitialProps &&
(await WrappedComponent.getInitialProps(ctx));
return { ...componentProps, userAuthenticated };
};
return Wrapper;
};
Однак мені довелося обгортати кожну окрему сторінку цим HOC, щоб передати опору userAuthenticated
на глобальний макет, який у мене є, тому що я не міг обернути з ним компонент класу "_app.tsx", він завжди дає мені помилку. ..
Це працює ...
export default isAuthenticated(Home);
export default isAuthenticated(about);
Але це не ...
export default withRedux(configureStore)(isAuthenticated(MyApp));
Тож трохи надокучливо робити це для кожної сторінки, а потім передавати реквізит до глобального макета на кожній сторінці, а не просто робити це один раз у "_app.tsx".
Я здогадуюсь, що причина може бути в тому, що "_app.tsx" є компонентом класу, а не функціональним компонентом, як решта сторінок? Я не знаю, я лише здогадуюсь.
Будь-яка допомога в цьому?
ReactJS
слідкуйте за функціональним програмуванням, ані не за допомогою OOP, але я бачу, як у вас кодується думка про розвиток програми з думками OOP. Успадкуйте новий клас з іншого компонента! Я раніше такого не бачив.