2015-12-02 8 views
5
साथ ES6 (? 7) में .bind बचें

मैं अपने JSX में यह है:कोलाहल

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

हालांकि, मैं कसम खाता हूँ मैं कुछ fanciness देखा है जब कॉलबैक तरीकों के लिए नीचे गुजर .bind के लिए की जरूरत नकारना करने के लिए बच्चे प्रतिक्रिया घटक, क्या मैं सही हूँ?

+1

संभावित डुप्लिकेट [क्या मैं वर्ग विधियों में ES6 वसा तीर का उपयोग कर सकता हूं?] (Http://stackoverflow.com/questions/31362292/can-i-use-es6-fat-arrow-in-class-methods) – Bergi

+0

@ बर्गि क्या यह एक डुप्लिकेट है? मुझे नहीं पूछ रहा हूँ कि कैसे मैं वर्ग के तरीकों में वसा तीर का उपयोग कर सकते हैं, लेकिन मैं एक्स प्राप्त करने के लिए क्या उपयोग कर सकते हैं यह सिर्फ वसा तीर निकला जवाब था ... – benhowdle89

+0

हाँ, सवाल का शीर्षक नहीं बिल्कुल वैसा ही है, लेकिन तीर फ़ंक्शन लग रहा था जो आप खोज रहे थे। क्या आपको लगता है कि "[React.js ES6 प्रत्येक विधि के लिए 'यह' बाध्यकारी से बचें] (http://stackoverflow.com/q/32192682/1048572)" एक बेहतर डुप्लिकेट है? – Bergi

उत्तर

5

आप उपयोग कर सकते हैं एक arrow function संपत्ति आरंभीकरण के साथ संयुक्त।

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

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

तीर समारोह निर्माता के दायरे में घोषित किया गया है, और क्योंकि तीर कार्यों उनकी घोषणा के दायरे, यह सब काम करता है से this बनाए रखें। यहां नकारात्मकता यह है कि ये प्रोटोटाइप पर काम नहीं करेंगे, वे सभी को प्रत्येक घटक के साथ पुनर्निर्मित किया जाएगा। हालांकि, bind के बाद से यह एक नकारात्मक बात नहीं है।

+0

यह अगर बेहतर होगा आप स्पष्ट रूप से इसे प्रयोगात्मक वर्ग संपत्ति चीज़ का उपयोग करने के बजाय, कन्स्ट्रक्टर में डालते हैं :-) – Bergi

+1

@ बर्गि यह बेहतर क्यों है? ओप ने विशेष रूप से ईएस 7 और बेबेल का उल्लेख किया, जो यह काम करता है। – Tyrsius

+0

क) कम भ्रम - आप की जरूरत नहीं होगी कि यह निर्माता की गुंजाइश ख में है उल्लेख करने के लिए) सभी "ES7" वर्तमान में केवल प्रस्ताव हैं और कोलाहल प्लगइन्स प्रयोगात्मक – Bergi

0

आप एक घटक इस autoBind सहायक समारोह के साथ ES2015 वर्ग सिंटेक्स के उपयोग के सभी कार्यों को बाध्य कर सकते हैं:

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"); 
} 

ध्यान दें कि Component तीर कार्यों के साथ परिभाषित तरीकों का उपयोग करने के लिए नहीं है।

+0

यह 'bind' के लिए की जरूरत नकारना नहीं है के रूप में ओ पी का अनुरोध किया – Tyrsius

संबंधित मुद्दे