2017-01-11 19 views
3

這是我的反應組件類如何在click處理程序中獲取與event.target元素相對應的反應組件實例?

class TestInstance extends React.Component { 
    onClick(e) { 
     //When the user clicks in the button, 
     //I need to read the custom-id property here 
    } 

    render() { 
     return (
      <Wrapper onClickCapture={this.onClick}> 
       <div> 
        <button custom-data={{test: 'test data'}}>Click Me</button> 
       </div> 
      </Wrapper> 
     ); 
    } 
} 

在這裏,我聽包裝節點下發生的所有點擊事件。無論何時發生點擊,我都需要找出與e.target關聯的反應組件實例以及該實例的custom-data支持的值。 custom-data道具將會有多個此類兒童具有不同的值。每當這樣一個元素被點擊時,我想爲它的custom-data提取該元素的值,並做一些事情。在reactjs中做這件事的最好方法是什麼?一種方法是導航整個兒童樹,並與每個兒童的DOM元素共同製作身份標識實例。我還發現e._targetInst._currentElement.props給了我道具的價值。但我不知道這些無證變量有多可靠。是否有任何記錄的解決方案?基本上我正在尋找一些能讓我產生ReactDOM.findDOMNode的相反效果的東西。我已經有了一個DOM節點,我需要與之相關的React元素。

+0

我們缺少一些信息這裏。在你的示例代碼中,'custom-id'道具的值始終是'「btn」',除非你沒有共享的代碼正在改變這個值。我們缺少什麼? –

+0

@Jordan我只是舉了一個例子..會有一些其他孩子的'custom-id'屬性值不同。當他們中的任何一個被點擊時,我想提取他們的'custom-id'屬性的值,並用它做一些事情。 –

+1

'Wrapper'如何監聽其子女的所有點擊事件? –

回答

0

保存一個裁判,並檢查e.target是一樣的裁判

class TestInstance extends React.Component { 
    element = null; 

    onClick(e) { 
     //When the user clicks in the button, 
     //I need to read the custom-id property here 
     if (e.target === ReactDOM.findDOMNode(element)) { 
      // get custom id here 
     } 
    } 

    render() { 
     return (
      <Wrapper onClickCapture={this.onClick}> 
       <div> 
        <button ref={e => this.element = e} custom-id="btn">Click Me</button> 
       </div> 
      </Wrapper> 
     ); 
    } 
} 
+0

你可以使這個工作片段? –

+0

我有'custom-id'多個(約20-30)個節點。這種方法將需要manu變量來存儲參考。對於每一次點擊,我必須檢查整個集合 –

2

正如我在上面提到的意見,這是容易得多,如果你調用道具data-custom-id,而不是custom-id。這樣它將被呈現爲DOM屬性,您可以通過調用e.target.getAttribute('data-custom-id')來獲得它的值。你可以看到它在下面的代碼片段中工作。 (因爲你沒告訴我們的包裝組件的代碼我花了猜測的實現。)

class Wrapper extends React.Component { 
 
    componentDidMount() { 
 
    this.refs.wrap.addEventListener('click', this.props.onClickCapture, true); 
 
    } 
 
    componentDidUnmount() { 
 
    this.refs.wrap.removeEventListener('click', this.props.onClickCapture); 
 
    } 
 
    render() { 
 
    return <div ref="wrap">{this.props.children}</div>; 
 
    } 
 
} 
 

 
class TestInstance extends React.Component { 
 
    onClick(e) { 
 
    console.log('Clicked %s', e.target.getAttribute('data-custom-id')); 
 
    } 
 

 
    render() { 
 
    return (
 
     <Wrapper onClickCapture={this.onClick}> 
 
     <div> 
 
      <button data-custom-id="btn-1">Button 1</button> 
 
      <button data-custom-id="btn-2">Button 2</button> 
 
     </div> 
 
     </Wrapper> 
 
    ); 
 
    } 
 
} 
 

 
ReactDOM.render(<TestInstance/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="root"/>

+0

任何想法如何做到這一點'定製id'是一個JSON對象(除了字符串化)? –

+0

有幾種方法可以做到,但沒有一個是特別乾淨的。我會重新考慮你處理'click'事件的方式。而不是單個事件監聽器,我會給每個按鈕自己的'onClick',例如'

0

class Wrapper extends React.Component { 
 
    render() { 
 
    return (
 
     <div> 
 
     <button onClick = {()=>this.props.onCapture({'id':'1','name':'btn-1'})}>Button 1</button> 
 
     <button onClick = {()=>this.props.onCapture({'id':'2','name':'btn-2'})}>Button 2</button> 
 
     </div> 
 
    ) 
 
    } 
 
} 
 

 
class TestInstance extends React.Component { 
 
    onClick(expr) { 
 
    console.log(expr); 
 
    //console.log('Clicked %s', e); 
 
    } 
 

 
    render() { 
 
    return (
 
     <Wrapper onCapture={this.onClick}/> 
 
    ); 
 
    } 
 
} 
 

 
ReactDOM.render(<TestInstance/>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="root" />

+0

您可以爲每個按鈕分配事件處理程序,並將JSON作爲參數放到功能 –

+0

這只是事件處理..這不是我要找的 –

相關問題