从组件调度时的 redux 动作 "is not a function"
redux action "is not a function" when dispatched from component
我正在尝试创建一个带有 CSV 上传的应用程序。上传 CSV 时,它会更改状态,然后我将从 CSV 解析为 JSON 并对其进行处理。这个想法是上传文件并更新状态。一旦该状态更新,我会将 CSV 传递给 Meteor.method 以解析为 JSON。
我正在使用 Meteor、React 和 Redux。我有一个处理上传的组件,一个动作和一个减速器。所有文件都在下面——我是 Meteor、React 和 Redux 的新手,我一辈子都弄不明白为什么这不起作用。我不认为我完全理解我想要完成的事情。欢迎提出任何建议。
ERROR - Uncaught TypeError: fileUpload is not a function UploadCSV.jsx
// ACTIONS - fileUpload.js
export default function fileUpload(file) {
return {
type: 'FILE_UPLOAD',
file
};
}
//REDUCERS - upLoad.js
export default function upLoad(state = 'NO_FILE', action = {}) {
switch (action.type) {
case 'FILE_UPLOAD':
return action.file;
default:
return state;
}
}
//COMPONENTS - UploadCSV.jsx
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import Dropzone from 'react-dropzone';
import { RaisedButton } from 'material-ui';
import { Colors } from 'material-ui';
import fileUpload from '../actions/fileUpload.js';
import { uploadCSV } from '../actions/uploadCSV.js';
class UploadCSV extends Component {
render( dispatch, file, fileUpload ) {
const onDrop = (file) => {
console.log(file);
}
const upLoad = () => {
this.props.dispatch(fileUpload(file));
};
return (
<div>
<Dropzone accept="csv"
onDrop={ () => {
return upLoad();
}}>
<div>Click or drop files here.</div>
</Dropzone>
</div>
)
}
}
export default connect()(UploadCSV);
我不明白为什么 fileUpload 是 "not a function" 如果它是一个动作并且正在导入。?如果有人能伸出援手,我将不胜感激。
谢谢!
因为您在渲染方法中定义了一个名为 fileUpload 的参数。删除您在渲染方法中定义的所有参数。 class 对所有这些导入的模块都有闭包作用域,因此您可以在 class 中的任何位置引用它们。
似乎导入的元素在导入时不区分大小写。这也是我遇到同样问题的原因,所以请注意。
重新启动您的应用程序
我有同样的问题只是因为我忘记重新启动我的应用程序。所有的 Redux 动作都是在初始状态设置的,所以 Redux Store 不知道我实现了一个新功能。
希望这对某人有所帮助。
我在将新导入添加到 bindActionCreators 时遇到了这个问题,而不是 { } 我用 [ ] 包装它所以检查你的括号
function mapDispatchToProps(dispatch) {
return bindActionCreators({...UserActions, ...ModalActions}, dispatch)
}
这个问题容易被遗漏的一个原因如下:
如果我们使用默认导出和命名导出定义组件class,如下所示:
// named export
export class MyComponent extends React.Component{
.......
function mapDispatchToProps(dispatch){
return bindActionCreators({reduxAction},dispatch)
}
// default export
export default connect(null,mapDispatchToProps)(MyComponent);
然后我们应该导入默认导出而不是命名导出:
这会导入默认导出并且应该与 redux 一起正常工作
import MyComponent from "./thePath"
这会导入命名的导出并且不适用于 redux
import {MyComponent} from "./thePath"
原因
我们在渲染组件的时候必须导入默认的export才能使用我们导出的redux connect()高阶函数.
有时,如果您只依赖于编辑器自动导入,它会导入命名的导出(没有 redux 连接),因此会出现该错误
底线
调用组件时确保导入默认导出(不带大括号)才能正确使用redux connect()
如果它对任何人有帮助,我收到 TypeError: this.props.setCategories is not a function
直到我注意到 setCategories
的值应该是回调:
const mapDispatchToProps = dispatch => {
return {
setCategories: dispatch(actionCreator.setCategories()), // cause of error
onAgeUp: () => dispatch(actionCreator.ageUp(1)),
onAgeDown: () => dispatch(actionCreator.ageDown(1))
};
};
我正在尝试创建一个带有 CSV 上传的应用程序。上传 CSV 时,它会更改状态,然后我将从 CSV 解析为 JSON 并对其进行处理。这个想法是上传文件并更新状态。一旦该状态更新,我会将 CSV 传递给 Meteor.method 以解析为 JSON。 我正在使用 Meteor、React 和 Redux。我有一个处理上传的组件,一个动作和一个减速器。所有文件都在下面——我是 Meteor、React 和 Redux 的新手,我一辈子都弄不明白为什么这不起作用。我不认为我完全理解我想要完成的事情。欢迎提出任何建议。
ERROR - Uncaught TypeError: fileUpload is not a function UploadCSV.jsx
// ACTIONS - fileUpload.js
export default function fileUpload(file) {
return {
type: 'FILE_UPLOAD',
file
};
}
//REDUCERS - upLoad.js
export default function upLoad(state = 'NO_FILE', action = {}) {
switch (action.type) {
case 'FILE_UPLOAD':
return action.file;
default:
return state;
}
}
//COMPONENTS - UploadCSV.jsx
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import Dropzone from 'react-dropzone';
import { RaisedButton } from 'material-ui';
import { Colors } from 'material-ui';
import fileUpload from '../actions/fileUpload.js';
import { uploadCSV } from '../actions/uploadCSV.js';
class UploadCSV extends Component {
render( dispatch, file, fileUpload ) {
const onDrop = (file) => {
console.log(file);
}
const upLoad = () => {
this.props.dispatch(fileUpload(file));
};
return (
<div>
<Dropzone accept="csv"
onDrop={ () => {
return upLoad();
}}>
<div>Click or drop files here.</div>
</Dropzone>
</div>
)
}
}
export default connect()(UploadCSV);
我不明白为什么 fileUpload 是 "not a function" 如果它是一个动作并且正在导入。?如果有人能伸出援手,我将不胜感激。
谢谢!
因为您在渲染方法中定义了一个名为 fileUpload 的参数。删除您在渲染方法中定义的所有参数。 class 对所有这些导入的模块都有闭包作用域,因此您可以在 class 中的任何位置引用它们。
似乎导入的元素在导入时不区分大小写。这也是我遇到同样问题的原因,所以请注意。
重新启动您的应用程序
我有同样的问题只是因为我忘记重新启动我的应用程序。所有的 Redux 动作都是在初始状态设置的,所以 Redux Store 不知道我实现了一个新功能。
希望这对某人有所帮助。
我在将新导入添加到 bindActionCreators 时遇到了这个问题,而不是 { } 我用 [ ] 包装它所以检查你的括号
function mapDispatchToProps(dispatch) {
return bindActionCreators({...UserActions, ...ModalActions}, dispatch)
}
这个问题容易被遗漏的一个原因如下:
如果我们使用默认导出和命名导出定义组件class,如下所示:
// named export
export class MyComponent extends React.Component{
.......
function mapDispatchToProps(dispatch){
return bindActionCreators({reduxAction},dispatch)
}
// default export
export default connect(null,mapDispatchToProps)(MyComponent);
然后我们应该导入默认导出而不是命名导出:
这会导入默认导出并且应该与 redux 一起正常工作
import MyComponent from "./thePath"
这会导入命名的导出并且不适用于 redux
import {MyComponent} from "./thePath"
原因
我们在渲染组件的时候必须导入默认的export才能使用我们导出的redux connect()高阶函数.
有时,如果您只依赖于编辑器自动导入,它会导入命名的导出(没有 redux 连接),因此会出现该错误
底线
调用组件时确保导入默认导出(不带大括号)才能正确使用redux connect()
如果它对任何人有帮助,我收到 TypeError: this.props.setCategories is not a function
直到我注意到 setCategories
的值应该是回调:
const mapDispatchToProps = dispatch => {
return {
setCategories: dispatch(actionCreator.setCategories()), // cause of error
onAgeUp: () => dispatch(actionCreator.ageUp(1)),
onAgeDown: () => dispatch(actionCreator.ageDown(1))
};
};