#reactのstateの更新について
以下のコードをみてください。
javascript
1import React from "react"; 2import { Link, hashHistory } from "react-router"; 3import Errors from "./Errors"; 4import firebase from "firebase/firebase-browser"; 5 6const FORM_STYLE = { 7 margin: "0 auto", 8 padding: 30 9}; 10 11const SIGNUP_LINK_STYLE = { 12 display: "inline-block", 13 marginLeft: 10 14}; 15 16export default class Login extends React.Component{ 17 constructor(props){ 18 super(props); 19 this.state = { 20 email: localStrage.userEmail || "", 21 password: localStorage.userPassword || "", 22 errors: [], 23 }; 24 this.handleOnChangeEmail = this.handleOnChangeEmail.bind(this); 25 this.handleOnChangePassword = this.handleOnChangePassword.bind(this); 26 this.handleOnSubmit = this.handleOnSubmit.bind(this); 27 } 28 29 handleOnChagneEmail(e){ 30 this.setState({ email: e.target.value }); 31 } 32 33 handleOnChangePassword(e){ 34 this.setState({ password: e.target.value }); 35 } 36 37 // ログイン処理 38 handleOnSubmit(e){ 39 const { email, password } = this.state; 40 const errors = []; 41 let isValid = true; 42 e.preventDefault(); 43 if(!email.length){ 44 isValid = false; 45 errors.push("Email can't be blank"); 46 } 47 if(!password.length){ 48 isValid = false; 49 errors.push("Password can't be blank"); 50 } 51 if(!isValid){ 52 this.setState({ errors }); 53 return; 54 } 55 // Firebaseのログイン処理 56 firebse.auth().signinWithEmailAndPassword(email,password).then(()=>{ 57 // 次回ログイン簡略化のため、localStorageに値を保存 58 localStorage.userEmail = email; 59 localStorage.userPassword = password; 60 // チャットルーム一覧画面へ繊維 61 hashhistory.push("/rooms"); 62 }).catch(()=>{ 63 // Firebaseでログインエラーとなった場合 64 this.setState({ errors:["Incorrect email or password."] }); 65 }); 66 } 67 68 render(){ 69 return( 70 <form style={FORM_STYLE} onSubmit={this.handleOnSubmit}> 71 72 </form> 73 ); 74 } 75} 76
ログイン処理の中に
javascript
1if(!isValid){ 2 this.setState({ errors }); 3 return; 4}
という処理があります。
ここがわかりません。
setStateはnextStateを現在のstateにマージするということはわかるのですが、
errorsには配列が入っていますよね?
stateは{キー:バリュー}じゃないと更新できないのではないでしょうか?
なぜこの方法でthis.state.errorsだけ更新できるのでしょうか?
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/04/14 00:03