2014-12-30 5 views
11

में बाल घटकों पर ध्यान केंद्रित करने का क्लीनर तरीका मैं प्रतिक्रिया का उपयोग कर इनपुट की सूची में फोकस ऊपर और नीचे स्थानांतरित करने के लिए तीर कुंजियों का उपयोग करने के लिए एक क्लीनर तरीका जानने का प्रयास कर रहा हूं। सूची मूल घटक है, बच्चों को इनपुट करें। यह पता लगाने के लिए कि अगला इनपुट किस पर ध्यान केंद्रित किया जाना चाहिए, मैं प्रत्येक बच्चे को ref के साथ-साथ एक संख्यात्मक id दे रहा हूं जिसे मैं ऑर्डर करने के लिए उपयोग करता हूं। जब एक तीर कुंजी का पता लगाया जाता है, तो कॉलबैक तब बच्चे को सही ref के साथ पाता है और इनपुट को पकड़ने और इसे ध्यान देने के लिए उस बच्चे के refs में जाता है।प्रतिक्रिया

मैं प्रतिक्रिया में नया हूं, यह काफी गंदा लगता है, इस प्रकार मैं सोच रहा हूं कि क्लीनर समाधान है या नहीं।

कोड और काम jsfiddle:

var Child = React.createClass({ 
    handleUp: function(e) { 
     switch(e.key) { 
      case "ArrowDown": 
       this.props.handleFocus(this.props.id+1); 
      break; 
      case "ArrowUp": 
       this.props.handleFocus(this.props.id-1);    
      break; 
     } 
    }, 
    render: function() { 
     return <div><input defaultValue={this.props.name} onKeyUp={this.handleUp} ref="input" /></div>; 
    } 
}); 

var Parent = React.createClass({ 
    handleFocus: function(id) { 
     var child = this.refs['child' + id]; 
     if (!child) return; 
     var input = child.refs.input; 
     input.getDOMNode().focus(); 
    }, 
    render: function() { 
     var inputs = []; 
     for (var i=0; i<10; i++) { 
      inputs.push(<Child key={i} id={i} name={"value" + i} handleFocus={this.handleFocus} ref={'child' + i} />); 
     } 
     return <div> 
      {inputs} 
     </div>; 
    } 
}); 

http://jsfiddle.net/69z2wepo/509/

+0

इनपुट तत्वों पर बस एक सही टैब इंडेक्स सेट करना आसान नहीं होगा और उपयोगकर्ता को टैब कुंजी (पीछे की ओर Shift + टैब) के साथ इनपुट फ़ील्ड नेविगेट करना होगा, जो इसे करने का मानक तरीका है। http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#adef-tabindex –

+0

इस विशेष परिदृश्य के लिए मैं वास्तव में तीर कुंजियां लेना चाहता था लेकिन आम तौर पर टैब टैब एक हैं अच्छा विचार – mikhuang

+0

आपका jsfiddle काम नहीं करता – Soorena

उत्तर

1

ऐसा करने के कई तरीके हैं, लेकिन कोई भी इस से वास्तव में 'बेहतर' कर रहे हैं।

विकल्प एक मिश्रण का उपयोग करेंगे, लेकिन इससे छोटे लाभ के लिए ब्लैक बॉक्स अबास्ट्रक्शन की मानसिक लागत में आती है। मैं इसे बस रखता हूं।

+0

यह काफी उचित लगता है। यह 'अलग' आईडी घोषित करने के लिए अनावश्यक लगता है जब दोनों 'रेफरी' और 'कुंजी' वहां होते हैं। धन्यवाद! – mikhuang

+0

आप कुछ ऐसा कर सकते हैं "इसमें से कुछ: हैंडलफोकस = {this.handleFocus.bind (i)}, और फिर अपने हैंडल में फ़ोकस फ़ंक्शन दिशा को इंगित करने के लिए एक अतिरिक्त पैरामीटर स्वीकार करता है – BenG