2016-08-24 21 views
6

पुन: प्रस्तुत करने के लिए मैं एक उच्च आदेश घटक में इस सत्यापन व्यवहार को सही ढंग से कार्यान्वित करने के तरीके के बारे में समझने के लिए संघर्ष कर रहा हूं।प्रतिक्रिया उच्च घटक घटक बल लपेटा घटक

===========================================

संपादित करें: टीएलडीआर: उपयोगकर्ता को धन्यवाद @ नोआ-देव के उत्कृष्ट सुझाव मैंने इस मुद्दे को दिखाने के लिए यहां एक प्रतिक्रियात्मक पहेली बनाई है: https://jsfiddle.net/8nLumb74/1/

बस शब्दों में कहें: इस एचओसी द्वारा लिपटे जाने पर मेरा टेक्स्टबॉक्स संपादन पर ध्यान क्यों देता है?

मैं क्या गलत कर रहा हूं?

पाठ बॉक्स घटक:

import React from 'react' 

export default React.createClass({ 
    changeText(e) { 
     if (this.props.validate) 
      this.props.validate(e.target.value) 
     this.props.update(e.target.value) 
    }, 
    componentDidMount() { 
     console.log('should only be fired once') 
    }, 
    render() { 
     return (<input type="text" 
      value={this.props.text} 
      onChange={this.changeText} />) 
    } 
}) 

सत्यापनकर्ता घटक:

import React from 'react' 

export default function (WrappedComponent) { 
    const Validation = React.createClass({ 
     validate(text) { 
      console.log('validating', text) 
     }, 
     render() { 
      return (
       <WrappedComponent 
       {...this.props} 
       validate={this.validate} 
       /> 
      ) 
     } 
    }) 
    return Validation 
} 

माता पिता पर्चा घटक:

import React from 'react' 
import TextBox from './text-box' 
import Validator from './validator' 

export default React.createClass({ 
    getInitialState() { 
     return ({text: 'oh hai'}) 
    }, 
    update(text) { 
     this.setState({text}) 
    }, 
    render() { 
     const ValidatingTextBox = Validator(TextBox) 
     return (<ValidatingTextBox 
      text={this.state.text} 
      update={this.update} />) 
    } 
}) 
+0

मैं तुम्हें प्रतिक्रिया देशी डॉक्स के उन्नत प्रदर्शन https://facebook.github.io/react/docs/advanced-performance.html में देख सिफारिश करेंगे: की तरह एक संभव Form घटक लगेगा। या किसी भी पुनर्विक्रेताओं के बिना इसे रखने के लिए केवल उसी घटक में अपनी सत्यापन को संभालें और इसे स्टोर करने के लिए केवल उच्च स्ट्रिंग घटक को समाप्त स्ट्रिंग भेजें। –

+0

निश्चित रूप से एक विचार धन्यवाद, हालांकि वर्तमान में ऐप वैश्विक स्थिति को अपडेट करने के लिए किसी भी पाठ में परिवर्तन (इस मान को संपादित करने से पहले भी) की अपेक्षा करता है (इस उदाहरण में रेडक्स में आयोजित किया गया है) ताकि बाकी ऐप आपको दिखा सके "यह कैसा दिखता है जब समाप्त हो गया "... –

+0

मुझे यकीन है कि मुझे अपने उच्च आदेश घटक सेटअप में कुछ स्पष्ट याद आ रहा है - यानी क्यों लगता है कि इसे मान फ़ील्ड को अपडेट करने के बजाय पूरे इनपुट DOM तत्व को फाड़ने की आवश्यकता क्यों है? –

उत्तर

4

Form घटक के render विधि में, आप बना रहे हैं एक नया ValidatingTextBox हर बार:

render() { 
     const ValidatingTextBox = Validator(TextBox) 
     return (<ValidatingTextBox 
      text={this.state.text} 
      update={this.update} />) 
    } 

इसके बजाय, आपको घटक बनाना चाहिए और फिर इसका उपयोग करना चाहिए ताकि उदाहरण बनाए रखा जा सके।

import React from 'react' 
import TextBox from './text-box' 
import Validator from './validator' 

const ValidatingTextBox = Validator(TextBox) 

export default React.createClass({ 
    getInitialState() { 
     return ({text: 'oh hai'}) 
    }, 
    update(text) { 
     this.setState({text}) 
    }, 
    render() { 
     return (<ValidatingTextBox 
      text={this.state.text} 
      update={this.update} />) 
    } 
}) 
+0

तो एकमात्र समस्या यह थी कि मेरी रचना मेरे प्रस्तुत करने के तरीके के अंदर थी? अरे मैं बहुत बेवकूफ हूँ - धन्यवाद लव डेविन! –

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