2016-08-24 15 views
6

Bu doğrulama davranışının daha yüksek bir sipariş bileşeninde nasıl doğru bir şekilde uygulanacağını anlamak için uğraşıyorum.React Higher Order Bileşen, sarılmış bileşenin yeniden oluşturulmasını zorlar

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

DÜZENLEME: TLDR: Kullanıcı @ noa-dev 'nin önerisi sayesinde, bir Tepki Oluşturun burada oluşturdum: sorunu göstermek için https://jsfiddle.net/8nLumb74/1/.

Basitçe söylemek gerekirse: Neden bu HOC tarafından sarıldığında metin kutumu düzenleme odaklanmayı kaybediyor?

Neyi yanlış yapıyorum?

metin kutusu bileşeni:

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} />) 
    } 
}) 

Doğrulayıcı bileşeni:

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 
} 

ana formu bileşeni: Form bileşenin render yöntemde

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

: gibi olası bir Form bileşeni görünürdü. Ya da basitçe herhangi bir tekrarlayıcı olmadan onu korumak için aynı bileşende doğrulama işleminizi gerçekleştirin ve sadece bitmiş dizeyi saklamak için yüksek sipariş bileşenine gönderin. –

+0

kesinlikle bir teşekkür, ancak şu anda uygulama şu anda (ne zaman redux düzenlenen) küresel durumu (bu örnekte redux düzenlenen) güncelleştirmek için herhangi bir metin değişiklikleri (bu değeri düzenleme bitirmeden önce) bekler, böylece uygulamanın geri kalanı size nasıl görüneceğini tamamlandığında "... –

+0

Yüksek mertebeden bileşen kurulumumda bariz bir şey eksik olduğumdan eminim - yani React neden değer alanını güncellemek yerine tüm girdi DOM öğesini yırtıp dökmesi gerektiğini düşünüyor? –

cevap

4

, yaratmakta her yeni ValidatingTextBox her seferinde:

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

Bunun yerine, bileşenini yapmalı ve ardından örneği koruyacak şekilde kullanmalısınız. Ben tepki yerli Dokümanlar Gelişmiş Performans https://facebook.github.io/react/docs/advanced-performance.html içine bakarak öneriyoruz

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

bu yüzden tek sorun, kompozisyonumun render yöntemimin içinde olmasıydı. Kahretsin ben çok aptalım - teşekkürler LOADS Davin! –

İlgili konular