ฉันมีกรณีเมื่อฉันต้องรู้ว่าผู้ใช้เข้าสู่ระบบหรือไม่ก่อนที่จะได้รับการแสดงผลด้านเซิร์ฟเวอร์และส่งกลับมาให้ฉันโดยใช้ Next.js เพื่อหลีกเลี่ยงการเปลี่ยนแปลงวูบวาบใน UI
ฉันสามารถหาวิธีป้องกันไม่ให้ผู้ใช้เข้าถึงบางหน้าได้ถ้าเขาเข้าสู่ระบบแล้วโดยใช้ส่วนประกอบ 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" prop ไปยังทุก ๆ หน้าโดยรับโทเค็นและคิดออกว่ามันหมดอายุหรือไม่และขึ้นอยู่กับ prop นั้นฉันสามารถแสดง UI ที่เหมาะสมให้กับผู้ใช้โดยไม่มีเอฟเฟกต์กะพริบที่น่ารำคาญ?
ฉันหวังว่าคุณสามารถช่วยฉันได้ฉันพยายามทำแบบเดียวกับที่ฉันสร้าง HOC ข้างต้น แต่ฉันทำไม่ได้โดยเฉพาะที่ typescript ไม่ได้ทำให้สิ่งนี้ง่ายขึ้นด้วยข้อผิดพลาดแปลก ๆ :(
แก้ไข == ==========================================
ฉันสามารถสร้างองค์ประกอบ 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 รับคลาสใหม่จากส่วนประกอบอื่น! 😐ฉันไม่เคยเห็นแบบนี้มาก่อน