2015-06-11 5 views
6

मुझे पता नहीं क्यों इसDefaultValue परिवर्तन नहीं फिर से प्रस्तुत करना है इनपुट

Demo

मैं निम्नलिखित ES6 कोड

const {createFactory, createClass, DOM: { label, input, button }} = React; 

const tester = createFactory(createClass({ 
    render() { 
     return label({} 
       ,`Name: ${this.props.name}` 
       ,input({defaultValue: this.props.name}) 
       ,button({onClick: this.changeName}, "Change") 
      ) 
    }, 
    changeName() { 
    this.setProps({name: "Wilma"}) 
    } 
})) 

React.render(tester({name: "Fred"}), document.querySelector('body')) 

क्लिक करने से बटन स्पष्ट रूप से रंगमंच की सामग्री में परिवर्तन किया है काम नहीं कर रहा है, लेकिन पुराने defaultValue अभी भी इनपुट में है! तो क्या देता है? मैं क्या गलत कर रहा हूं? क्या यह एक बग है? क्या आसपास कोई काम है?

+1

अधिक जानकारी यहाँ: https://github.com/facebook/react/issues/4101 –

उत्तर

5

आप केवल अपना डिफ़ॉल्ट मान निर्दिष्ट करते हैं, लेकिन इसे अपने मूल्य को प्रोप में बदलने के साथ न बदलें।

,input({value: this.props.name}) 

जब यह .props.name बदलता है तो मान बदल जाएगा।

http://output.jsbin.com/melitecimo

+2

हाँ, मुझे पता है कि 'मान' करता है, लेकिन यह भी इनपुट को ताला लगा देता है ताकि वह बदल न सके। वर्कफ़्लो के आस-पास पहुंचने के लिए बहुत कुछ है लेकिन यह एक साधारण परिदृश्य है जिसमें [रिस्पॉज दस्तावेज़ डिफ़ॉल्ट वैल्यू का उपयोग करने की अनुशंसा करते हैं] (http://facebook.github.io/react/docs/forms.html#uncontrolled-components)। किसी भी मामले में, यह किसी ऐसे चीज का अच्छा कारण नहीं है जो डीओएम –

+1

'में डिफ़ॉल्ट रूप से स्टोर करता है' डिफ़ॉल्ट वैल्यू 'केवल माउंटिंग के दौरान घटक के प्रारंभिक मान को निर्दिष्ट करता है। आपके द्वारा दिए गए प्रोप के साथ बदलने के लिए इसके मूल्य के लिए व्यवहार की अपेक्षा नहीं की जाती है। मैं LinkedStateMixin की तरह कुछ सुझाऊंगा, लेकिन मुझे यकीन नहीं है कि यह es6 के साथ कितना अच्छा व्यवहार करता है। यदि आप रुचि रखते हैं तो https://facebook.github.io/react/docs/two-way-binding-helpers.html। –

+2

सही उत्तर लेकिन [मैं वास्तव में इसे एक बग के रूप में देखता हूं] (https://github.com/facebook/react/issues/4101) –

10

मैंने पाया है कि इस के लिए एक बहुत अच्छा समाधान लगता है: पूरी तरह से नया input का प्रतिपादन के लिए मजबूर करने key प्रोप का प्रयोग करें।

मेरी विशेष मामले में, मैं input, अपने स्वयं के onChange प्रोप साथ नियंत्रित किया जा करने के लिए आसपास के यह अंततः कुछ दुकान जो defaultValue भरता भीतर राज्य को नियंत्रित करता है form के रूप में की जरूरत नहीं है। लेकिन स्टोर का राज्य असीमित रूप से प्रारंभ/अद्यतन हो सकता है, और इस स्थिति में defaultValue अपडेट किया जाना चाहिए। तो यहाँ मेरी विशेष मामले के एक संक्षिप्त संस्करण है:

import React, { PropTypes } from 'react'; 
import { Form } from 'provide-page'; 

const GatherContact = ({ 
    classes, 
    onSubmit, 
    movingContactName, 
    movingContactEmail, 
    movingContactPhone, 
    userName, 
    userEmail, 
    userPhone 
}) => (
    <Form onSubmit={onSubmit}> 
    <div className={classes.GatherContact}> 
     <h2 className={classes.GatherHeading}> 
     How can we contact you? 
     </h2> 

     <input 
     type="text" 
     className={classes.GatherContactInput} 
     placeholder="Name" 
     name="movingContactName" 
     key={`movingContactName:${movingContactName || userName}`} 
     defaultValue={movingContactName || userName} 
     required={true} 
     /> 

     <input 
     type="email" 
     className={classes.GatherContactInput} 
     placeholder="Email" 
     name="movingContactEmail" 
     key={`movingContactEmail:${movingContactEmail || userEmail}`} 
     defaultValue={movingContactEmail || userEmail} 
     required={true} 
     /> 

     <input 
     type="tel" 
     className={classes.GatherContactInput} 
     placeholder="Phone" 
     name="movingContactPhone" 
     key={`movingContactPhone:${movingContactPhone || userPhone}`} 
     defaultValue={movingContactPhone || userPhone} 
     required={true} 
     /> 

     {userName 
     ? undefined 
     : (
      <input 
      type="password" 
      className={classes.GatherContactInput} 
      placeholder="Password" 
      name="userPassword" 
      required={true} 
      autoComplete="new-password" 
      /> 
     ) 
     } 
    </div> 
    </Form> 
); 

GatherContact.propTypes = { 
    classes: PropTypes.object.isRequired, 
    onSubmit: PropTypes.func.isRequired, 
    movingContactName: PropTypes.string.isRequired, 
    movingContactEmail: PropTypes.string.isRequired, 
    movingContactPhone: PropTypes.string.isRequired, 
    userName: PropTypes.string.isRequired, 
    userEmail: PropTypes.string.isRequired, 
    userPhone: PropTypes.string.isRequired 
}; 

export default GatherContact; 
+1

यह समाधान मेरे लिए वास्तव में अच्छा काम करता है, धन्यवाद। लेकिन मैं थोड़ा उलझन में हूं कि 'कुंजी' संपत्ति क्यों और यह क्यों काम करती है? इस कामकाज के अलावा, इनपुट के लिए क्या करना महत्वपूर्ण है? यह प्रलेखन में दिखाई नहीं देता है। क्या यह कामकाज 'कुंजी' के अलावा किसी भी अन्य संपत्ति के नाम के साथ काम करेगा? –

+2

@ डेविडनेटो प्रतिक्रिया बच्चे नोड्स को अपडेट करने के तरीके के बारे में जानने के लिए 'key' प्रॉपर्टी का उपयोग करती है। यदि 'कुंजी' वही रहना था, तो यह उसी सटीक DOM नोड का उपयोग करेगा और आवश्यकतानुसार इसके गुण अपडेट करेगा। लेकिन चूंकि 'कुंजी' में परिवर्तन होता है, यह एक पूरी तरह से नया डोम नोड प्रस्तुत करता है। – timbur

+0

धन्यवाद!यह वही था जो मुझे एक प्रतिपादन को मजबूर करने के लिए आवश्यक था जब केवल डिफ़ॉल्ट वैल्यू परिवर्तन (मुझे कैलेंडर बदलने के लिए केवल डिफ़ॉल्ट वैल्यू बदलने की आवश्यकता है - आरसी-कैलेंडर - लोकेल अपडेट) – abidibo

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

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