首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误操作的Redux问题可能没有未定义的"type“属性。

错误操作的Redux问题可能没有未定义的"type“属性。
EN

Stack Overflow用户
提问于 2021-11-10 17:50:20
回答 1查看 117关注 0票数 1

我是第一次在API中使用带有异步调用的redux。我面临这个错误的问题“操作可能没有一个未定义的"type”属性。

如果有人很了解redux,请检查这段代码。我还更正了下面的文件名。

下面介绍了我的代码:

actionTypes.js

代码语言:javascript
复制
export const SET_LOGIN_STATE = "SET_LOGIN_STATE"

actions.js

代码语言:javascript
复制
import * as t from '../constants/actionTypes';

const setloginState = (logindata) => {

    return {
        type: t.SET_LOGIN_STATE,
        payload: logindata,
    }

}

reducer.js

代码语言:javascript
复制
import * as t from '../constants/actionTypes';


const initialState = {
    isLoggedIn: false,
    userId: '',
    token: '',
    refreshToken: '',
    expiresOn: '',
    data: '',
  };

  
export const loginReducer = (state = initialState, action) => {
  switch (action.type) {
    case t.SET_LOGIN_STATE:
      return {
        ...state,
        ...action.payload, // this is what we expect to get back from API call and login page input
        isLoggedIn: true, // we set this as true on login
      };
    default:
      return state;
  }
};

store.js

代码语言:javascript
复制
    import thunkMiddleware from 'redux-thunk';
    import { createStore, combineReducers, applyMiddleware } from 'redux';
    //import { composeWithDevTools } from 'redux-devtools-extension/developmentOnly'; // this is for debugging with React-Native-Debugger, you may leave it out
    import { loginReducer } from '../reducers/reducer';

const rootReducer = combineReducers({
  loginReducer: loginReducer,
});

export const store = createStore(
  rootReducer,
  applyMiddleware(thunkMiddleware)
);

UI - app.js

代码语言:javascript
复制
    import logo from './logo.svg';
    import './App.css';
    import axios from 'axios';
    import {useForm} from 'react-hook-form';
    import {useDispatch} from 'react-redux';
    import {login} from './actions/actions';
    
    function App() {
      const { register, formState: { errors }, handleSubmit } = useForm();
    
      const _doLogin =  async data => {
          
    
            // axios post
            return (dispatch) => { 
            axios.post('/invoice/webapps/api/login', data, {
                headers: {
                   Accept: 'application/json',
                  'Content-Type': 'application/json'
                }})
              .then(function (response) {
                var responsedata=JSON.parse(JSON.stringify(response));
                if(responsedata.data.login_status === "Done"){
    
            console.log("correct");
                  //  localStorage.setItem("authtoken", responsedata.data.api_token);
                  //dispatch(setLoginState('correct'));
                
                }
                else{ /// invalid login
    
            console.log("correct");
                
                }
              })
              .catch(function (error) {
                //Swal.fire("Error", error, "warning");
                console.log(error);
              });
    
        }
    
    }
    
    
      return (
        <div className="App">
          <div>Login 
          <form className="form" onSubmit={handleSubmit(useDispatch(_doLogin))}>
            Enter your username : <input className="form-control h-auto form-control-solid py-4 px-8" type="text" 
                                        placeholder="Email"  autoComplete="off" {...register("email", {
                                            required: true, 
                                            pattern: {
                                               value: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
                                               message: 'Please enter a valid email',
                                           }, })}/>
            Enter your password :   <input className="form-control h-auto form-control-solid py-4 px-8" type="password"
                                         placeholder="Password" autoComplete="off" 
                                         {...register("password", {
                                             required: true, 
                                             })} />
            <input type="submit" value="Login"/>
            </form>
          </div>
        </div>
      );
    }
    
    export default App;
EN

回答 1

Stack Overflow用户

发布于 2021-11-10 18:42:23

我认为这不是使用useDispatch的方式。在组件的主体上,您需要这样称呼它:

代码语言:javascript
复制
const dispatch = useDispatch();

然后在你的_doLogin中使用它

绑定您的submitHandler应该如下所示:onSubmit={handleSubmit(_doLogin)}

完整的守则如下:

代码语言:javascript
复制
import logo from './logo.svg';
import './App.css';
import axios from 'axios';
import {useForm} from 'react-hook-form';
import {useDispatch} from 'react-redux';
import {setLoginState} from './actions/actions';
    
function App() {
  const { register, formState: { errors }, handleSubmit } = useForm();
  const dispatch = useDispatch();
    
  const _doLogin =  async data => {
    //axios post
    return axios.post('/invoice/webapps/api/login', data, {
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      }}).then(function (response) {
        var responsedata=JSON.parse(JSON.stringify(response));
        if(responsedata.data.login_status === "Done"){
         console.log("correct");
         //localStorage.setItem("authtoken", responsedata.data.api_token);
         dispatch(setLoginState('correct'));
       } else {
        // invalid login
       }
      }).catch(function (error) {
                //Swal.fire("Error", error, "warning");
                console.log(error);
     });    
    }
    
    
      return (
        <div className="App">
          <div>Login 
          <form className="form" onSubmit={handleSubmit(_doLogin)}>
            Enter your username : <input className="form-control h-auto form-control-solid py-4 px-8" type="text" 
                                        placeholder="Email"  autoComplete="off" {...register("email", {
                                            required: true, 
                                            pattern: {
                                               value: /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
                                               message: 'Please enter a valid email',
                                           }, })}/>
            Enter your password :   <input className="form-control h-auto form-control-solid py-4 px-8" type="password"
                                         placeholder="Password" autoComplete="off" 
                                         {...register("password", {
                                             required: true, 
                                             })} />
            <input type="submit" value="Login"/>
            </form>
          </div>
        </div>
      );
    }
    
    export default App;

编辑1

确保从actions.js导出操作并将其命名为LoginState

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69917941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档