2017-06-04 7 views
4

this.stateからオブジェクトをコピーしてプロパティ値の一部を変更する必要があります。 オブジェクトの破棄は参照によって動作するかオブジェクトをクローンしますか

は、例えば以下の方法の状態でこれを回避するために、直接( this.state.errors = {}

authorFormIsValid =() => { 
    var formIsValid = true; 
    this.state.errors = {}; //clear any previous errors. 

    if (this.state.author.firstName.length < 3) { 
     this.state.errors.firstName = 'First name must be at least 3 characters.'; 
     formIsValid = false; 
    } 

    if (this.state.author.lastName.length < 3) { 
     this.state.errors.lastName = 'Last name must be at least 3 characters.'; 
     formIsValid = false; 
    } 

    this.setState({errors: this.state.errors}); 
    return formIsValid; 
    }; 

変異している、私は、我々が使用できることを知っている:

A)​​

let errors={...this.state.errors}; 

b)またはObject.assign

let errors=Object.assign({},this.state.errors); 

しかし、時には、私はそれがこのように使用されobject destructuringにいくつかの例を思えました:

authorFormIsValid =() => { 
    let formIsValid = true; 

    //Destructuring error and authors from this.state 
    let {errors, author} = this.state; 

    errors = {}; //clear any previous errors. 

    if (author.firstName.length < 3) { 
     errors.firstName = 'First name must be at least 3 characters.'; 
     formIsValid = false; 
    } 

    if (author.lastName.length < 3) { 
     errors.lastName = 'Last name must be at least 3 characters.'; 
     formIsValid = false; 
    } 

    this.setState({errors}); 
    return formIsValid; 
    }; 

だから私の質問があり、それは上記の他の2つの方法に相当object destructuringのですか?つまり、単純なobject destructuringを使用して状態を直接変更することは避けますか?

答えて

4

Object destructuringreferenceの作品となりますが、それを構造化代入した後、オブジェクトを変異するべきではありません。したがって、実際には間違っています

let {errors, author} = this.state; 

errors = {}; //clear any previous errors. 

実際には間違っています。

let obj = { 
 
    foo: { 
 
    bar: 1 
 
    } 
 
} 
 

 
let { foo } = obj; 
 

 
console.log(foo.bar);  // 1 
 
console.log(obj.foo.bar); // 1 
 

 
foo.bar++; 
 

 
console.log(foo.bar);  // 2 
 
console.log(obj.foo.bar); // 2

下記参照コールのスニペット
+0

だから、オブジェクトスプレッド演算子またはObject.assignのどちらかを使用することに固執する必要がありますね。 – eddy

+1

はい、私はあなたがreduxのdocsもそれを推薦することを考慮して、スプレッドオペレータに行くことをお勧めします。この回答を見るhttps://stackoverflow.com/questions/43376849/using-object-assign-in-react-redux-is-a-good-practice/43376980#43376980 –

0

いいえ、オブジェクトの破棄は、 'this.state'内の同じオブジェクトを別の変数に割り当てます。

let {errors, author} = this.state; 

だから、新しいerror変数がthis.state

内の同じエラーオブジェクトを参照してください。ただし、次の行errors = {};this.stateを変化させません。変数errorを新しい空のオブジェクトに参照するだけです。だから、与えられたコードはまだ状態の変異をしません。実際には、このオブジェクトの中にerrorを持つという意味はありません。これは、このようなものに似ています。

let errors = this.state.errors; 
errors = {}; 

これは本質的にこれと違いはありません。

let errors = {}; 
+0

はい、そのラインであり、変異はまだありませんが、どのような次の行について、参照してください: 'this.state.errors.firstName = '名字は少なくとも3文字でなければなりません。 ';'? – eddy

+0

これは状態の突然変異です。そして前の行でも、 'this.state.errors = {}' –

+0

待って!状態に変数を直接代入し、その変数を変更してから、その変数を 'this.setState()'で使用することに何も問題はないと伝えようとしていますか? – eddy

関連する問題