2015-12-02 19 views
5

Tôi có điều này trong JSX tôi:Tránh .bind trong ES6 (7?) Với Babel

<Options options={options} onOptionSelect={this.onOptionSelect.bind(this)} /> 

Tuy nhiên, tôi thề tôi đã nhìn thấy một số fanciness để phủ nhận sự cần thiết của .bind khi đi qua các phương thức callback xuống con Các thành phần phản ứng, tôi có đúng không?

+1

Có thể trùng lặp [Tôi có thể sử dụng mũi tên chất béo ES6 trong các phương pháp lớp không?] (Http://stackoverflow.com/questions/31362292/can-i-use-es6-fat-arrow-in-class-methods) – Bergi

+0

@ Bergi Có phải là bản sao không? Tôi không hỏi làm thế nào tôi có thể sử dụng mũi tên chất béo trong các phương pháp lớp học, nhưng những gì tôi có thể sử dụng để đạt được X. Nó chỉ hóa ra mũi tên béo là câu trả lời ... – benhowdle89

+0

vâng, tiêu đề của câu hỏi là không chính xác như nhau, nhưng chức năng mũi tên dường như là những gì bạn đang tìm kiếm. Bạn có nghĩ rằng "[React.js ES6 tránh ràng buộc 'điều này' với mọi phương pháp] (http://stackoverflow.com/q/32192682/1048572)" là một bản sao tốt hơn? – Bergi

Trả lời

5

Bạn có thể sử dụng số arrow function kết hợp với khởi tạo thuộc tính.

class Component extends React.Component { 
    handleClick =() => { 
    console.log(this.props); 
    } 

    render() { 
    return <div onClick={this.handleClick} /> 
    } 
} 

Bởi vì mũi tên hàm được khai báo trong phạm vi của các nhà xây dựng, và bởi vì mũi tên chức năng duy trì this từ phạm vi tuyên bố của họ, tất cả các công trình. Nhược điểm ở đây là những wont được chức năng trên nguyên mẫu, tất cả chúng sẽ được tái tạo với mỗi thành phần. Tuy nhiên, đây không phải là một nhược điểm kể từ khi kết quả bind trong cùng một điều.

+0

Sẽ tốt hơn nếu bạn đặt nó một cách rõ ràng trong hàm tạo, thay vì sử dụng thuộc tính lớp thử nghiệm đó thingy :-) – Bergi

+1

@Bergi Tại sao điều đó tốt hơn? Op đặc biệt đề cập đến ES7 và babel, mà điều này làm việc với. – Tyrsius

+0

a) ít nhầm lẫn - bạn sẽ không cần phải đề cập rằng nó nằm trong phạm vi của nhà xây dựng b) tất cả "ES7" hiện chỉ được đề xuất và các plugin babel là thử nghiệm – Bergi

0

Bạn có thể ràng buộc tất cả các chức năng của một thành phần sử dụng cú pháp lớp ES2015 với chức năng autoBind helper này:

class Component extends React.Component { 
    constructor(props) { 
    super(props); 
    autoBind(this); 
    } 

    onOptionSelect() { 
    // do stuff 
    } 

    render() { 
    return <Options options={options} onOptionSelect={this.onOptionSelect} />; 
    } 
} 

function autoBind(obj) { 
    getAllMethods(obj.constructor.prototype) 
     .forEach(mtd => { 
      obj[mtd] = obj[mtd].bind(obj); 
     }); 
} 

function getAllMethods(obj) { 
    return Object.getOwnPropertyNames(obj).filter(key => typeof obj[key] == "function"); 
} 

Lưu ý rằng Component không nhất thiết phải sử dụng phương pháp xác định với các chức năng mũi tên.

+0

Điều này không phủ nhận sự cần thiết của 'bind', như OP được yêu cầu – Tyrsius

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