Trong các dự án thực tế, việc reset 1 component đặc biệt là 1 form là công việc thường xuyên phải làm.
Phương pháp đơn giản nhất là unmount 1 component (return null
) sau đó mount lại.
Nhưng có nhiều trường hợp mount lại gần như bất khả thi khi sử dụng react router.
React router sẽ tái sử dụng component một khi nó được mount, cho dù ở 2 route khác nhau.
Ví dụ như chúng ta có 2 route cho trang sửa sản phẩm và sửa sản phẩm liên quan:
/product/:id
/related-product/:relatedID/:id
Từ trang sửa sản phẩm, người dùng có thể click vào 1 sản phẩm liên quan để xem chi tiết hoặc chỉnh sửa.
Cả 2 URL này dùng chung một component là Product
Thông thường, việc fetch dữ liệu sẽ xảy ra trong componentDidMount
lifecycle method.
Rắc rối sẽ xảy ra khi di chuyển từ trang sản phẩm A qua trang sản phẩm B.
Form chứa thông tin đáng lý ra của sản phẩm B sẽ hiện thông tin của sản phẩm A trước đó do Product component được tái sử dụng chứ không được huỷ rồi mount lại do đó hàm componentDidMount
sẽ không được gọi.
Để giải quyết vấn đề này, React cung cấp 1 tính năng mà ít ai để ý tới, đó là key
property.
key
property là 1 property bắt buộc khi render 1 danh sách component dùng vòng lặp.
key
they đổi thì component sẽ được render lại, đó là tất cả những gì chúng ta cần.
Thay vì định nghĩa route như thông thường:
<Route path="/product/:id" component={Product} />
<Route path="/related-product/:relatedID/:id" component={Product} />
Ta sẽ dùng render
thay cho component
<Route
path="/product/:id"
render={props => <Product {...props} key={props.match.params.id}/>}
/>
<Route
path="/related-product/:relatedID/:id"
render={props => <Product {...props} key={props.match.params.id}/>}
/>
Mỗi khi người dùng chuyển từ sản phẩm A qua sản phẩm B, id
sẽ thay đổi và component sẽ được render lại từ đầu, componentDidMount
sẽ hoạt động lại bình thường.
DONE