2014-06-21 16 views
22

मैं कॉफीस्क्रिप्ट में कोड लिख रहा हूं क्योंकि मैं इसके साथ प्रतिक्रिया लिख ​​रहा हूं।
यहां बुनियादी संरचना है।ReactJS: बाल घटक के रेफरी तक कैसे पहुंचे?

{ div, input } = React.DOM 

Outer = React.createClass 
    render: -> 
    div { id: 'myApp' }, 
     Inner() 

Inner = React.createClass 
    render: -> 
    input { id: 'myInput', ref: 'myInput' } 

मैं जो एक शॉर्टकट दबाकर शुरू हो रहा है मेरी बाहरी वर्ग पर एक toggle विधि है। यह मेरे ऐप की दृश्यता को टॉगल करता है।
जब मेरे एप्लिकेशन दिखाई को छिपे हुए से चालू किए जाने पर, मैं इनपुट पर ध्यान केंद्रित करना चाहते हैं।

Outer = React.createClass 
    render: -> 
    ...... 

    hide: -> 
    @setState { visible: no } 

    show: -> 
    @setState { visible: yes } 

    $('#myInput').focus() # jQuery 
    # I want to do something like 
    # @refs.myInput.getDOMNode().focus() 
    # But @refs here is empty, it doesn't contain the refs in Inner 

    toggle: -> 
    if @state.visible 
     @hide() 
    else 
     @show() 

मैं इस तो क्या करते हो:

अब टॉगल तरीकों को और अधिक या इसके जैसे नहीं लग रही है?

उत्तर

25

refs को refs से बचने के बाद refs को घटक के एपीआई का हिस्सा नहीं माना जाता है। इसके बजाय आपको लगता है कि एक माता पिता के घटक द्वारा कहा जा सकता है, बुला यह focus मतलब हो सकता है Inner पर एक समारोह का पर्दाफाश करना चाहिए।

इसके अलावा, componentDidUpdate में तत्व ध्यान केंद्रित सुनिश्चित करने के लिए प्रतिपादन पूरा हो गया है:

{ div, input } = React.DOM 

Outer = React.createClass 
    render: -> 
    div { id: 'myApp' }, 
     Inner({ref: 'inner'}) 

    componentDidUpdate: (prevProps, prevState) -> 
    # Focus if `visible` went from false to true 
    if (@state.visible && !prevState.visible) 
     @refs.inner.focus() 

    hide: -> 
    @setState { visible: no } 

    show: -> 
    @setState { visible: yes } 

    toggle: -> 
    if @state.visible 
     @hide() 
    else 
     @show() 

Inner = React.createClass 
    focus: -> 
    @refs.myInput.getDOMNode().focus() 

    render: -> 
    input { id: 'myInput', ref: 'myInput' } 
2

इस मामले समाधान सरल है में, आप ऑटोफोकस के लिए इनपुट, जिसमें प्रतिक्रिया यह केंद्रित है जब यह प्रदान की गई है बता सकते हैं।

Inner = React.createClass 
    render: -> 
    input { ref: 'myInput', autoFocus: true } 

सामान्य तौर पर, आप इनर घटक के लिए एक आधार के पास करना चाहिए, और componentDidUpdate में आप कर सकते हैं:

if @props.something 
    @refs.myInput.getDOMNode().focus() 
+0

ऑटोफोकस मेरे लिए काम नहीं करता। असल में मैंने अभी 'घटकडिडअपडेट' के बारे में सोचा था और आपने जो कुछ सुझाव दिया था उसके समान कुछ करने की कोशिश की और यह काम किया। लेकिन मैं वास्तव में जानना चाहता हूं कि बाल घटकों के रेफरी तक पहुंचने का कोई आसान तरीका है या नहीं। रिएक्ट डॉक पर रेफरी उदाहरण शीर्ष घटक के अंदर एक इनपुट डालता है, लेकिन हकीकत में इनपुट आमतौर पर उप-घटकों के भीतर घोंसला होता है। – octref

+0

रेफरी केवल उस घटक में प्रयोग योग्य हैं जहां उन्हें परिभाषित किया गया है। अगर वे किसी भी बच्चे के घटक द्वारा सुलभ थे, तो आपको एक रेफरी के लिए अपना नाम मानना ​​होगा, किसी भी अन्य रेफरी के साथ संघर्ष नहीं करेगा। यदि आप रेफरी को हटाना चाहते हैं, या इसे बदलना चाहते हैं तो आपको हर दूसरे घटक को भी देखना होगा। इन मान्यताओं और जगह पर देखकर सबसे अच्छी तरह से बचाया जाता है। – FakeRainBrigand

3

आप कर सकते हैं श्रृंखला refs, इसलिए यदि आप रेफरी द्वारा एक तत्व खींच, आप कर सकते हैं

Outer = React.createClass render: -> div { id: 'myApp' }, Inner {ref: 'inner'}

के रूप में अपने Outer वर्ग को परिभाषित करते हैं: कि तत्व के अंदर हड़पने refs फिर आप focus पर कॉल करने के लिए @refs.inner.refs.myInput.getDOMNode() के साथ इनपुट को पकड़ें।

+1

आपके उत्तर के लिए धन्यवाद, लेकिन मैं @ssorallen का समाधान पसंद करता हूं, जो मुझे क्लीनर दिखता है। – octref

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