mapDispatchToProps 不工作。 props 为空(错误:redux action 不是函数)
Posted
技术标签:
【中文标题】mapDispatchToProps 不工作。 props 为空(错误:redux action 不是函数)【英文标题】:mapDispatchToProps not working. Props empty (error: redux action is not a function) 【发布时间】:2017-12-05 13:28:38 【问题描述】:我收到此错误:this.props.postBooks 不是函数。
我有一个动作 - postBooks - 我试图通过道具发送。
这是我的组件:
"use strict"
import React from 'react'
import Well,Panel,FormControl,FormGroup,ControlLabel,Button from 'react-bootstrap'
import connect from 'react-redux'
import bindActionCreators from 'redux'
import postBooks from '../../actions/booksActions'
import findDOMNode from 'react-dom'
export class BooksForm extends React.Component
handleSubmit()
const book = [
title: findDOMNode(this.refs.title).value,
description: findDOMNode(this.refs.description).value,
price: findDOMNode(this.refs.price).value
]
this.props.postBooks(book)
render()
return(
<Well>
<Panel>
<FormGroup controlId='title'>
<ControlLabel> Title </ControlLabel>
<FormControl
type='text'
placeholder='Enter Title'
ref='title' />
</FormGroup>
<FormGroup controlId='description'>
<ControlLabel> Enter Description </ControlLabel>
<FormControl
type='text'
placeholder='Enter Description'
ref='description' />
</FormGroup>
<FormGroup controlId='price'>
<ControlLabel> Enter Price </ControlLabel>
<FormControl
type='text'
placeholder='Enter Price'
ref='price' />
</FormGroup>
<Button
onClick=this.handleSubmit.bind(this)
bsStyle='primary'> Enter New Book </Button>
</Panel>
</Well>
)
function mapDispatchToProps(dispatch)
return bindActionCreators(postBooks,dispatch)
export default connect(null,mapDispatchToProps)(BooksForm);
似乎调度没有按预期映射到道具,因为在控制台记录道具时,道具是空的。任何帮助表示赞赏。提前致谢
编辑:添加操作
"use strict"
// POST A BOOK
export function postBooks(book)
return
type:"POST_BOOK",
payload: book
// DELETE A BOOK
export function deleteBooks(id)
return
type:"DELETE_BOOK",
payload: id
//UPDATE BOOK
export function updateBooks(book)
return
type:"UPDATE_BOOK",
payload: book
//Retrieve all books as if using API
export function getBooks()
return
type:'GET_BOOKS'
【问题讨论】:
我们可以看到mapDispatchToProps
代码吗?
如果我理解正确的话,mapDispatchToProps 函数位于组件代码的底部。
【参考方案1】:
请在导入 redux 商店后重试。让我知道这是否有效。也不建议使用 refs。 https://facebook.github.io/react/docs/refs-and-the-dom.html
【讨论】:
在 bindActionCreators 内的 postBooks 周围加上花括号。动作创建者应该是一个函数,你给了它一个对象。我想这就是问题所在。告诉我。 我不这么认为。通过使用对象,我让 bindActionCreators 知道这个组件中的 postBooks 属性应该调度我从 bookActions 模块导入的 postBooks 动作。我以前用过这种格式没有问题。【参考方案2】:想通了。
所以我在顶部导出组件并在下面导出默认值。
注意到 webpack 给出错误“导入和导出可能只出现在顶层”。继续并删除了顶部导出,现在可以按预期工作。
【讨论】:
我很高兴它现在对你有用,但我认为这实际上不是你的问题。export class BooksForm ...
和 export default connect
之间的区别是一个使用 import BooksForm from './BooksForm'
导入另一个文件,另一个是 import BooksForm from './BooksForm'
(注意括号)。您导出的方式很好,并且通常出于测试目的这样做。 webpack 错误为more likely related to an error in your babel config。
我还从 Class 行中删除了我的导出并重建了我的项目,反应原生。现在工作。谢谢。
我犯同样错误的原因是我从现有的导出常规组件转到将组件连接到 redux。
这也是我的问题。不错的选择。【参考方案3】:
遇到同样的问题,我刚刚从import
中删除了花括号:
来自
import AppTest from "./AppTest";
到
import AppTest from "./AppTest";
这似乎解决了问题。请注意,我的班级已经有了“导出默认值”。
【讨论】:
【参考方案4】:所以我遇到了同样的问题,并且问题与其他有用的答案中显示的相同,但我会尝试更详细地解释为什么会发生这种情况
如果我们使用默认导出和命名导出来定义类,如下所示(基于问题):
// named export
export class BooksForm extends React.Component
.......
function mapDispatchToProps(dispatch)
return bindActionCreators(postBooks,dispatch)
// default export
export default connect(null,mapDispatchToProps)(BooksForm);
那么我们在导入类的时候要小心导入默认导出而不是命名导出:
这将导入默认导出并应与 redux 一起正常工作
import BooksForm from "./thePath"
这会导入命名的导出并且不适用于 redux
import BooksForm from "./thePath"
如果我们在同一个类中定义两个导入(通常这样做是为了使单元测试更容易):
那么我们必须在渲染组件时导入默认导出,才能使用我们导出的redux connect()高阶函数。
有时,如果您只依赖编辑器自动导入,它会导入命名的导出(没有 redux 连接),因此会报错
底线
您不必删除 2 个导出中的任何一个,只需导入默认导出(不带大括号)即可正确使用 redux connect()
【讨论】:
【参考方案5】:我曾经遇到过同样的问题,我发现将两个文件相互导入会导致某种无限循环,并且只会中断该过程。我正在使用流静态类型检查器,当我将我的操作导入到我的组件中时,我将我的组件导入到我的操作文件中进行类型检查,并且发生了这个问题,所以我删除了将我的组件导入到我的操作文件中,并且问题解决了。
【讨论】:
以上是关于mapDispatchToProps 不工作。 props 为空(错误:redux action 不是函数)的主要内容,如果未能解决你的问题,请参考以下文章
如何测试从 mapDispatchToProps 传递的函数(React/Redux/Enzyme/Jest)
redux mapDispatchToProps 不更新状态
为啥 mapStateToProps 和 mapDispatchToProps 不只是 Redux 中的一个函数?
React.js - 简而言之,啥是 mapDispatchToProps?
next.js mapStateToProps、mapDispatchToProps 和 getInitialProps