2017-05-31 12 views
0

簡単な質問:2つのコンポーネントと2つの減速器があります。基本的に2つに分割されたアプリケーションの状態は、{stateComponent1: object, stateComponent2: object ....}.Component2のようなものになります。さらに、stateComponent1stateComponent2を割り当てたMapStateToProps関数によって行われます( "自分の")。状態のReactとReduxの伝搬の変化

質問はComponent1を変更するstateComponent1の原因となる派遣を行う際に、その小道具stateComponent1であるため、Component2は、再レンダリングする必要があります、ありますか?要は、これは起こらないということです。

EDIT:

行動

export const actionCreators = { 
    requestLogin: (credentials: Credentials): AppThunkAction<KnownAction> => (dispatch, getState) => { 
     dispatch({ 
      type: 'LOGIN_REQUEST', 
      isFetching: true, 
      isAuthenticated: false, 
      credentials: credentials 
     }); 
     const config = { 
      method: 'POST', 
      headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 
      body: `username=${credentials.username}&password=${credentials.password}` 
     }; 
     const loginTask = fetch(`http://localhost:50679/api/jwt`, config).then(response => response.json()).then((data) => { 
      if (!data.idToken) { 
       dispatch({ 
        type: 'LOGIN_FAILURE', 
        isFetching: false, 
        isAuthenticated: false, 
        message: 'Error en el login' 
       }); 
       return Promise.reject(data); 
      } else { 
       // If login was successful, set the token in local storage 
       if (typeof localStorage !== 'undefined') { 
        localStorage.setItem('idToken', data.idToken); 
       } 
       // Dispatch the success action 
       dispatch({ 
        type: 'LOGIN_SUCCESS', 
        isFetching: false, 
        isAuthenticated: true, 
        idToken: data.idToken 
       }); 
      } 
     }); 
    }, 

レデューサー:

export const reducer: Reducer<LoginState> = (state: LoginState, action: KnownAction) => { 
    switch (action.type) { 
    case 'LOGIN_REQUEST': 
     return { 
      isFetching: true, 
      isAuthenticated: false, 
      idToken: '', 
      credentials: action.credentials, 
      message: '' 
     }; 
    case 'LOGIN_SUCCESS': 
     return { 
      isFetching: false, 
      isAuthenticated: true, 
      idToken: action.idToken, 
      credentials: null, 
      message: '' 
     }; 
    case 'LOGIN_FAILURE': 
     return { 
      isFetching: false, 
      isAuthenticated: false, 
      idToken: '', 
      credentials: null, 
      message: action.message 
     }; 
    case 'LOGOUT_SUCCESS': 
     return { 
      isFetching: true, 
      isAuthenticated: false, 
      idToken: '', 
      credentials: null, 
      message: '' 
     }; 
    default: 
     // The following line guarantees that every action in the KnownAction union has been covered by a case above 
     const exhaustiveCheck: any = action; 
    } 

    return state || unloadedState; 
}; 

今、私は基本的にこれは、私がログインを行う店舗を持っているあなたに私のコード

を表示私は、ログイン状態に加入しているコンポーネントを持っています。このコンポーネントは、この状態が変化したときに「検出」する必要があります例えば、S、すなわち、ログインが行われたときに、私はこれを行う:

return connect(
    (state: ApplicationState) => 
    Object.assign(state.login, state.location, state.history) 
)(AuthenticatedComponent); 

問題はstate.loginが変更されたときに、私のAuthenticationComponentコンポーネントがわからないということです。

+1

コンポーネント2が 'stateComponent1'を使用すると、状態のセグメントが変更されたときにコンポーネント2を再レンダリングする必要があることがわかりますか? –

+0

さて、コンポーネント1の状態セグメントがコンポーネント2の小道具の一部であるとしましょう。したがって、コンポーネント1のディスパッチを介してコンポーネント2を変更すると、コンポーネント2を再レンダリングする必要があります。少なくともそれは私が考えたものだ –

+0

あなたのレデューサーのコードを共有できますか? – Faris

答えて

0

shouldComponentUpdateを上書きする必要があります。

shouldComponentUpdate(nextProps) { 
    if (nextProps.stateComponent1 !== this.props.stateComponent1) { 
    return false; 
    } 
    return true; 
} 
+0

このオプションは論理的ですが、自動的に行うべきではありませんか?なぜコンポーネントの小道具が変更されたときにコンポーネントが再びレンダリングされるのか理解したいのですが、この小道具がconnect()メソッドによって割り当てられた状態のセグメントである場合、 reduxの機能 –

+0

おそらく、減速機が状態を正しく変更していない可能性があります。通常、減速機は 'state.segment.mod = 'xyz''を実行する代わりに '{... state、segment:{... state.segment、mod: 'xyz'}}'を返すべきです。これは、ネストされたオブジェクトが関与している場合に特に当てはまります。 – vijayst

関連する問題