UIがちらつくのを避けるために、ページがサーバー側でレンダリングされ、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」と言って、トークンを取得して「userAuthenticated」プロップをすべてのページに渡し、トークンが期限切れかどうか、およびその小道具は、ユーザーに適切なUIを表示できますが、そのちらつき効果はありませんか?
私は上記の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;
};
ただしuserAuthenticated
、「_ app.tsx」クラスコンポーネントをラップできないため、プロップをグローバルレイアウトに渡すために、このHOCですべてのページをラップする必要があり、常にエラーが発生しました。 ..
これは動作します...
export default isAuthenticated(Home);
export default isAuthenticated(about);
しかし、これはそうではありません...
export default withRedux(configureStore)(isAuthenticated(MyApp));
したがって、これをすべてのページで実行し、 "_ app.tsx"で一度だけ実行するのではなく、すべてのページでグローバルレイアウトにプロップを渡すのは少し面倒です。
「_app.tsx」がクラスコンポーネントであり、他のページのような関数コンポーネントではないため、理由が推測されるのではないでしょうか。わかりません、ただ推測しているだけです。
それで何か助けはありますか?
ReactJS
関数型プログラミングやOOPに従いますが、OOPの考えを使用したコードでのバックエンド開発の考え方を理解しています。別のコンポーネントから新しいクラスを継承します!before今まで見たことがなかった。