Sayfa sunucu tarafında işlenir ve kullanıcı arabiriminde titreşim değişikliklerini önlemek için bana Next.js kullanarak bana gönderilmeden önce kullanıcı giriş olup olmadığını bilmek gerektiğinde bir durum var.
Kullanıcının zaten bu HOC bileşenini kullanarak giriş yaptığında bazı sayfalara erişmesini nasıl önleyebileceğimi anlayabildim ...
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;
};
Ve bu harika çalışıyor.
Şimdi, etrafına sarmak için benzer bir HOC bileşenini nasıl oluşturabilirim "_app.tsx" diyelim, böylece "userAuthenticated" prop'ı her sayfaya geçirebilirim ve süresinin dolup dolmadığını belirleyip Bu pervane bu sinir bozucu titreme etkisi olmadan kullanıcıya uygun UI gösterebilir?
Umarım bana bu konuda yardımcı olabilirsiniz, yukarıdaki HOC'yi aynı şekilde yapmayı denedim, ama yapamadım, özellikle, Typcript'in garip hatalarıyla bunu daha kolay hale getirmediği :(
Edit == ==========================================
Böyle bir HOC bileşeni oluşturmak ve profesyonel userAuthenticated
gibi bu gibi her sayfaya geçmek başardı ...
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;
};
Ancak pervane userAuthenticated
sahip olduğum küresel düzeni geçmek için her HOC ile bu tek sayfa sarmak zorunda kaldı , çünkü onunla "_app.tsx" sınıf bileşeni saramadı, her zaman bana bir Hata verir. ..
Bu çalışıyor ...
export default isAuthenticated(Home);
export default isAuthenticated(about);
Ama bu ...
export default withRedux(configureStore)(isAuthenticated(MyApp));
Bu nedenle, bunu her bir sayfaya yapmak ve daha sonra "_app.tsx" de bir kez yapmak yerine her bir sayfadaki pervane genel düzenine geçmek biraz can sıkıcı bir durum.
Ben "_app.tsx" bir sınıf bileşeni ve sayfaların geri kalanı gibi bir işlev bileşeni değil çünkü nedeni tahmin ediyorum? Bilmiyorum, sadece tahmin ediyorum.
Bununla ilgili herhangi bir yardım?
ReactJS
ne Fonksiyonel Programlama ne de OOP izler, ama ben OOP düşünceleri ile kod size arka uç gelişimi zihniyet görüyorum. Başka bir bileşenden yeni bir sınıf miras alın! “Daha önce hiç böyle görmedim.