⊗jsrxPmATTRC 55 of 57 menu

Hiển thị kết quả công việc của thunk trong component trong Redux

Ở bài học trước, chúng ta đã gửi một yêu cầu POST bằng thunk addProduct. Bây giờ hãy hiển thị kết quả công việc của nó trong component.

Hãy mở ứng dụng sản phẩm của chúng ta, và trong đó là file NewProductForm.jsx, vì component này chịu trách nhiệm cho việc thêm sản phẩm mới. Hãy xem các dòng import. Thay thế import của action productAdded, bằng import của thunk addProduct:

import { addProduct } from './productsSlice'

Bây giờ, vì chúng ta không theo dõi trong slice trạng thái 'pending' của yêu cầu, hãy làm sao để người dùng chỉ có thể nhấp vào nút lưu sản phẩm một lần, vì chúng ta không muốn các yêu cầu lặp lại giống nhau. Để làm điều này, hãy tạo thêm một local state:

const [requestStatus, setRequestStatus] = useState('idle')

Tiếp theo, sau các trình xử lý và trước hàm onSaveProductClick hãy viết mã, trong đó kiểm tra xem tất cả các trường của biểu mẫu có được điền đầy đủ không và trạng thái yêu cầu có đang ở 'idle' không:

const canBeSaved = [name, desc, price, amount, sellerId].every(Boolean) && requestStatus === 'idle'

Sau đó chúng ta sẽ thay đổi mã cho onSaveProductClick. Thứ nhất, đây sẽ là một hàm bất đồng bộ và nó sẽ thực thi, nếu điều kiện trên là đúng:

const onSaveProductClick = async () => { if (canBeSaved) {} }

Mặc dù chúng ta không theo dõi trạng thái 'rejected' trong slice, chúng ta vẫn có thể in lỗi ra console, để làm điều này hãy sử dụng cấu trúc try-catch. Ở đây chúng ta cũng sẽ thêm finally, để sau khi thực hiện yêu cầu lại đặt local state về 'idle':

const onSaveProductClick = async () => { if (canBeSaved) { try { } catch (err) { console.error('lỗi lưu sản phẩm: ', err) } finally { setRequestStatus('idle') } } }

Chúng ta đã xử lý xong các khối catchfinally, hãy viết mã cho khối try. Ở đây chúng ta sẽ đặt local trạng thái thành 'in progress', cho đến khi chúng ta nhận được một phản hồi nào đó từ kết quả công việc của thunk, sau đó gửi thunk addProduct của chúng ta. Việc sử dụng cấu trúc try-catch tùy thuộc vào loại phản hồi sẽ được hỗ trợ bởi hàm RTK unwrap, mà nó thêm vào promise được trả về. Sau đó, nếu yêu cầu thành công, chúng ta đặt các local state về trạng thái ban đầu của chúng. Mã đầy đủ cho onSaveProductClick sẽ trông như thế này:

const onSaveProductClick = async () => { if (canBeSaved) { try { setRequestStatus('in progress') await dispatch( addProduct({ name, desc, price, amount, seller: sellerId })).unwrap() setName('') setDesc('') setPrice(0) setAmount(0) setSellerId('') } catch (err) { console.error('lỗi lưu sản phẩm: ', err) } finally { setRequestStatus('idle') } } }

Hãy khởi chạy ứng dụng của chúng ta và thử thêm một sản phẩm mới. Như bạn thấy, trong trường hợp yêu cầu thành công các trường sẽ được làm sạch và sản phẩm mới được thêm vào danh sách sản phẩm. Cũng hãy xem trong trình duyệt Redux DevTools và di chuyển qua các tab của nó, xem các action và state của bạn thay đổi như thế nào.

Hãy mở ứng dụng sinh viên của bạn. Mở file NewStudentForm.jsx trong đó. Thêm một local state requestStatus nữa, và đặt nó ban đầu thành 'idle'. Sau khi tìm hiểu tài liệu bài học, hãy tạo biến canBeSaved, với sự trợ giúp của nó nút lưu dữ liệu sinh viên mới sẽ hoạt động/không hoạt động, tùy thuộc vào giá trị của requestStatus và việc điền đầy đủ các trường.

Hãy viết mã bất đồng bộ cho onSaveStudentClick, sẽ thay đổi giá trị của requestStatus theo tình huống, gửi thunk addProduct với dữ liệu sinh viên mới, làm sạch các trường trong trường hợp yêu cầu thành công và in ra console lỗi trong trường hợp thất bại, như được hiển thị trong bài học. Sử dụng cho việc này cấu trúc try-catch và hàm RTK unwrap.

Hãy khởi chạy ứng dụng của bạn, thêm một sinh viên mới và đảm bảo rằng mọi thứ hoạt động.

Tiếng Việt
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbek
Chúng tôi sử dụng cookie để vận hành trang web, phân tích và cá nhân hóa. Việc xử lý dữ liệu được thực hiện tuân theo Chính sách bảo mật.
chấp nhận tất cả tùy chỉnh từ chối