15

我正在尝试创建一个带有 CSV 上传的应用程序。当上传 CSV 时,它会改变状态,然后我会从 CSV 解析为 JSON 并用它做一些事情。这个想法是上传文件并更新状态。一旦该状态更新,我会将 CSV 传递给 Meteor.method 以解析为 JSON。我正在使用 Meteor、React 和 Redux。我有一个处理上传、一个动作和一个减速器的组件。所有文件都在下面——我是 Meteor、React 和 Redux 的新手,我终其一生都无法弄清楚为什么这不起作用。我不认为我完全理解我想要完成的事情。欢迎任何建议。

错误 - 未捕获的类型错误:fileUpload 不是函数 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 是一个动作并且它正在被导入,它为什么是“不是一个函数”。?如果有人可以伸出援助之手,我将不胜感激。

谢谢!

4

6 回答 6

25

容易忽略此问题的一个原因如下:

如果我们使用默认导出和命名导出定义组件类,如下所示:

// 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"

原因

为了使用我们导出的 redux connect() 高阶函数,我们必须在渲染组件时导入默认导出

有时,如果您只依赖编辑器自动导入,它将导入命名导出(没有 redux 连接),因此会给出该错误

底线

调用组件时确保导入默认导出(不带大括号)正确使用redux connect()

于 2018-11-27T13:08:13.947 回答
4

重新启动您的应用程序

我遇到了同样的问题,只是因为我忘了重新启动我的应用程序。所有的 Redux 操作都是在第一个状态下设置的,所以 Redux Store 不知道我已经实现了一个新功能。

希望这可以帮助某人。

于 2017-09-07T15:26:49.527 回答
2

因为您在渲染方法中定义了一个名为 fileUpload 的参数。删除您在渲染方法中定义的所有参数。该类对所有这些导入的模块具有闭包范围,因此您可以在类中的任何位置引用它们。

于 2016-04-13T03:18:18.770 回答
2

如果它对任何人有帮助,我会收到,TypeError: this.props.setCategories is not a function直到我注意到 for 的值setCategories应该是一个回调:

const mapDispatchToProps = dispatch => {
    return {
        setCategories: dispatch(actionCreator.setCategories()),  // cause of error
        onAgeUp: () => dispatch(actionCreator.ageUp(1)),
        onAgeDown: () => dispatch(actionCreator.ageDown(1))
    };
};
于 2019-04-06T23:05:59.440 回答
0

当我向 bindActionCreators 添加新导入时遇到了这个问题,而不是 { } 我用 [ ] 包装了它,所以检查你的括号

function mapDispatchToProps(dispatch) {
  return bindActionCreators({...UserActions, ...ModalActions}, dispatch)
}
于 2018-05-03T03:05:37.823 回答
0

导入元素时似乎不区分大小写。这也是我遇到同样问题的原因,所以请注意。

于 2017-01-30T19:26:17.910 回答