2017-05-31 2 views
0

私は非常に基本的なPersonクラスを持っており、dataというパラメータが必要です。Object.assignでクラスプロパティを変更するがクラスインスタンスを返す

class Person implements PersonInterface { 

    constructor(public data) { 

    } 

    get name(): string { 
     return this.data.name; 
    } 

} 

const person: PersonInterface = new Person({ name: "Aristona }); 

私のReduxストアでは、私はすべての人を配列に保ちます。

[Person, Person, Person, Person] 

ユーザーはPersonの名前プロパティを編集できます。だから私の減速は、次のようになります。

case Constants.PERSON_UPDATE_SUCCESS: 
    const person = Object.assign({}, action.payload.person.data, { 
    name: action.payload.name 
    }); 

    return { 
    ...state, 
    persons: [ 
     person, 
     ...state.persons.filter(p => p.id !== person.id) 
    ] 
    }; 

Object.assigndataプロパティを返しますので、それは動作しません。私が必要なのはdataプロパティが更新されたPersonオブジェクトです。私はデータを変異させることができれば、それは次のようになります。

person.name = action.payload.name; 

をそれ以外の場合は、私人の列は次のようになります。

[Person, Person, Person, Person, Object] // Object is data 

、それはすべての反復を破ります。

私はこれをやってみました:

const updatedData = Object.assign({}, action.payload.person.data, { 
    name: action.payload.name 
}); 

const person: PersonInterface = new Person(updatedData); 

理論的にはそれが仕事だろうが、悲しいことに、私は私のPersonFactoryクラスに大きな変更を加えることなく、このようなクラスをインスタンス化することはできません。

Reduxの不変性を損なうことなくこれを達成する方法はありますか?

ありがとうございます。

+1

本当にクラスを使用したい場合は、 'new'を使ってクラスの新しいインスタンスを作成することをお勧めします。 – Sulthan

+1

リアクションと特にレフィックスは、オブジェクト指向ではなく、より機能的なアプローチをとっています。残念ながら、あなたがやろうとしていることをする良い方法は考えられません。私は尋ねる必要があります、あなたは本当にあなたの状態のためのクラスを使用する必要がありますか?状態は単なるデータ構造であり、クラスインスタンスであることから実際に利益を得ることはできません。 – DonovanM

+0

Reduxでのデータのクラスの使用が推奨されない理由についての私の答えを見てください:https://stackoverflow.com/questions/44268317/clone-and-then-mutate-approach-in-redux/44270061#44270061 – markerikson

答えて

0

1)あなたの状態では、クラスのインスタンスを格納するための良い方法ではありません

再来の3つの原則の第一の原則は、アプリケーション全体の状態は、内のオブジェクトツリーに格納されて

を語ります1つの店舗サーバーからの状態をシリアライズし、クライアントに水分補給することができるので、ユニバーサルアプリケーションを簡単に作成できます。

シリアライズ可能なデータのみを持つように状態を変更することを検討してください。

2)immutablejsのようなツールを使用することをお勧めします。すべての不変の問題を遠くから永遠に奪うでしょう。

3)還元剤の機能を分割することをお勧めします。combineReducerを使用することを検討してください。そうした場合は、州のpersonsブランチだけに責任があります。

4)現在のソリューションを続行する必要がある場合は、私はすべての更新でnew人をインスタンス化する必要があると思います。

+0

私は1に同意しません。クラスのインスタンスを保存するのは完全に正常です。これはクラスであるという事実よりも、与えられたオブジェクトの複雑さに関するものです。例えば、我々はすべて、保存するために 'Date'と' Error'インスタンスを保存します。 – Sulthan

+0

それは動作しますが、再度シリアライザブルではないため、スケーラブルではありません。localStorageで状態を保持したい場合や、サーバサイドのレンダリングがあり、サーバからクライアントに状態を転送したい場合はどうなりますか? – Faris

+1

@Sulthan:いいえ、クラスのインスタンスをストアに保存するのは「正常」ではありません。あなたはそれをすることができますが、理想的には、オブジェクト、配列、およびプリミティブなどのプレーンなデータをストアに置くのが理想的です。日付やエラーのようなものは、文字列や数字で表現する必要があります。 – markerikson

関連する問題