2015-09-25 10 views
5

मैंने हाल ही में प्रतिक्रिया के साथ काम करना शुरू कर दिया और मुझे इनपुट सत्यापन के साथ समस्या का सामना करना पड़ा। उदाहरण के लिए, यह निर्देशों के माध्यम से Angular.js के रूप में बस एक और ढांचे में लागू किया गया।प्रतिक्रिया: इनपुट सत्यापन

कुछ शोध करने के बाद मैंने पाया

  1. newforms पुस्तकालय, वर्तमान क्षण में बॉक्स से सबसे अच्छा समाधान की तरह दिखता है। लेकिन यह बहुत भारी है और यह सुनिश्चित नहीं है कि यह वर्तमान में समर्थित है (अंतिम अपडेट 7 महीने पहले)।
  2. एक और दृष्टिकोण माता-पिता के रूप में घटनाओं को अपने बच्चों के इनपुट में भेज रहा है, और प्रत्येक पर सत्यापन विधि बुला रहा है।

लेकिन मुझे सबसे अच्छा प्रथा नहीं मिल सका क्योंकि हर कोई खुद का आविष्कार करने की कोशिश करता है और नतीजतन आपको कुछ लिखना होगा।

फॉर्म सत्यापन के लिए सबसे अच्छा समाधान क्या है? क्या रिएक्ट आर्किटेक्चर/फ्रेमवर्क (फ्लक्स/रेडक्स) कोई समाधान प्रदान करता है?

धन्यवाद,

उत्तर

3

मैं हाल ही में प्रतिक्रिया में कुछ रूपों के साथ काम किया है, और मैं एक बहुत ही इसी तरह के अनुभव था। मुझे लगता है कि यह क्या उबलता है कि प्रतिक्रिया बहुत नई है, और सामान्य रूप से हल करने के लिए फॉर्म सत्यापन एक कठिन समस्या है। यह फॉर्म सत्यापन के जंगली पश्चिम की तरह होता है, जहां कोई निर्धारित मानक नहीं है, और कई नई पुस्तकालय समस्या को हल करने की कोशिश कर रहे हैं (प्रत्येक इसे अपना स्वयं का तरीका कर रहा है और कई धारणाएं कर रहा है)।

मैं formsy प्रतिक्रिया का उपयोग कर समाप्त हो गया (https://github.com/christianalfoni/formsy-react) जो काफी सीधी-सपाट था, लेकिन एक बड़ा धारणा बना - कि हम इनपुट onChange मान्य करने के लिए चाहते हैं। मैं चाहता था कि मेरे इनपुट एक त्रुटि onBlur प्रस्तुत करें जो मुझे उस व्यवहार को बनाने के लिए कुछ सहायक कार्यों को लिखने का कारण बनता है।

मैंने अभी तक रेडक्स में बहुत कुछ खोला नहीं है, लेकिन उस क्षेत्र में कुछ अच्छे विकल्प प्रतीत होते हैं (https://www.npmjs.com/package/redux-form), जो आपकी आवश्यकताओं के अनुरूप हो सकता है।

मुझे बताएं कि क्या आप मेरे फॉर्मसी फॉर्म वैधकर्ता/सहायक विधियों का उदाहरण देखना चाहते हैं।

उम्मीद है कि इससे मदद मिली है, या कम से कम कुछ एकजुटता प्रदान की गई है जो प्रतिक्रिया दुनिया में सत्यापन बना रही है, अभी तक अस्पष्ट और मानक की कमी है।

2

मैं हल्के वजन समाधान का उपयोग कर रहा हूं और यह बहुत अनुकूलन योग्य है।

इनपुट onChange पर मान्य है लेकिन किसी भी पर बदला जा सकता है। हम textarea, चेकबॉक्स, रेडियो

var Input = React.createClass({ 
    getInitialState: function(){ 
    // we don't want to validate the input until the user starts typing 
    return { 
     validationStarted: false 
    }; 
    }, 
    prepareToValidate: function(){}, 
    _debounce: function(func, wait, immediate) { 
    var timeout; 
    return function() { 
     var context = this, args = arguments; 
     var later = function() { 
     timeout = null; 
     if (!immediate) func.apply(context, args); 
     }; 
     var callNow = immediate && !timeout; 
     clearTimeout(timeout); 
     timeout = setTimeout(later, wait); 
     if (callNow) func.apply(context, args); 
    }; 
    }, 
    componentWillMount: function(){ 
    var startValidation = function(){ 
     this.setState({ 
     validationStarted: true 
     }) 
    }.bind(this); 

    // if non-blank value: validate now 
    if (this.props.value) { 
     startValidation(); 
    } 
    // wait until they start typing, and then stop 
    else { 
     this.prepareToValidate = _self._debounce(startValidation, 1000); 
    } 
    }, 
    handleChange: function(e){ 
    if (!this.state.validationStarted) { 
     this.prepareToValidate(); 
    } 
    this.props.onChange && this.props.onChange(e); 
    }, 
    render: function(){ 
    var className = ""; 
    if (this.state.validationStarted) { 
     className = (this.props.valid ? 'Valid' : 'Invalid'); 
    } 
    return (
     <input 
     {...this.props} 
     className={className} 
     onChange={this.handleChange} /> 
    ); 
    } 
}); 

हमारे घटक जहां हम फॉर्म प्रस्तुत करने जा रहे हैं के लिए समान घटक बना सकते हैं। हम

var App = React.createClass({ 
    getInitialState: function(){ 
    return {email: ""}; 
    }, 
    handleChange: function(e){ 
    this.setState({ 
     email: e.target.value 
    }) 
    }, 
    validate: function(state){ 
    return { 
     email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/.test(state.email) 
    } 
    }, 
    render: function(){ 
    var valid = this.validate(this.state); 
    return (
     <div> 
     <Input valid={valid.email} 
       value={this.state.email} 
       onChange={this.handleChange} 
       placeholder="[email protected]"/> 
     </div> 
    ); 
    } 
}); 

यह बहुत सरल और अनुकूलन योग्य है और छोटी परियोजनाओं के लिए बहुत अच्छा काम करने के रूप में कई सत्यापन नियम जोड़ सकते हैं। लेकिन अगर हम एक परियोजना बड़े होते हैं और बहुत अलग फॉर्म होते हैं, तो प्रत्येक बार लिखने के लिए हैंडलर के साथ ऐप घटक सबसे अच्छा विकल्प नहीं है

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