reactjs / reactjs/react.dev

Confusing setState() documentation

Đang mở
#715 8 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
JavaScript
Star
11.8k
Fork
7.9k
Merge trung bình
1 ngày 11 giờ
Pull request đã merge (30 ngày)
11

Mô tả

I have a general question about setState() because the documentation about this is a little bit confusing:

I have a component with a state. This state should only be updated (re-rendered) when a condition met. If not then there is no need to re-render the component. Reading the docs about setState tells me that reading this.state right after calling setState() is a potential pitfall. Instead I should use setState with an updater function because there prevState is guaranteed to has the right value. So my first approach was:

class MyComponent extends React.Component {
  onSomething = () => {
    this.setState(prevState => {
      if (prevState.counter < 10) {
        return { counter: prevState.counter + 1 };
      }
      return prevState;
    });
  }
}

But with that approach my component always get re-rendered because setState() always forces a re-render (in the beginning I thought that when I return the same prevState object React does nothing. But I was wrong). So what else can I do to avoid re-rendering?

Again in the same doc we can read that calling setState() only when the new state differs from the previous state will avoid unnecessary re-renders. So I could re-write my code into following:

class MyComponent extends React.Component {
  onSomething = () => {
    if (this.state.counter < 10) {
      this.setState(prevState => {
        return { counter: prevState.counter + 1 };
      });
    }
  }
}

But then if (this.state.counter < 10) could have a different value than prevState.counter

So on the one side the docs recommend to not read from this.state directly because the calls to setState() could be batched and this.state has an outdated value but on the other side it recommends to call setState() only when the new state differs from the old state. But how can I check if the state differs when it could be potentially outdated?

In the end I don't know actually how to set my state and avoid a re-rerender when a condition met. Any help here would be great.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu với tài liệu setState() được liên kết và các ví dụ trong issue này, sau đó xác minh cách các hàm updater, batching và việc render lại được mô tả. Được xem là hoàn thành khi tài liệu giải quyết rõ ràng mâu thuẫn có vẻ tồn tại và giải thích cách tránh việc render lại không cần thiết khi điều kiện được đáp ứng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
javascript, react
Lĩnh vực
documentation
Loại issue
Tài liệu
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Cần làm rõ
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.