Tạo ra đối tượng state
Đối tượng state được khởi tạo trong constructor:
Ví dụ sau sẽ chỉ định đối tượng state trong phương thức constructor:
Đối tượng state có thể chứa bao nhiêu thuộc tính tùy thích:Ví dụ sau sẽ chỉ định tất cả các thuộc tính mà component cần:
Sử dụng đối tượng state
Chúng ta có thể tham chiếu đến đối tượng state từ bất cứ nơi đâu trong component bằng cách sử dụng cú pháp this.state.propertyname:
Ví dụ sau sẽ tham chiếu đến đối tượng state trong phương thức render():
Thay đổi giá trị trong đối tượng state
Để thay đổi một giá trị trong đối tượng state, chúng ta sử dụng phương thức this.setState().
Khi một giá trị trong đối tượng state thay đổi, thì component sẽ được render lại, có nghĩa là đầu ra sẽ thay đổi theo các giá trị mới.
Ví dụ sau sẽ thêm một button với sự kiện onClick, sự kiện này sẽ thay đổi thuộc tính color:
Lưu ý: Chúng ta hãy luôn luôn sử dụng phương thức setState() để thay đổi giá trị trong đối tượng state, nó sẽ đảm bảo rằng component biết nó đã được cập nhật và gọi phương thức render() (và tất cả các phương thức vòng đời khác).Vòng đời của các Component
Mỗi component của React đều có một vòng đời mà chúng ta có thể giám sát và điều khiển trong ba giai đoạn chính của nó.
Ba giai đoạn đó là: Thêm (Mounting), Cập nhật (Updating) và Xóa (Unmounting).
Giai đoạn thêm - Mounting
Giai đoạn thêm có nghĩa là đặt các phần tử vào trong DOM.
React có bốn phương thức dựng sẵn được gọi theo thứ tự sau, khi thêm một component vào DOM:
- constructor()
- getDerivedStateFromProps()
- render()
- componentDidMount()
Phương thức render() là bắt buộc và sẽ luôn luôn được gọi, các phương thức khác là tùy chọn và sẽ được gọi nếu như chúng ta định nghĩa chúng.
Phương thức constructor
Phương thức constructor() được gọi trước bất kỳ phương thức nào, khi component được khởi tạo, và nó là nơi tự nhiên để thiết lập state ban đầu và các giá trị ban đầu khác.
Phương thức constructor() được gọi với props, như là các đối số, và chúng ta sẽ luôn bắt đầu bằng cách gọi super(props) trước bất cứ thứ gì khác, điều này sẽ khởi tạo phương thức constructor của component cha và cho phép component của chúng ta kế thừa các phương thức từ component cha của nó(React.Component).
Trong ví dụ sau phương thức constructor được gọi, bởi React, mỗi lần chúng ta tạo ra một component:
Phương thức getDerivedStateFromProps
Phương thức getDerivedStateFromProps() được gọi ngay trước khi render các phần tử trong DOM.
Đây là nơi tự nhiên để thiết lập đối tượng state dựa vào props ban đầu.
Nó nhận state như là một đối số, và trả về một đối tượng với sự thay đổi ở đối tượng state.
Ví dụ bên dưới bắt đầu với favorite color là "red", nhưng phương thức getDerivedStateFromProps() cập nhật favorite color dựa vào thuộc tính favcol:
Trong ví dụ sau phương thức getDerivedStateFromProps được gọi ngay trước khi phương thức render được gọi:
Phương thức render
Phương thức render() là bắt buộc, và là phương thức thực sự xuất ra HTML cho DOM.
Ví dụ sau là một component đơn giản với một phương thức render():
Phương thức componentDidMount
Phương thức componentDidMount() được gọi sau khi component được render.
Đây là nơi mà chúng ta chạy các câu lệnh bắt buộc khi component đã được đặt vào DOM.
Trong ví dụ sau lúc đầu favorite color là red, nhưng chúng ta hãy đợi một giây, favorite color sẽ được chuyển thành yellow:
Giai đoạn cập nhật - Updating
Giai đoạn tiếp theo trong vòng đời là khi một component được cập nhật.
Một component được cập nhật bất cứ khi nào có một sự thay đổi trong state hoặc props của component.
React có năm phương thức dựng sẵn được gọi theo thứ tự sau, khi một component được cập nhật:
- getDerivedStateFromProps()
- shouldComponentUpdate()
- render()
- getSnapshotBeforeUpdate()
- componentDidUpdate()
Lưu ý: Phương thức render() là bắt buộc và sẽ luôn luôn được gọi, các phương thức khác là tùy chọn và sẽ được gọi nếu như chúng ta định nghĩa chúng.
Phương thức getDerivedStateFromProps
Tại giai đoạn cập nhật phương thức getDerivedStateFromProps cũng được gọi. Đây là phương thức đầu tiên được gọi khi một component được cập nhật.
Đây vẫn là nơi tự nhiên để thiết lập đối tượng state dựa vào props ban đầu.
Ví dụ bên dưới có một button thay đổi favorite color thành blue, nhưng vì phương thức getDerivedStateFromProps() được gọi, nên nó sẽ cập nhật state với màu sắc từ thuộc tính favcol, favorite color vẫn được render là yellow:
Trong ví dụ sau nếu như component được cập nhật, thì phương thức getDerivedStateFromProps() sẽ được gọi:
Phương thức shouldComponentUpdate
Trong phương thức shouldComponentUpdate() chúng ta có thể trả về một giá trị Boolean để chỉ định xem React có nên tiếp tục được render nữa hay không.
Giá trị mặc định của nó là true.
Ví dụ bên dưới cho thấy chuyện gì sẽ xảy ra khi phương thức shouldComponentUpdate() trả về giá trị false:
Ví dụ sau sẽ ngăn cản component khỏi render tại bất kỳ giai đoạn cập nhật nào:
Ví dụ tương tự như trên, nhưng lần này phương thức shouldComponentUpdate() sẽ trả về giá trị true:
Phương thức render
Phương thức render() tất nhiên là được gọi khi một component được cập nhật, nó phải render lại HTML cho DOM, với những sự thay đổi mới.
Ví dụ bên dưới có một button thay đổi favorite color thành blue:
Hãy click vào button để tạo ra một sự thay đổi trong đối tượng state của component:
Phương thức getSnapshotBeforeUpdate
Trong phương thức getSnapshotBeforeUpdate() chúng ta có quyền truy cập vào props và state trước khi cập nhật, có nghĩa là thậm chí sau khi cập nhật, chúng ta vẫn có thể kiểm tra xem trước khi cập nhật các giá trị của chúng là gì.
Nếu như phương thức getSnapshotBeforeUpdate() có mặt, thì chúng ta cũng sẽ phải bao gồm phương thức componentDidUpdate(), nếu không thì chúng ta sẽ gặp lỗi.
Ví dụ dưới đây có vẻ phức tạp, nhưng tất cả những gì nó làm là:
Khi component đang được thêm thì nó được render với favorite color là "red".
Khi component đã được thêm, thì một timer thay đổi state, và sau một giây, favorite color trở thành "yellow".
Hành động này kích hoạt giai đoạn cập nhật, và do component này có một phương thức getSnapshotBeforeUpdate(), nên phương thức này được thực thi, và ghi ra một thông báo vào phần tử trống DIV1.
Sau đó phương thức componentDidUpdate() được thực thi và ghi ra một thông báo trong phần tử trống DIV2:
Ví dụ sau sẽ sử dụng phương thức getSnapshotBeforeUpdate() để tìm hiểu xem đối tượng state trông như thế nào trước khi cập nhật:
Phương thức componentDidUpdate
Phương thức componentDidUpdate được gọi sau khi component được cập nhật trong DOM.
Ví dụ dưới đây có vẻ phức tạp, nhưng tất cả những gì nó làm là:
Khi component đang được thêm thì nó được render với favorite color là "red".
Khi component đã được thêm, thì một timer thay đổi state, và màu sắc trở thành "yellow".
Hành động này kích hoạt giai đoạn cập nhật, và do component này có một phương thức componentDidUpdate, nên phương thức này được thực thi và ghi ra một thông điệp trong phần tử DIV trống:
Trong ví dụ sau phương thức componentDidUpdate được gọi sau khi cập nhật đã được render trong DOM:
Giai đoạn xóa - Unmounting
Giai đoạn tiếp theo trong vòng đời là khi một component bị xóa khỏi DOM.
React chỉ có một phương thức dựng sẵn duy nhất được gọi khi một component bị xóa khỏi DOM:
Phương thức componentWillUnmount
Phương thức componentWillUnmount được gọi khi component sắp bị xóa khỏi DOM.
Chúng ta hãy click vào button để xóa header: