2016-08-24 7 views
6

高次コンポーネントでこの検証動作を正しく実装する方法を理解するのは苦労しています。より高次のコンポーネントに反応してラップされたコンポーネントの再レンダリングを強制します。

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

編集:TLDR:user @ noa-devの優れた提案のおかげで、私はReact Fiddleをここに作成しました:https://jsfiddle.net/8nLumb74/1/問題を表示します。

簡単に言えば、このHOCでラップされたときにテキストボックスが編集に専念しないのはなぜですか?

私は間違っていますか?

TextBoxコンポーネント:

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 
} 

親フォームコンポーネント:Formコンポーネントのrender方法で

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

:可能Formコンポーネントは次のようになります。または、再実装なしで同じコンポーネント内で検証を処理し、完成した文字列を上位コンポーネントに送信して格納します。 –

+0

間違いなく心から感謝していますが、現在のところ、アプリケーションは、グローバル状態(この例ではredux)を更新するために(この値の編集を完了する前であっても)テキストの変更を期待しているので、完了したら "... –

+0

高次コンポーネントのセットアップで明らかに何かが分からないと思うのですが、Reactは値フィールドを更新するのではなく、入力DOMエレメント全体を分解する必要があると思うのですか? –

答えて

4

、あなたが作成しています毎回新しいValidatingTextBox

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

代わりに、コンポーネントを作成して使用して、インスタンスが維持されるようにする必要があります。私はネイティブドキュメントを反応https://facebook.github.io/react/docs/advanced-performance.htmlの高度なパフォーマンスに探して、あなたをお勧めします

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

唯一の問題は、私のコンポジションが私のレンダリングメソッドの中にあることでしたか?こんにちは私はとてもばかげています - LOADS Davinに感謝します! –

関連する問題