Câu trả lời của @ jpdelatorre rất hay trong việc làm nổi bật những lý do chung tại sao một thành phần React có thể kết xuất lại.
Tôi chỉ muốn đi sâu hơn một chút vào một ví dụ: khi đạo cụ thay đổi . Khắc phục sự cố điều gì khiến thành phần React hiển thị lại là một vấn đề phổ biến và theo kinh nghiệm của tôi, rất nhiều lần theo dõi vấn đề này liên quan đến việc xác định đạo cụ nào đang thay đổi .
Phản ứng lại các thành phần kết xuất lại bất cứ khi nào họ nhận được đạo cụ mới. Họ có thể nhận được đạo cụ mới như:
<MyComponent prop1={currentPosition} prop2={myVariable} />
hoặc nếu MyComponent
được kết nối với một cửa hàng redux:
function mapStateToProps (state) {
return {
prop3: state.data.get('savedName'),
prop4: state.data.get('userCount')
}
}
Bất cứ lúc nào giá trị của prop1
, prop2
, prop3
, hoặc prop4
thay đổi MyComponent
sẽ tái render. Với 4 đạo cụ, không quá khó để theo dõi đạo cụ nào đang thay đổi bằng cách đặt một console.log(this.props)
ở đầu render
khối đó. Tuy nhiên với các thành phần phức tạp hơn và ngày càng có nhiều đạo cụ thì phương pháp này là không thể thực hiện được.
Dưới đây là một cách tiếp cận hữu ích (sử dụng lodash để thuận tiện) để xác định những thay đổi prop nào đang khiến một thành phần hiển thị lại:
componentWillReceiveProps (nextProps) {
const changedProps = _.reduce(this.props, function (result, value, key) {
return _.isEqual(value, nextProps[key])
? result
: result.concat(key)
}, [])
console.log('changedProps: ', changedProps)
}
Thêm đoạn mã này vào thành phần của bạn có thể giúp tiết lộ thủ phạm gây ra sự tái xuất đáng ngờ và nhiều lần điều này giúp làm sáng tỏ dữ liệu không cần thiết được đưa vào các thành phần.
shouldComponentUpdate
để vô hiệu hóa cập nhật thành phần tự động và sau đó bắt đầu theo dõi của bạn từ đó. Thông tin chi tiết có thể được tìm thấy ở đây: facebook.github.io/react/docs/optimizing-performance.html