反应原生Redux useDispatch无法正常运行

时间:2020-04-25 15:05:52

标签: reactjs react-native redux react-redux

我尝试创建Redux,但是当我尝试执行调度时却遇到问题。

动作文件userActions.js:

export const setId = () => {
   console.log("Enter to set id func");
   return {
      type: 'SET_ID'
   }
}

Reducer文件userReducer.js:

const INITIAL_STATE = {
    id: "",
    email: "",
    name: "",
};

const userReducer = (state = INITIAL_STATE, action) => {
    console.log('Enter to userReducer');
    switch (action.type) {
        case "SET_ID": {
            // console.log(action.payload);
        }
        default: {
            return state;
        }
    }
}

export default userReducer;

combineReducers文件:

import userReducer from "./userReducer";
import { combineReducers } from "redux";

const allReducers = combineReducers({
    userReducer: userReducer
})

export default allReducers;

App.js文件:

import React from 'react';
import Routes from "./Routes";
import { createStore } from "redux";
import allReducer from "./app/reducers";
import { Provider } from "react-redux";

const store = createStore(
   allReducer
);

const App = () => {
 return (
    <Provider store={store}>
      <Routes />
    </Provider>
 );
};

export default App;

在登录屏幕文件中,当我单击他的呼叫以调度到“ setId”操作时,我有一个按钮。
这是我从Login.js获得的一些代码:

import { useDispatch } from 'react-redux';
import { setId } from '../actions/userActions';
handleLoginResult = (error, user) => {
        console.log('Enter to handleLoginResult');
        if (error !== "") {
            this.setState({ generalError: error });
        } else {
            const dispatch = useDispatch();
            console.log('uid: ', user.user.uid);
            dispatch(setId());
            alert("Login!");
        }
    }

问题是什么,为什么不输入setId操作?

3 个答案:

答案 0 :(得分:1)

您可以尝试这样

const userReducer = (state = INITIAL_STATE, action) =>dispatch =>{
console.log('Enter to userReducer');
switch (action.type) {
    case "SET_ID": {
        // console.log(action.payload);
    }
    default: {
        return state;
    }
}

}

答案 1 :(得分:0)

我不太理解您的问题,但我举一个例子说明我的行为

export const register_user = ({ name, email, password, password_confirmation }) => {
    return dispatch => {
        dispatch(
            {
                type: CREATE_USER
            }
        )
        let url = "/users"
        Axios.post(`${SERVER}${url}`, {
            "user": {
                "name": name,
                "email": email,
                "password": password,
                "password_confirmation": password_confirmation
            }
        })
        .then(() => {
            Alert.alert('Registrado com sucesso!')
            registerUserSuccess(dispatch)
        })
        .catch((err) => {
            registerUserError(err, dispatch)
        })
    }
}

const registerUserSuccess = (dispatch) => {
    dispatch(
        {
            type: CREATE_USER_SUCCESS
        }
    )
    this.props.navigation.navigate('Login')
}

const registerUserError = (err, dispatch) => {
    dispatch(
        {
            type: CREATE_USER_ERROR
        }
    )
    Alert.alert('Algo deu errado, verifique suas credenciais.')
}

类型是从我的减速器中导出的。

然后将register_user常量导入并在我的寄存器屏幕上使用。

答案 2 :(得分:0)

不能在函数内部使用钩子。它们需要直接在功能组件内部声明。

也不能在类组件内部使用useDispatch钩子,必须对类组件使用connect。

假设您有一个类组件,根据使用this.setState的方式来判断,您将像这样编写代码

class Login extends React.Component {

   ...
   handleLoginResult = (error, user) => {
        console.log('Enter to handleLoginResult');
        if (error !== "") {
            this.setState({ generalError: error });
        } else {
            const dispatch = this.props;
            console.log('uid: ', user.user.uid);
            dispatch(setId());
            alert("Login!");
        }
    }
    ...

}


export default connect()(Login)

但是,如果您要将登录作为功能组件来编写,则将其写为

const Login = (props) => {
   const dispatch = useDispatch();
   const [state, setState] = useState({});
   ...
   const handleLoginResult = (error, user) => {
        console.log('Enter to handleLoginResult');
        if (error !== "") {
            setState({ generalError: error });
        } else {
            console.log('uid: ', user.user.uid);
            dispatch(setId());
        }
    }
    ...
}