- vừa được xem lúc

Các phương pháp tránh hiển thị lại các component dùng chung trong Nextjs ( Part 1 )

0 0 24

Người đăng: Moe Moe

Theo Viblo Asia

Đặt vấn đề

Trong Nextjs ta biết rằng khi ta di chuyển các page bằng cách nhấp vào một liên kết, Nextjs sẽ hiển thị lại toàn bộ giao diện người dùng bằng các xóa bỏ toàn bộ page cũ và thay vào đó 1 page mới.
Điều này đặt ra một vấn đề, nếu ta có một component dùng chung giữa các page, và ta không muốn nó bị xóa đi và hiển thị lại khi di chuyển giữa các page đó thì ta phải xử lý thế nào ?
Đầu tiên ta hãy xem qua ví dụ dưới đây:

Ví dụ đặt ra

Ta sẽ tạo một project có cấu trúc như sau:

Trong đó:

const LabelLayout = (props) => { return ( <div> <h1>Day la phan tu dung chung</h1> {props.children} </div> )
} export default LabelLayout;

import { useState } from 'react'; const InputLayout = () => { const [inputState, setInputState] = useState(''); const handleInputChange = (e) => { setInputState(e.target.value); } return ( <div> <input type='text' value={inputState} onChange={handleInputChange} /> </div> )
} export default InputLayout;

import '../styles/globals.css' function MyApp({ Component, pageProps }) { return <Component {...pageProps} />
} export default MyApp

import LabelLayout from '../components/LabelLayout';
import InputLayout from '../components/InputLayout';
import Link from 'next/link'; export default function Home() { return ( <LabelLayout> <InputLayout> <br /> <br /> <h2>Day la Page Home</h2> <Link href='/user' passHref> <button>Sang page User</button> </Link> </InputLayout> </LabelLayout> )
}

import LabelLayout from '../components/LabelLayout';
import InputLayout from '../components/InputLayout';
import Link from 'next/link'; export default function User() { return ( <LabelLayout> <InputLayout> <br /> <br /> <h2>Day la Page User</h2> <Link href='/' passHref> <button>Sang page Home</button> </Link> </InputLayout> </LabelLayout> )
}

Project sẽ có 2 page home và user, cả 2 đều có 2 component chung là LabelLayout và InputLayout.
Ta thấy rằng, nếu ta chuyển từ trang home sang user ( hay ngược lại ) 2 component chung LabelLayout và InputLayout đều bị xóa đi và hiển thị lại, do 2 component nằm bên trong page, nếu page thay đổi nextjs sẽ loại bỏ toàn bộ phần tử của page và thay vào một page mới, kể cả các phần tử trong các page giống hệt nhau.
Bây giờ ta sẽ đến cách giải quyết nó ?

Cách 1: Ném hết component chung vào file _app.js

Như tiêu đề trên, ta sẽ ném 2 component chung LabelLayout và InputLayout vào _app.js, và xóa chúng trong file index và user đi.

import '../styles/globals.css'
import LabelLayout from '../components/LabelLayout';
import InputLayout from '../components/InputLayout'; function MyApp({ Component, pageProps }) { return( <LabelLayout> <InputLayout> <br /> <br /> <Component {...pageProps} /> </InputLayout> </LabelLayout> ) } export default MyApp

import Link from 'next/link'; export default function Home() { return ( <div> <h2>Day la Page Home</h2> <Link href='/user' passHref> <button>Sang page User</button> </Link> </div> )
}

import Link from 'next/link'; export default function User() { return ( <div> <h2>Day la Page User</h2> <Link href='/' passHref> <button>Sang page Home</button> </Link> </div> )
}

Khi chạy ta sẽ thấy nó không còn bị hiển thị lại hai component LabelLayout và InputLayout, vì nó nằm ngoài các page và không bị hủy kéo theo khi page bị hủy và thay bằng page khác.
Bằng cách này nó đã giải quyết được vấn đề đưa ra, nhưng nó vẫn tồn tại điểm yếu:

Điểm yếu

Vì các component này được đặt ở _app.js, do đó mọi page đều sẽ hiển thị các component này, nếu ta muốn một số page hiển thị các component chung khác nhau hay không hiển thị component chung, cách này hiện đang không giải quyết được, do đó cách này chỉ sử dụng khi có các component được chia sẻ cho mọi page.
Để xử lý điểm yếu này ta sẽ xem ở phần sau nhé.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Viết một chiếc app quản lý Hạn sử dụng của thực phẩm

Mở đầu. Tôi là 1 kỹ sư công nghệ thông tin mới ra trường. Trong thời gian học Đại học, từ năm 1 tới năm 4, tôi đi làm thêm tại TSUTAYA (chuỗi cửa hàng bán sách, video...v.v nổi tiếng bên Nhật). Về chiếc App tôi đã phát triển. App tôi phát triển là Web App giúp quản lý hạn sử dụng của đồ ăn.

0 0 40

- vừa được xem lúc

Routing trong Next.js

Trước đó bạn có thể đang tò mò về Next.js, vào đây luôn bạn ơi. (go). .

1 0 44

- vừa được xem lúc

Cài đặt chuyển đổi ngôn ngữ trong một project NextJS

Ở phiên bản Nextjs Version 10 mới đây, việc sử dụng i18n đã trở nên dễ dàng hơn qua tính nâng cao là Internationalized Routing. Cài đặt cấu hình cơ bản. Tại file next.config.

0 0 55

- vừa được xem lúc

Cấu hình eslint airbnb, prettier cho dự next.js sử dụng typescript

Chào mọi, mình đã quay lại đây. Hôm nay mình sẽ đem đến một chủ đề linter cụ thể cấu hình eslint cho dự án next.

0 0 177

- vừa được xem lúc

Handling custom page navigation on Next.js

Last month we discussed about different kind of routing on Next.js. Here's a short example of creating a component that moves the user to next page. import { useRouter } from 'next/router'.

0 0 71

- vừa được xem lúc

Next Image một feature, một nâng cấp tuyệt vời version nextjs 10

NextJS đã cho ra mắt version 10 cách đây 2 tháng với hơn 20 fearture nâng cấp đáng giá. Chúng ta có thể kể ra những features nổi bật như. . Next/Image: với khẳ năng render image cho các kích thước màn hình tương ứng.

0 0 49