Highlight Possible Necessity of keys for Conditional Rendering
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ả
Motivation
Keys may be necessary outside the context of any "list" or array, especially when using conditional rendering. This isn't emphasized enough in the docs, and examples (therein and elsewhere) tend to lead to a false association between keys as having directly to do with map(), <li> elements, or JavaScript arrays. As I understand it, at its root, keys have to do with children, and type correspondence based on position during reconciliation.
Related issues such as https://github.com/reactjs/reactjs.org/issues/79 don't seem to directly address this.
Personal Experience
Most recommendations I find online seem to boil down to "use keys when using map()"(or <li> or arrays). It's rare to find a discussion related to conditional rendering and most people tend to be unaware of it.
I've been in a project wherein conditional rendering was heavily used, which led to a hard to find bug due to the absence of keys.
Code snippet in render()
return (
<div>
{ this.state.showCounter2 ?
(
<React.Fragment>
<CounterWithLifeCycleLog name={'myCounter1'}
counter={0} />
<CounterWithLifeCycleLog name={'myCounter2'}
counter={this.state.counter2} />
<CounterWithLifeCycleLog name={'myCounter3'}
counter={0} />
</React.Fragment>
) : (
<React.Fragment>
<CounterWithLifeCycleLog name={'myCounter1'}
counter={0} />
<CounterWithLifeCycleLog name={'myCounter3'}
counter={0} />
</React.Fragment>
)
The above code has a bug. When this.state.showCounter2 moves from true to false myCounter3 will be unmounted instead of myCounter2. Then the new myCounter3 will reuse the backing instance of myCounter2, maintaining its internal state.
It is true that this could be avoided by using the following instead:
&& <CounterWithLifeCycleLog name={'myCounter2'}
counter={this.state.counter2} />
The former example, however, is valid conditional rendering as well.
Proposed solution
An explicit mention of this confusion, an example involving conditional rendering (not using <li>, map(), or arrays), and perhaps a link to this blog post and perhaps the How to force remounting on React components related stackoverflow question.
Also, currently, all warnings related to keys seem to either have to do with arrays or iterators, perhaps a light warning when using conditional rendering could be helpful (though I can see how this will add way too much clutter), or some way to incorporate it into existing warnings.
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- 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.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tìm các phần trong tài liệu React giải thích về keys, lists và reconciliation. Sử dụng ví dụ conditional rendering được cung cấp để làm rõ sự khác biệt với map(), list items và arrays. Công việc được hoàn tất khi tài liệu giải thích rõ keys quan trọng trong conditional rendering vào những thời điểm nào và bao gồm một ví dụ riêng; mọi thay đổi đối với cảnh báo được xem là phạm vi tùy chọn.
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ó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100