51

ドキュメントによると、反応アプリの状態はシリアライズ可能なものでなければなりません。じゃあ授業は?

ToDo アプリがあるとします。各Todoアイテムには、これまでのところ などのプロパティがありnameますdate。今、シリアル化できないオブジェクトにメソッドが必要です。つまり、 todoTodo.rename()の名前を変更し、他の多くのことを行います。

私が理解している限り、関数をどこかで宣言し、その関数を小道具を介してコンポーネントにrename(Todo)渡すか、または渡すことができます。this.props.rename(Todo)

どこかで宣言する際に 2 つの問題があり.rename()ます。1) どこで? 減速機で?would be instanceアプリのレデューサーのどこかにすべてのメソッドを見つけるのは難しいでしょう。2) この関数を渡します。本当に?すべての上位レベルのコンポーネントから手動で渡す必要があります。また、メソッドが増えるたびに、大量のボイラープレートを追加して、それを渡すだけですか? または、1 つのタイプのオブジェクトに対して 1 つの名前変更メソッドしか持たないことを常に望んでいます。Todo.rename() Task.rename()ではないEvent.rename()

それはばかげているように思えます。オブジェクトは、それに対して何ができるか、どのようにできるかを知っている必要があります。そうではありませんか?

ここで何が欠けていますか?

4

3 に答える 3

4

これが正確に関連しているかどうかはわかりませんが(コンテキストはReactでReduxを使用しています)、似たようなものを検索しているときにこのページを見つけたので、興味がある場合に備えてこれを書いています.

私の動機は、状態そのものではなく、その状態の表現を公開したい状態オブジェクトがあることです。たとえば (Immutable.js を使用)、1 つ以上のfieldsで構成される状態 ( schema ) があり、それぞれが一意の識別子で識別され、Map に格納されます。さらに、フィールドの順序を示す識別子のリストがあります。

私は本当にそのようなものを書きたくありません

state.get('field').get(state.get('order').get(nth))

内部表現が隠され、簡単に変更できるように、リデューサーの近く以外の場所で n 番目のフィールドを取得します。

私が現在行っていること (これはちょっとした実験です) は、レデューサーと同じファイルに関数を追加することです。

schema.mapVisibleState = function (state) {
    return {
        getOrderedFields: () => state.get('order').map((fid) => state.get('fields').get(fid)
    }
}

これは、対応する React コンポーネントで使用されます (同様に動機付けられた schema.bindActionCreators 関数と共に):

export const Schema = connect(
    (state) => schema.mapVisibleState (state),
    (dispatch) => schema.bindActionCreators (dispatch)
)(_Schema) ;

これで、 this.props.getOrderedFields()として単純にコンポーネント内のフィールドに正しい順序でアクセスできるようになり、基になる表現について心配する必要がなくなりました。また、getOrderedFields() 関数の依存性注入を簡単に実行できるという優れたプロパティも追加されています。

また、フィールドの状態にも同様の構造があるため、これを拡張できます。

schema.mapVisibleState = function (state) {
    return {
        getOrderedFields: () => state.get('order').map((fid) => field.mapVisibleState(state.get('fields').get(fid)),
        getNthField (nth) => field.mapVisibleState(state.get('fields').get(state.get('order').get(nth)))
    }
}
于 2016-02-22T11:49:39.477 に答える