2016-02-05 11 views
6

Tôi là một chút bối rối, sự khác biệt giữa sintax đây là những gì:Phản hồi cách xóa danh sách chính xác trong componentWillUnmount, tại sao tôi cần liên kết trong hàm tạo?

constructor(props) { 
    super(props); 
    this.state = { 
     openPane: false 
    } 
    this.togglePaneHelper = this.togglePaneHelper.bind(this); 
    } 
    componentDidMount() { 
    document.body.addEventListener('click', this.togglePaneHelper); 
    } 
    componentWillUnmount() { 
    document.body.removeEventListener('click', this.togglePaneHelper); 
    } 

và một này:

constructor(props) { 
    super(props); 
    this.state = { 
     openPane: false 
    } 
    } 
    componentDidMount() { 
    document.body.addEventListener('click', this.togglePaneHelper.bind(this)); 
    } 
    componentWillUnmount() { 
    document.body.removeEventListener('click', this.togglePaneHelper); 
    } 

mối quan tâm của tôi là cú pháp thứ hai là không loại bỏ một cách chính xác các listner và nó gây ra cảnh báo này:

Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the undefined component. 

Trả lời

11

QUAN TRỌNG:

a.bind(this) !== a.bind(this) 

Theo MDN:

Các bind() phương pháp tạo một hàm mới rằng, khi được gọi, có nó từ khoá này thiết lập với giá trị cung cấp, với một chuỗi nhất định đối số trước bất kỳ khi nào hàm mới được gọi.

Cách tiếp cận đầu tiên của bạn ghi đè this.togglePaneHelper bằng chức năng mới, bị ràng buộc. Thứ hai loại bỏ chức năng nghe sự kiện khác nhau hơn nó đã được thêm vào - cả hai addEventListenerremoveEventListener phải có cùng một tham chiếu của hàm.

+0

Vì vậy, cách tiếp cận đầu tiên là phương pháp loại bỏ chính xác trình xử lý sự kiện? Mọi nhận xét về bài viết này: https://gist.github.com/Restuta/e400a555ba24daa396cc? – claireablani

+0

Có, cách tiếp cận đầu tiên hoạt động như dự định - giống như nó được thảo luận trong ý chính đó. –

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