2016-10-10 7 views
14

प्रतिक्रिया करने के लिए नया और ऑब्जेक्ट विशेषताओं को लूप करने का प्रयास कर रहा है लेकिन प्रतिक्रिया के बारे में शिकायत शिकायत मान्य नहीं है बच्चे, क्या कोई मुझे इस समस्या को हल करने के बारे में कुछ सलाह दे सकता है? मैंने createFragment जोड़ा है लेकिन पूरी तरह से यह सुनिश्चित नहीं है कि इसे कहां जाना है या मुझे क्या दृष्टिकोण लेना चाहिए?प्रतिक्रिया में किसी ऑब्जेक्ट को कैसे लूप करें?

जे एस

var tifs = {1: 'Joe', 2: 'Jane'}; 
var tifOptions = Object.keys(tifs).forEach(function(key) { 
    return <option value={key}>{tifs[key]}</option> 
}); 

समारोह प्रस्तुत

render() { 
     const model = this.props.model; 

     let tifOptions = {}; 

     if(model.get('tifs')) { 
      tifOptions = Object.keys(this.props.model.get('tifs')).forEach(function(key) { 
       return <option value={key}>{this.props.model.get('tifs')[key]}</option> 
      }); 
     } 

     return (
      <div class={cellClasses}> 

        <div class="grid__col-5 text--center grid__col--bleed"> 
         <h5 class="flush text--uppercase">TIF</h5> 
         <select id="tif" name="tif" onChange={this.handleChange}> 
          {tifOptions} 
         </select> 
        </div> 

      </div> 
     ); 
    } 

सांत्वना

If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) 
+0

मुझे इससे पहले की तरह एक ही त्रुटि मिली। '.map()' का उपयोग करना अजीब रूप से पर्याप्त मेरे लिए तय था। यह भी दिलचस्प था: http://stackoverflow.com/questions/37997893/promise-error-objects-are-not-valid-as-a-react-child –

उत्तर

33

करने में त्रुटि समस्या जिस तरह से आप forEach() का उपयोग कर रहे है, क्योंकि यह ALW होगा Ays वापसी undefined

var tifOptions = []; 

Object.keys(tifs).forEach(function(key) { 
    tifOptions.push(<option value={key}>{tifs[key]}</option>); 
}); 

अद्यतन:

var tifOptions = Object.keys(tifs).map(function(key) { 
    return <option value={key}>{tifs[key]}</option> 
}); 

आप अभी भी forEach() का उपयोग करना चाहते हैं, तो आप कुछ इस तरह कर दिया था: आप शायद map() विधि है, जो एक नई सरणी रिटर्न के लिए देख रहे :

:

आप ES6 लिख रहे हैं, तो आप एक ही बात एक arrow function का उपयोग कर neater थोड़ा पूरा कर सकते हैं

const tifOptions = Object.keys(tifs).map(key => 
    <option value={key}>{tifs[key]}</option> 
) 

यहाँ सभी विकल्पों को ऊपर उल्लेख दिखा एक बेला है: https://jsfiddle.net/fs7sagep/

+1

हम्म, इनमें से किसी भी का उपयोग कर प्रतिक्रिया त्रुटि invariant झंडे। जेएस: 38 अनचाहे Invariant उल्लंघन: ऑब्जेक्ट्स एक प्रतिक्रिया बच्चे के रूप में मान्य नहीं हैं (पाया: कुंजी के साथ वस्तु {})। यदि आप बच्चों का संग्रह प्रस्तुत करना चाहते हैं, तो इसके बजाय एक सरणी का उपयोग करें या रेक्ट ऐड-ऑन से createFragment (ऑब्जेक्ट) का उपयोग करके ऑब्जेक्ट को लपेटें। 'कन्स्ट्रक्टर 'की रेंडर विधि देखें। – styler

+0

क्या आप इसे इस तरह कर रहे हैं: https://jsfiddle.net/0fgv16dt/? – tobiasandersen

+0

आह! मेरी समस्या यह थी कि मैं model.get ('tifs') को Object.keys() में पास कर रहा था और यह पसंद आया !!! धन्यवाद! – styler

-2

मैं अत्यधिक आप एक वस्तु है, तो आप कर रहे हैं के बजाय एक सरणी का उपयोग करने का सुझाव देते हैं itteration प्रतिक्रिया है, यह एक वाक्य रचना मैं इसका इस्तेमाल OFEN है।

const rooms = this.state.array.map((e, i) =>(<div key={i}>{e}</div>)) 

तत्व का उपयोग करने के लिए, बस अपने जेएसएक्स में {rooms} रखें।

जहां ई = तत्वों के तत्व = i = अनुक्रमणिका। here और पढ़ें। यदि आप पुनरावृत्ति की तलाश में हैं, तो यह करने का यह तरीका है।

+0

किसी ऑब्जेक्ट का उपयोग करते समय, कुंजी अक्सर इंडेक्स की बजाय आईडी होती हैं। यदि, हालांकि, चाबियाँ सभी इंडेक्स हैं, तो मैं आपसे सहमत हूं। – tobiasandersen

+0

मैं आपकी टिप्पणी की सराहना करता हूं, लेकिन मैं किसी ऑब्जेक्ट के बारे में बात नहीं कर रहा हूं। सरणी के साथ काम करना मेरे लिए सबसे अच्छा लगता है और यह दस्तावेज़ों द्वारा भी प्रदान किया जाता है। कुंजी बिल्कुल असफल नहीं हैं, वे आपके तत्वों का क्रम रखने के लिए हैं। मैंने कुंजी के लिए इंडेक्स विधि का आविष्कार नहीं किया है, यह दस्तावेज़ों में लिखा गया है: पी – alex1997

+0

Arrays हमेशा सबसे अच्छा विकल्प नहीं होते हैं, भले ही वे अक्सर होते हैं।सामानों को कैश करते समय, मैं आमतौर पर मानचित्र: या वस्तुओं पर जाता हूं। और जब प्रतिक्रियाएं इंडेक्स पर आधारित कुंजी जोड़ती हैं, जब आप उन्हें स्पष्ट रूप से प्रदान नहीं करते हैं, तो निश्चित रूप से ऐसा करने के लिए मामलों का उपयोग किया जाता है। – tobiasandersen

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