2016-09-28 6 views
0

私はreactjsを使い始めたばかりで、コンポーネントを設計する正しい方法を見つけようとしています。私は、コンポーネント、小道具、州の概念を得ていますが、階層を設計する正しい方法で少し苦労しています。大規模な親データ構造を持つreactjsページコンポーネントを設計する賢明な方法

大きなオブジェクト配列によって駆動されるページがあります。言ってやるよ。

objArr = { 
    param1 : value1, 
    param2: value2, 
    dataArray: [ 
       { key: "keyvalue", a: "a", b: "b", c: "c" }, 
       ... 
      ] 
} 

ページ全体がこのようになっている。このページは、dataArrayに対応する一連のUIコンポーネントを構築します。

UIのいくつかのアイコンがクリックされるたびに、いくつかの変更が必要になり、アイコンはこのdataArrayの値に対応します。 UIの動作に合わせてdataArrayの値が変更されるようにするにはどうすればよいでしょうか?逆も同様で、dataArrayで値が変更されるとUIが変化します。

「可能な限り無制限の状態でコンポーネントを作成する」を読んだことがあります。親コンポーネントレベルでこの処理をどのようにしてフローダウンさせるのですか?

コード例は必要ありません。私のReactJSコードを設計する方法のちょっとした指針は素晴らしく、私はコードを理解するでしょう。

はありがとう

+1

場合は、そのこれらの種類Reduxや他のアプリケーション・ステート・ライブラリ(flux、mobxなど)の調査には時間がかかるかもしれません。それだけでなく、それはあなたのアプリケーションの状態をプロパティに渡すことですが、子コンポーネントが使用するものだけで十分です。 –

+1

あなたがしたいのは、コンポーネントを「プレゼンテーションコンポーネント」と呼ばれる小さなコンポーネントに分割し、すべてのロジック(クリックハンドラ、状態処理など)を保持するコンテナコンポーネントを持ち、必要な情報のみを小規模なプレゼンテーションコンポーネントas @ erik-snは言った。 reduxの作成者であるDan Abramovには、同じテーマの[Reduxチュートリアル](https://egghead.io/lessons/javascript-redux-extracting-presentational-components-todo-todolist)のビデオがいくつかあります。アプリを還元する。 – dzv3

答えて

1

あなたが親コンポーネントのメソッドを結合して、そのように子コンテナにそれを渡している行うことができます:アプリケーションの状態が十分に複雑である

// Our 'pages' that we want to be able to interact with 
const ComponentWIthButtons = ({handleButtonClick, buttons}) => (
    <div> 
     <p>Hey, click one of these</p> 
     {buttons.map(button => (
      <div onClick={()=>handleButtonClick(button.name)}> 
       {button.text} 
      </div> 
     ))} 
    </div> 
) 
// The Parent we want to interact with 
class App extends React.Component { 
    constructor(props){ 
     super(props) 
     this.state = { 
      buttons: [ 
       { 
        name: 'a', 
        text: 'Awesome button' 
       }, 
       { 
        name: 'b', 
        text: 'Beautiful button' 
       }, 
       { 
        name: 'c', 
        text: 'Cool button' 
       } 
      ] 
     } 
    } 
    // This is what you want to do with the information passed 
    handleButtonClick = (name) => { 
     // this could be updating this components' state, which 
     // would rerender the display component because we pass it 
     // our buttons from our state object 
     console.log(name) 
    }; 

    render(){ 
     return <div> 
      <h2>Below are some buttons!</h2> 
      // If you don't use the syntax above, you will run into 
      // errors trying to get a reference to this container through 
      // `this`. You can do this.handleButtonClick.bind(this) 
      // to get around that 
      <ComponentWIthButtons handleButtonClick={this.handleButtonClick} buttons={this.state.buttons} /> 
     </div> 
    } 
} 
+1

ありがとう!私はこの周りに頭を浮かべるのに時間が必要です。私は私のES6コードを使用していないので、最初のconstのComponentWithButtons宣言はよく知られていません。私はこのコンセプトに時間を費やして戻ってきます。 – Gerry

+1

'const ComponentWithButtons'は完全にステートレスなコンポーネントを書く単なる方法です。それは簡単に 'クラスComponentWithButtons extends React.Compont'になり、ライフサイクルフックと通常の構文がすべて利用可能になり、' this.props.buttons'と 'this.props.handleButtonClick'を介して渡されたpropsにアクセスできます。 –

関連する問題