2016-11-30 25 views
0

私はこの反応のケースを持っているかもしれませんが、おそらく反応することから何かが逃しているかもしれません。componentDidMountか、あるいは奇妙な挙動です(正しいことはjQueryプラグインで実際のフィドルを提供することはできませんが、プラグ自体よりも広い)。なぜ、componentDidUpdateに新しく挿入されたdomノードが表示されないのですか?

var Hello = React.createClass({ 
    getInitialState() { 
    return {content: '<div id="target">ciao!</div>'} 
    }, 

    componentDidMount() { 
    const target = $('#target').init(); 
    this.target = target; 
    }, 

    componentWillReceiveProps(nextProps) { 
    if (condition) { 
     this.target.destroy(); // this remove even the DOM node 
    } 
    }, 

    componentDidUpdate() { 
    const target = $('#target').init(); // HERE PROBLEM! can't find the #target element 
    this.target = target; 
    } 

    render: function() { 
    return <div>Hello {this.state.content}</div>; 
    } 
}); 

'condition'がtrueで、DOMノードがcomponentDidUpdateが見つからない、プラグインによって破壊された後、私は理由を理解することはできません#target私の心にされている必要があることを「再描画」最初のレンダリングではcomponentWillReceivePropsの後です。私はそこにいることを期待しています。なぜなら、決して変化しない初期の状態からそれを読むからです。

私には何が欠けていますか?

+0

適切な名前の['dangerouslySetInnerHtml'](https://facebook.github.io/react/docs/dom-elements.html#dangerouslysetinnerhtml)を使用せずに、そのままのHTMLをレンダリングすることはできません。 –

+0

@JoeClayはそうではありません。とにかく私は試して何も変更していません.. – ciaoben

答えて

0

componentDidMount()ライフサイクルメソッド内でthis.setState()を実行すると、レイアウトスラッシングが発生します。 は、ここではレイアウトthashingについての詳細を参照してください:https://blog.idrsolutions.com/2014/08/beware-javascript-layout-thrashing/

理由はthis.setState()が再レンダリング引き起こすことがある(2回render()を呼び出します)。そして、それはcomponentDidMount()で1回、実際のレンダリング方法で1回発生します。 componentDidMountからsetState()を削除する方法を見つける必要があり、問題が解決する可能性があります。あなたがレンダリングされたコンテンツへの変更を検出することができませんリアクト作るのjQueryを使用して反応させる要素(this.state.content)を操作しているので、最初の試みとして、私はcomponentWillMount()方法

+0

実際には私はsetStateを使用していませんが、 "this"オブジェクトにモーダルを設定しています。とにかく、それは問題ではありません – ciaoben

+0

あなたの 'componentDidMount()'の 'this.setState({target:target})'はどうですか?それを 'componentWillMount()'の中に移動してみてください。 –

+0

mmmm私はあなたが問題をはっきりしないと思います。もし私がWillMountに移動するとdomノードはそこにないので、jqueryプラグインをバインドできません。 – ciaoben

1

this.setState()を移動します。あなたはそれを

  1. componentDidUpdateが初期状態、および$('#target').init()#target
  2. が呼び出されるなど、完全にレンダリングされたコンポーネントを、持っている最初の時間をレンダリングするときに、レンダリングされたコンポーネントが反応知らせることなく、外部から変更され
  3. $('#target').destroy()が呼び出された場合、#targetノードは通知せずにDOMから削除されます
  4. componentDidUpdate$('#target').init()を呼び出した場合、が見つかりませんReactは#targetの変更を検出しなかったため、Reactが選択的再レンダリングを行うという事実のために、#targetは再生成されませんでした。だから、あなたが行うことができます一つのことがcomponentWillReceivePropsの状態を更新することです

in condition check)、data-updatedフィールドに注意してください、これは確かにそれが反応になりますthis.state.contentのための状態変化を検出し、ひいては再レンダリングされますコンポーネント、およびあなたがcomponentDidUpdate

componentWillReceiveProps(nextProps) { 
    if (condition) { 
    this.target.destroy(); // this remove even the DOM node 
    this.state.content = `<div id="target" data-updated="${Date.now()}">ciao!</div>`; 
    } 
} 

で再び#targetがこれを考えるとわかりますが、私はあなたが反応にrefsを見てすることをお勧めします。

+0

あなたの答えはたくさんあります!後で仕事で私はあなたに知らせようとします。私は参考文献を知っていますが、私はすでにこのカサでjQueryとReactを "バイパス"しているので、$セレクタを使って問題が発生していませんでした。 – ciaoben

+0

使い方にはあまり違いはありませんが、引数の1つは$( '#target')でDOM内のすべてのものを見つけることができます(他の '#target'がある場合は衝突する可能性があります。代わりに$(this.refs.target)はこのjQueryセレクタを非常にスコープにします。 –

+0

ありがとう...私はあなたの解決策を試みたが、うまくいかなかった...それは意味をなさない。なぜなら、属性の異なるものであっても、なぜリアクションによって再レンダリングされないのか – ciaoben

関連する問題