我正在使用Recompose設置React Native中的用戶登錄屏幕,其中包含單獨的動作和reducer文件,但我的reducer永遠不會被調用。目前,還只是觸發doUserLogin()
重新合成處理登錄按鈕:React Native重構動作不觸發reducer
loginScreen.js
import React from 'react';
import { Button, Text, View } from 'react-native';
import { connect } from 'react-redux';
import { withHandlers, compose } from 'recompose';
import { loginUser } from './user/userActions';
const LoginScreen = ({ user, doUserLogin }) => {
return (
<View style={styles.loginContainer}>
{user ? <Text>Hi, {user.name}!</Text> : <Text>NOT Logged in!</Text>}
<Button title="Log In" onPress={doUserLogin} />
</View>
);
};
export default compose(
connect((state, props) => ({
...state.user,
})),
withHandlers({
doUserLogin: props =>
(event) => {
console.log('LOGIN USER IN HANDLER'); // <-- THIS IS WORKING
loginUser();
},
}),
)(LoginScreen);
的doUserLogin()
處理程序依次調用我的行動loginUser()
文件:
userActions.js:
import { LOGIN_REQUEST } from './actionTypes';
export const loginUser =() => {
return (dispatch) => {
console.log('In action'); // <-- THIS IS WORKING
dispatch({ type: LOGIN_REQUEST });
};
};
到目前爲止,這麼好。但是,當我dispatch()
,我的減速機從來沒有被稱爲。但減速爲撿其他行動(從導航等) - 它根本不是從loginUser()
收到上述動作:
userReducer.js:
import { LOGIN_REQUEST } from './actionTypes';
const userReducer = (state = initialState, action) => {
console.log('In reducer'); <-- ** THIS IS NEVER CALLED **
switch (action.type) {
case LOGIN_REQUEST:
return Object.assign({}, state, {
isFetching: true,
});
case LOGOUT:
return initialState;
default:
return state;
}
};
export default userReducer;
任何建議將不勝讚賞。
嗨,何塞。感謝你的回答!不確定你到底在說什麼。你可以用一些代碼來擴展答案嗎? – GollyJer
@GollyJer在代碼中添加了一個小例子... –