JavaScript Proxy, Reflect và câu chuyện reactive

Tram Ho

Bài toán

Giả sử chúng ta có công thức tính tổng số tiền dựa vào số lượng và giá của sản phẩm như sau:

Nếu chúng ta thay đổi giá của sản phầm

Thì lúc này total vẫn bằng 10. Bởi vì đó là cách mà javascript hoạt động.

Vậy có cách nào để làm giá trị của total này trở nên reactive. Tức là giá trị của nó sẽ thay đổi dựa vào pricequantity? Chúng ta hãy cùng xem tiếp bài viết nhé ❤️

Lời giải

Mình sẽ đặt phép tính total ở trên trong một hàm và tạm gọi nó là một effect

Như vậy, để giải quyết bài toán trên, chúng ta sẽ tìm cách chạy lại hàm effect này mỗi khi pricequantity thay đổi.

Và để làm được điều đó, chúng ta sẽ định nghĩa pricequantity trong một object. Kiểu như sau:

effect của chúng ta sẽ trở thành

Tiếp theo chúng ta sẽ lặp qua từng property trong state object và sử dụng Object.defineProperty để định nghĩa lại gettersetter cho state như sau:

Như vậy, khi chúng ta gán giá trị state.price = 10 chẳng hạn thì nó sẽ chạy lại hàm effect.

Và thế là total được update!

Hơn nữa, chúng ta có thể tạo ra một hàm để sử dụng lại cho các object khác như sau:

state của chúng ta sẽ như sau:

OK, ngon lành rồi.

Mà khoan, xong rồi sao. Sao chưa thấy nói gì đến Proxy ?

Đây!. Với Proxy chúng ta có thể định nghĩa lại hàm reactive một cách ngắn gọn hơn như sau:

Và nếu dùng Reflect:

Bây giờ nếu khởi tạo state bằng reactive, chúng ta sẽ thu được một Proxy như sau:

OK, xịn xò.

Thật ra Proxy không chỉ giúp cho code của chúng ta ngắn gọn hơn mà còn giúp trong việc xử lý reactive với array,…

Ở bài viết này, mình chỉ giới thiệu khái quát một phần về reactive. Chúng ta có thể thấy effect trong thực tế cũng phải được lưu lại và tính toán như thế nào đó để có thể sử dụng nhiều effect cùng lúc.

Bài viết đến đây thôi, thật ra mình cũng không hiểu lắm đâu. Các bạn có thể tìm hiểu kỹ hơn ở link bên dưới nhé. Chúc các bạn thành công ❤️

Tài liệu tham khảo

https://www.vuemastery.com/courses/vue-3-reactivity/vue3-reactivity
https://www.vuemastery.com/courses/advanced-components/build-a-reactivity-system

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo