2016-05-12 12 views
1

より柔軟なアプローチを取るためにReactコードをリファクタリングしています。render()が呼び出された後にExtended Reactコンポーネントが更新されない

  • React.Componentを拡張する抽象コンポーネントがあります。具体的にはclass ATable extends React.Componentとしましょう。
  • 別のテーブルようなので、このテーブルを拡張:class FooTable extends ATable
  • いくつかの他のテーブルが同じことを行います。class BarTable extends ATable
  • (アブストラクト)ATABLEコンポーネントが他のコンポーネントにバインディングを提供するコンストラクタメソッド有する:

ATABLEを:

constructor(...args) { 
    super(...args); 
    this.components = { 
     tableHead: TableHead, // other (semi) abstract classes 
     tableBody: TableBody, 
     tableRow: TableRow, 
     (...) 
    } 
} 

render() { 
    <section> 
     <this.components.tableHead (...) /> 
     (...) 
    </section> 
} 
  • FooTableは、COMを作るためにthis.componentsの一部をオーバーライドすることができますponents pluggable。これは次のように起こる:

FooTable:

constructor(...args) { 
    super(...args); 
     this.components.tableHead: FooHead 
    } 
} 

class FooHead extends TableHead {} // FooHead <- TableHead <- React.Component 

目標は、(現実にはもっと複雑である)表を作成するプラグイン可能なシステムです。

ここで問題となるのは、FooTableの小道具が変更されると、TableHeadまでのすべてのイベントが呼び出されていてもDOMの更新は表示されないということです。抽象化の前にすべてがうまくいくように見えました。

これはどのように可能ですか?これをどのように解決できますか?

+0

あなたは 'extends'を使う代わりに上位コンポーネントを使うことを考えましたか?それとも、それはちょうど普通の成分組成ですか? – azium

+0

ええと、矢印関数で宣言されていない場合、 'render(){}'の中でセクションを 'return'する必要はありませんか? –

+0

[Reactコンポーネントの拡張](http://stackoverflow.com/questions/25720595/extending-react-js-components)と[コンポーネントのサブクラス化](https://discuss.reactjs.org/t/best)の2つのリンクを試してください。 -practices-for-extend-subclassing-components/1820)を参照してください。それらは構成のベストプラクティスの良い例です。 –

答えて

0

問題は、クラスの拡張ではなかったが判明が、私は...レンダリングされた

誤っ

部品はコンストラクタチェーンの状態に設定されたリファクタリングしようとしています。これはもちろん更新されません。

結果は、ライフサイクル全体(私はレンダリング時に新しい小道具を記録することができました)と呼ばれる小道具の変更を登録しましたが、小道具は一度も州に適用されなかったため変更されませんでした。

これですべての問題が解決しました。

関連する問題