2017-01-21 2 views
1

私はReactアプリケーション内でRedux状態をモデル化するためのきれいな方法を探しています。ここで私は、私が本当に嫌いそれを行うことが一つの方法は次のとおりです。モデリングリアクティブ状態を

const filmFuncs = { 
    getTitles: function() { 
     return this.currentTitles.map(function(film) { 
      return film.title; 
     }); 
    } 
}; 

const defaultState = { 
    'currentTitles': [], 
    ...filmFuncs, 
}; 

var reducer = (state=defaultState, action) => { 
    switch (action.type) { 
     case "GET_FILMS": { 
      return {...state, currentTitles: action.payload}; 
      break; 
     } 
    } 
    return state; 
}; 

export default reducer; 

だから今、私は(、this.props.films.getTitlesを呼び出すことができます)。私のコンポーネントにロジックを置くのではなく、

また、私は別のモデルクラスを設定し、このような何か、状態を渡すことができます考えていた:

var filmModel = new FilmModel(this.props.films); 
filmModel.getTitles(); 

私はどちらかかかわらず、そのアプローチに本当に熱心ではありませんよ。何かご意見は?

+1

ちょうどあなたの減速で 'break'が不要であることを知らせます。前の行ですでに 'return'しているので、' break'は到達できません。 – CodinCat

答えて

0

これで、this.props.films.getTitles();を呼び出すことができます。 を使用してください。

ロジックをコンポーネントに入れないようにしようとしているのはなぜですか?

このようなロジックは、コンテナ/スマートコンポーネント内に配置するのが最適です。そのようなコンポーネントがRedux状態に接続する場合、getTitles選択を実行し、選択したデータをダムコンポーネントに渡してレンダリングします。

実際にコンポーネントをロジック内に置かないようにするには、スタンドアロンのヘルパー/セレクタファイルに配置してから、セレクタを接続に使用します。柔軟なセレクタを作成するには、再選択のようなライブラリを使用することができます。

ダン・アブラモフによるスマート対ダムコンポーネントの記事を読むことをお勧めします。リンクhere

コード例:

セレクタファイル:

export const titlesSelector = (state) => state.currentTitles.map(film => film.title) 

コンポーネントファイル:

//Imports 
import { titlesSelector } from "./Selectors" 

//The smart component 

@connect(state => ({ 
    titles: titlesSelector(state) 
})) 
export default class SmartComponent extends React.Component { 

    constructor() { 
    super() 

    this.getTitles = this.getTitles.bind(this) 
    } 

    render (
    return (
     <DumbComponent 
     titles={this.props.titles} 
     /> 
    ) 
) 
} 

// The dumb component 

const DumbComponent = ({ titles }) => 
<ul> 
    {titles.map(title => <li>{title}</li>} 
</ul> 
+0

*「なぜあなたはあなたのコンポーネントにロジックを入れないのですか?」* - ここでは_testability_に関する私の意見を述べたいと思います:私はいつも、私のコンポーネントを可能な限りスリムにしています。私は、(すべて/ほとんどの)反応コンポーネントの出力をユニットテストすることによってメンテナンスの地獄に飛び込むつもりです。現在、すべてのアプリケーションロジックが店舗/ユーティリティクラスに含まれている場合、店舗が特定のアクションに応じて正しい状態変更を実行するようにすることで、単体テストを実行することは無限に可能です。 –

+0

再利用したいロジックがありますが、必ずしもコンポーネント自体である必要はありません。 私の質問のようなタイトルの配列を返す例を考えてみましょう。おそらく、私はタイトルのリストを表示する2つのコンポーネントを持っていると思います。 1つはタイトルごとにクリック可能なリンクのセットを作成し、もう1つはスタイル付きのdivで囲まれた各タイトルをリストします。理想的には、各コンポーネント間でgetTitles()ロジックを共有したいと考えています。 – user11406

+0

次に、関数を別のファイルからエクスポートし、必要に応じて関数をインクルードします。私が上記のように。とにかく、私は理解しています。私はおそらく、減速機がセレクタを格納するための適切な場所ではないことを指摘したはずです(さらに、それを直接州の中に置くことは狂気です)。 – jankoritak