【问题标题】:Error: Actions may not have an undefined "type" property错误:操作可能没有未定义的“类型”属性
【发布时间】:2019-02-19 01:02:32
【问题描述】:

我是 Redux 的新手,React 的半新手。我用它做了一些简单的应用程序。我了解 Redux 的基本概念(将状态存储在中心位置),这听起来比通过组件/道具传递东西更优雅。

但是,我收到以下错误:

错误:操作可能没有未定义的“类型”属性。你有没有拼错一个常数?

onSubmit
src/containers/Login.js:28
  25 | 
  26 | const mapDispatchToProps = (dispatch) => ({
  27 |   onSubmit: (username, password) => {
> 28 |     dispatch(login(username, password))
  29 |   }
  30 | })
  31 | 

LoginForm._this.onSubmit
src/components/LoginForm.js:29
  26 | 
  27 | onSubmit = (event) => {
  28 |   event.preventDefault()
> 29 |   this.props.onSubmit(this.state.username, this.state.password)
  30 | }
  31 | 
  32 | render() {

如您所见,Login.js 中的调度行似乎存在问题。

Login.js 看起来像这样:

import React from 'react'
import { connect } from 'react-redux'
import { Redirect } from 'react-router'

import LoginForm from '../components/LoginForm'
import {login} from  '../actions/auth'
import {authErrors, isAuthenticated} from '../reducers'

const Login = (props) => {
  if(props.isAuthenticated) {
     return  <Redirect to='/' />
  }

  return (
     <div className="login-page">
       <LoginForm {...props}/>
    </div>
  )
}

const mapStateToProps = (state) => ({
  errors: authErrors(state),
  isAuthenticated: isAuthenticated(state)
})

const mapDispatchToProps = (dispatch) => ({
  onSubmit: (username, password) => {
    dispatch(login(username, password))
  }
})

export default connect(mapStateToProps, mapDispatchToProps)(Login);

根据我一直在谷歌搜索的内容,我的猜测是我实际上并没有丢失任何类型的数据,但实际上我的中间件可能存在问题。

可能会发生什么?我将如何解决或解释它?

编辑 - 这是我的登录功能:

export const login = (username, password) => ({
  [RSAA]: {
    endpoint: '/api/auth/token/obtain/',
    method: 'POST',
    body: JSON.stringify({username, password}),
    headers: { 'Content-Type': 'application/json' },
    types: [
      LOGIN_REQUEST, LOGIN_SUCCESS, LOGIN_FAILURE
    ]
  }
})

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    在使用 redux 时,我们需要遵循一定的“样板”。根据错误消息,它只是意味着dispatch 操作正在期待一个具有type 属性的对象

    dispatch({ type: 'ACTION_TYPE', .... });
    

    所以取决于 login(username, password) 返回的内容,redux dispatch 将期望一个具有 property 类型的对象

    【讨论】:

    • 人力资源部。我将添加登录功能所说的内容 - 我承认,我在教程中找到了我想要做的事情,所以它可能设置不正确。
    • @AndrewAlexander:很简单,在调度前做一个控制台日志。 console.log(login(username, password)); 看看它说了什么
    • Hrm,返回的对象似乎有类型。 @@redux-api-middleware/RSAA: body: "{"username":"fdsfdsdfs","password":"fdssdfdfs"}"endpoint: "/api/auth/token/obtain/"headers: {Content-Type : "application/json"}方法: "POST"类型: (3) ["@@auth/LOGIN_REQUEST", "@@auth/LOGIN_SUCCESS", "@@auth/LOGIN_FAILURE"]}
    • 但是调度动作需要一个普通的 JS 对象,所以也许你可以在调度之前对其进行按摩?
    • 哦,好的,知道了。我会去查看 Redux 文档并尝试正确格式化。
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2019-05-09
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多