Gần đây mình có tìm hiều về React, trong quá trình tìm hiểu mình thấy Props và State được sử dụng khá nhiều. Vậy chúng là gì và khác nhau như thế nào, cùng tìm hiểu trong bài viết này nhé!

1. Props là gì?

Props là từ viết tắt của properties, Ở trong React nó là một đối tượng lưu trữ giá trị của attribute trong component, Các componnet có thể nhận được các giá trị của attribute được truyền từ bên ngoài vào đây là cách mà các component giao tiếp với nhau.

Ví dụ:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="ReactJS" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);

Với ví dụ trên, dòng <Welcome name="ReactJS" /> tạo ra một Component Welcome và attribute có value là ReactJS, ở bên trên chúng ta có 1 function component trả về Hello, {props.name} và như vậy, {props.name} sẽ cho chúng ta giá trị là ReactJS mà Component Welcome truyền vào, và cuối cùng thì khi render sẽ ra đoạn : Hello, ReactJS. Giống như là 1 cách gọi hàm trong javascript đúng không nhỉ 😄

Props có thể được thay đổi bằng cách sử dụng hàm setProps hay replaceProps, nhưng không được React khuyến khích (Props are Read-Only)

2. State là gì?

Cũng giống như props, state cũng lưu trữ thông tin về component, nhưng là lưu trữ dữ liệu động của một component.

State là dữ liệu động, khi có sự thay đổi giá trị thì component sẽ được render lại

State chỉ được sử dụng ở phạm vi trong component sinh ra nó, có nghĩa là bạn không thể sử truy cập giá trị state của component A ở trong component B, mà thay vào đó bạn cần phải sử dụng props để truyền giá trị trong state của component A sang B

Hãy cùng mình xem xét ví dụ sau đây nhé:

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    this.setState({
      date: new Date()
    });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

Đoạn code sẽ hoạt động như sau:

  • Component khởi tạo và khởi tạo luôn State với date = current time
  • Sau khi Compnent khởi tạo với giá trị state được khởi tạo thì componentDidMount sẽ chạy và khởi tạo interval và gán nó cho this.Timer
  • Sau khi interval chạy thì sẽ update State mỗi giây bằng method this.setState()
  • State thay đổi sẽ raise sự kiện change và render sẽ update UI mới nhất.
  • Trước khi chúng ta rời khởi page thì function componentWillUnmount() sẽ chạy và clear interval

3. So sánh giữa State và Props

Props State
Có thể nhận giá trị ban đầu từ component cha Yes Yes
Có thể thay đổi bởi component cha Yes No
Có thể set giá trị mặc định bên trong component Yes Yes
Có thể thay đổi bên trong component No Yes
Có thể set giá trị ban đầu cho các component con Yes Yes
Có thể thay đổi trong các component con Yes No

Tóm lại props dùng để truyền data từ component này sang component khác, Props không thể thay đổi giá trị, read-only và immutable

State chứa local data của component, có thể thay đổi giá trị, chỉ được sử dụng trong phạm vi component của chính nó, mỗi component sẽ có một state riêng của nó

Hi vọng với bài viết này sẽ giúp các bạn hiểu thêm về props và state và có gì chưa đúng mong các bạn góp ý 😄