2015-10-31 9 views
6

मैंने here से दो साल की पुरानी प्रतिलिपि बनाई है। यह अब फिग्हेल के साथ काम कर रहा है और अभिकर्मक/प्रतिक्रिया का एक नवीनतम संस्करण का उपयोग करता है। मैं इस चेतावनी संदेश को अलग करने का एक सामान्य तरीका ढूंढ रहा हूं जो जावास्क्रिप्ट कंसोल पर आता है: Warning: Every element in a seq should have a unique :key। विचार सभी घटकों में एक उत्पन्न अद्वितीय मूल्य के साथ :key डालना है। फिर संदेशों को गायब होना चाहिए और मैं यह देखने की स्थिति में रहूंगा कि किन घटकों को अद्वितीय :key की आवश्यकता है। मेरी समस्या यह है कि भले ही एक अद्वितीय :key उन सभी में डाल दिया जा रहा है, चेतावनी संदेश अभी भी देखा गया है।अभिकर्मक प्रतिक्रिया क्लोजरस्क्रिप्ट चेतावनी: एक सीक में प्रत्येक तत्व में एक अद्वितीय होना चाहिए: कुंजी

तो - क्या कोई मुझे बताएगा कि कौन सा घटक मैंने याद किया है या अन्यथा मैंने गलत क्या किया है? जैसा कि आप source (permalink) से देख सकते हैं मैंने दो घटकों में :key (gen-key) जोड़ा है: [:polyline {:key (gen-key) ... और [:svg {:key (gen-key) ... क्रमशः 43 और 68 पंक्तियों पर।

संपादित तो यह answer (permalink) कोड के मामले में वैसे भी है। लाइन 44 और 60 पर ^{:key (gen-key)} की नियुक्ति की तलाश करें।

ध्यान दें कि फ़ंक्शन gen-key डिबगिंग के लिए बनाया गया था। बदलने के लिए प्राकृतिक कुंजी।

(defn gen-key [] 
    (gensym "key-")) 

यहाँ और जिस तरह से ऊपर दिए गए लिंक में किया है::, बजाय मेटाडाटा के रूप में चाबी की तरह:

इस तरह आप gen-key लागू हो सकता है

(def uniqkey (atom 0)) 
(defn gen-key [] 
    (let [res (swap! uniqkey inc)] 
    (u/log res) 
    res)) 

उत्तर

10
पर Reagent Project site

(defn lister [items] 
    [:ul 
    (for [item items] 
    ^{:key item} [:li "Item " item])]) 

(defn lister-user [] 
    [:div 
    "Here is a list:" 
    [lister (range 3)]]) 

नोट

उदाहरण से:^{: कुंजी आइटम} हिस्सा ऊपर वास्तव में इस सरल उदाहरण में आवश्यक नहीं है, लेकिन करने के लिए एक अद्वितीय कुंजी संलग्न में प्रत्येक आइटम घटकों की गतिशील रूप से जेनरेट की गई सूची अच्छी प्रैक्टिस है, और बड़ी सूची के लिए प्रदर्शन सुधारने के लिए सहायता करता है। कुंजी को या तो (जैसा कि इस उदाहरण में) मेटा-डेटा के रूप में दिया जा सकता है, या में मुख्य आइटम किसी घटक (यदि यह नक्शा है) के लिए पहला तर्क दिया जा सकता है। अधिक जानकारी के लिए प्रतिक्रिया दस्तावेज़ीकरण देखें।

और गतिशील बच्चों पर react documentation सही दिशा में ले जाना चाहिए। उच्च स्तर पर, यदि आपके पास कुछ कोड है जो किसी प्रकार के लूप में कई समान घटकों को उत्पन्न करता है, तो आपको ^{:key val} के साथ प्रत्येक घटक को उपसर्ग करने की आवश्यकता है। हालांकि, अभिकर्मक को वैक्टरों में चीजों की आवश्यकता होती है, आपको आमतौर पर उपरोक्त उदाहरण में [:ul] जैसे किसी अन्य वेक्टर में लूपिंग निर्माण से आउटपुट को लपेटने की आवश्यकता होती है या एक सामान्य मामले में [:div]।मैं कभी-कभी ऐसा करने के लिए (into [:div] (for ....)) प्रकार का निर्माण करता हूं।

+0

कोड 'for' और' in' के बजाय 'map' का उपयोग कर रहा है, लेकिन उसी प्रभाव के लिए। मैंने इसके साथ खेला है: या तो मेटाडेटा या घटक के लिए पहली तर्क के रूप में कुंजी। लेकिन दस्तावेज़ीकरण के अनुसार * जो भी * कोई बाधा नहीं बनाता है। - जिनका कोई polyline': वहाँ कई xy अंक में '[डाल रहे हैं कुंजी - शायद कि मुद्दा है - मैं अभी भी इस पर काम करने के लिए ... –

+1

यह निश्चित रूप से की जरूरत है मेटाडाटा नहीं के पहले तत्व के रूप में होने की कोशिश कर रहा हूँ घटक और इसलिए फॉर्म '^ {: कुंजी वैल} [compnent]' होना चाहिए। ध्यान दें कि अभिकर्मक आलसी-सेक अच्छी तरह से सौदा नहीं करता है, यही कारण है कि आप अक्सर '([[...]' या '(डोल ...) 'जैसी चीजें देखते हैं ताकि सीक को महसूस किया जा सके। सुनिश्चित करें कि त्रुटि संदेशों के रूप में नवीनतम अभिकर्मक का उपयोग करना थोड़ा बेहतर हो गया है। पिछली बार मेरे पास त्रुटि के संदर्भ में एक प्रतिक्रियात्मक संदर्भ को याद रखने के लिए याद रखें, तो शायद आप ब्राउज़र तत्वों का उपयोग पृष्ठ तत्वों को देखने के लिए कर सकते हैं ताकि यह पता चल सके कि कौन सा घटक ज़िम्मेदार है –

+1

दिन 8/पुनः- फ्रैम विकी जो मदद कर सकता है। विशेष रूप से, https://github.com/Day8/re-frame/wiki/Using-%5B%5D-instead-of-%28%29 समझ के साथ मदद कर सकता है जहां अभिकर्मक पैदा करेगा घटकों प्रतिक्रिया है, जो हमेशा नहीं है स्पष्ट और ट्रैक जहां मेटाडाटा –

1

मेरा मानना ​​है कि आप की आपूर्ति करने की जरूरत है जैसे

^{:key (gen-key)} [:polyline ... 

मुझे लगता है कि यह केवल, घटकों के लिए एक नक्शा प्रविष्टि के रूप में जोड़ा जा सकता है जैसा आप यहां कार्य करें:

[trending-app {:key (gen-key) :state-ref paths-ratom :comms ch}] 

तो ऊपर काम करता है, लेकिन जैसे नहीं

[:svg {:key (gen-key) 
+0

मैं डालने की कोशिश की '^ {: कुंजी (जनरल कुंजी)}' बाहर के लिए '[सामने: polyline' और' [: svg'। अब तक कोई भाग्य नहीं है। इसके अलावा '[ट्रेंडिंग-एप' के साथ कुछ भी होने की आवश्यकता नहीं है इसलिए मैं इसे स्रोत में ठीक कर दूंगा। क्या आप अपने उत्तर के हिस्से के रूप में एक दस्तावेज़ीकरण संदर्भ दे सकते हैं? –

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