2017-07-25 17 views
0

私はログインページコンポーネントを持っていますが、ユーザーリストを確認するログインボタンをクリックすると、isUserAuthenticatedというブール値を持っています。存在するか否かを判断する。ユーザーリストがsignupreducerにある場合、どうすればloginreducerのユーザーリストにアクセスし、そこからisUserAuthenticatedフラグを返すことができますか?ここでreat reduxの他のレデューサーのレデューサーの状態にアクセスするには

LoginPageコンポーネント

export const mapStateToProps = (state) => { 
    return { 
     isUserAuthenticated: state.reducer.isAuthenticated.isUserAuthenticated, 
     users: state.SignupReducer.users 
    } 
} 

export const mapDispatchToProps = (dispatch) => { 
    return { 
     checkLogin: (credentials) => dispatch({ type: 'CHECK_LOGIN', credentials }) 
    } 
}; 

LoginPage = connect(mapStateToProps, mapDispatchToProps)(LoginPage); 

export default LoginPage; 

ログインリデューサー

const initialStateAuth = { 
    isUserAuthenticated: false 
}; 

export const isAuthenticated = (state = initialStateAuth, action) => { 
    switch (action.type) { 
     case 'CHECK_LOGIN': 
      return Object.assign({}, state, { isUserAuthenticated: checkLogin(state, action) }) 
     default: 
      return state; 
    } 
} 

実際に私はここにアクセスする方法を singupReducer.usersでユーザーをチェックしたい....

const checkLogin = (state, action) => { 
    let isExist = false; 
    signupReducer.users.map((each) => { 
     if (each.userName === action.credentials.username && each.password === action.credentials.password) { 
      isExist = true; 
     } 
    }); 
    return state.isUserAuthenticated = false; 

} 
+0

スペルの問題があるようです。場合によっては 'singupReducer'または' SignupReducer'を使用します。 –

+0

@DamienGoldこれまでのところ、私は唯一の場所で使っていましたが、これは実際には私は "signupReducer"と言いました。私の質問は、私は特定の減速機で他の減速機の状態にアクセスする方法です。ありがとう – kumar

答えて

2

combineReducersを使って状態ツリーを設定しているとします。必要な状態(サインアップから)をログイン・リデューサに渡すカスタムの組み合わせ機能を記述する必要があります。

Reduxのドキュメントでこれを行う方法の例があります:あなたは減速の間でデータを共有したくない場合はhttp://redux.js.org/docs/recipes/reducers/BeyondCombineReducers.html#sharing-data-between-slice-reducers

0

別の方法は、あります。これを達成するには、getStateを使用して、あなたが必要とするものを、それを必要とする減速機に送信しているアクションの状態から取り込みます。次に例を示します。Alternative to sharing data between slice reducers

function someSpecialActionCreator() { 
    return (dispatch, getState) => { 
     const state = getState(); 
     const dataFromB = selectImportantDataFromB(state); 

     dispatch({ 
      type : "SOME_SPECIAL_ACTION", 
      payload : { 
       dataFromB 
      } 
     }); 
    } 
} 
+0

カスタム関数を記述することなくこれを行う方法はありますか? – kumar

+0

カスタム関数を記述しないでください。いいえ:(最低でも 'mapDispatchToProps'、コンポーネントの' connect'、 'actionCreators'、状態の更新を扱う' reducer'が必要です。 –

0

誰が私を提案し、私はこのように私は今にアクセスすることができるよんでしたし、それが働いていることはやっての正しい方法です。

export const mapStateToProps = (state) => { 
    return { 
     isUserAuthenticated: state.reducer.isAuthenticated.isUserAuthenticated, 
     users: state.SignupReducer.users 
    } 
} 
ここ

私は最終的に私は、ログインのcredentilasで自分の行動を派遣しています。この

onLogin =() => { 
     var credentials = { 
      username: this.userName, 
      password: this.password 
     } 
     var loginFormData ={ 
      credentials:credentials, 
      users:this.props.users 
     } 
     this.props.checkLogin(loginFormData); 
    } 

ように私のクリックイベントにクラスを準備していた後、私はその後mapStateToProps内の他の減速状態を選択しています他の還元剤の形態と状態

export const mapDispatchToProps = (dispatch) => { 
    return { 
     checkLogin: (loginFormData) => dispatch({ type: 'CHECK_LOGIN', loginFormData }) 
    } 
}; 
関連する問題