2014-12-23 20 views
10

Tôi có một thành phần React.js đó được trả lại như vậy:React.js - componentWillReceiveProps bị trúng hai lần

<Social email={this.state.email} />; 

Có một số sự kiện trên trang đó cập nhật this.state.email, và kết quả là, đi qua làm , gửi một email mới cho thành phần Social.

Trong thành phần Social này, tôi nghe các bản cập nhật như sau:

componentWillReceiveProps: function(nextProps) { 
    console.log('received props update', nextProps.email); 
    this.doSomeWork(); 
    } 

Đó là dòng console đang được trả lại gấp đôi mà làm cho đèn flash UI hai lần cùng với các cuộc gọi đến các mạng xã hội.

tôi luôn luôn có thể làm điều gì đó như:

if (nextProps.email != this.props.email) { 
     this.doSomeWork(); 
    } 

Nhưng nó cảm thấy một chút hacky ...

là thông điệp đôi mong đợi? và nếu có, hãy tò mò tại sao?

Nếu không, cách tốt nhất để theo dõi và loại bỏ nó là gì?

+0

đúp khiến === cuộc gọi đôi, suy nghĩ lại vẽ của bạn. :) –

Trả lời

14

Thành phần Social của bạn có thể đang được hiển thị hai lần vì setState được gọi hai lần trên thành phần chính. Nó có thể được thiết lập các thuộc tính khác với email nhưng hàm render của bạn được gọi để thành phần Social hiển thị hai lần.

Bạn có thể thực hiện phương pháp shouldComponentUpdate trong thành phần Social để ngăn chặn vẽ thứ hai:

shouldComponentUpdate: function(nextProps, nextState) { 
    return nextProps.email != this.props.email; 
} 
+2

'shouldComponentUpdate' cảm thấy giống như một ban nhạc hỗ trợ, phải không? – brandonhilkert

+0

Trong 'componentWillReceiveProps', tôi đã in' this.props' và 'nextProps' và chỉ lần đầu tiên chúng khác nhau. Họ thứ hai render, họ là như nhau. 'ComponentWillReceiveProps' có nên chạy trên trạng thái thay đổi không? – brandonhilkert

+0

Không, bạn nên sử dụng 'componentWillUpdate' để thực hiện các hoạt động để đáp ứng với thay đổi trạng thái. Bạn có thể xem tài liệu ở đây: http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops – nilgun

Các vấn đề liên quan