React、Redux 和重组:"dispatch is not a function"

React, Redux and Recompose: "dispatch is not a function"

我有一个 container/component(来自 Redux 示例)抱怨“dispatch 不是函数”。在我添加 Recompose 之前,我已经完成了这项工作。我认为 Recomposedispatch() 周围放置了一个包装器,所以我需要以某种方式公开它。也许 applyMiddleware 可以解决问题,但我不知道在哪里连接?我需要做什么?

容器:

const AddTodo = (props, dispatch) => {
  let input;
  const { classes } = props;
  return (
    <div>
      <form
        id="my-form-id"
        onSubmit={e => {
          e.preventDefault();
          if (!input.value.trim()) {
            return;
          }
          dispatch(addTodo(input.value));//<<<OFFENDING LINE
          input.value = "";
        }}
      >
        <TextField
          id="agentName"
          label="Agent Name"
          placeholder="Placeholder"
          form="my-form-id"
          inputRef={el => (input = el)}
          className={classes.textField}
          margin="normal"
        />
        <Button variant="extendedFab" type="submit" className={classes.button}>
          <AddIcon className={classes.addIcon} />
          New Todo
        </Button>
      </form>
    </div>
  );
};

export default compose(
  withStyles(styles),
  connect()
)(AddTodo);

根目录index.js:

import React from "react";
import { render } from "react-dom";
import { createStore, applyMiddleware } from "redux";
import { Provider } from "react-redux";
import App from "./components/App";
import rootReducer from "./reducers";

const store = createStore(rootReducer);

render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById("root")
);

connect 将 dispatch 作为 prop 传递给连接的组件,你应该从 props 中解构它。

const AddTodo = ({classes, dispatch}) => {
  let input;

  return (
    <div>
      <form
        id="my-form-id"
        onSubmit={e => {
          e.preventDefault();
          if (!input.value.trim()) {
            return;
          }
          dispatch(addTodo(input.value));
          input.value = "";
        }}
      >
        <TextField
          id="agentName"
          label="Agent Name"
          placeholder="Placeholder"
          form="my-form-id"
          inputRef={el => (input = el)}
          className={classes.textField}
          margin="normal"
        />
        <Button variant="extendedFab" type="submit" className={classes.button}>
          <AddIcon className={classes.addIcon} />
          New Todo
        </Button>
      </form>
    </div>
  );
};

export default compose(
  withStyles(styles),
  connect()
)(AddTodo);

有两个基本的东西需要理解。

1。 编写时 connect() Redux 添加 dispatch 作为 prop。

export default compose(
  withStyles(styles),
  connect() // <-- This adds dispatch to props.
)(AddTodo);

2。 您应该将 props 作为单个对象或 destructure branches of the props object 访问。

这一行是误会的地方。

const AddTodo = (props, dispatch) => { // <-- dispatch is not an parameter, it exists at props.dispatch

要使用现有模式解决问题,请执行此操作。

const AddTodo = (props) => {
  let input;
  const { classes, dispatch } = props;
  return (
  ...

您可以选择直接解构 props 参数。

const AddTodo = ({ classes, dispatch }) => {
  let input;
  return (
  ...

无论使用哪种方法,其余代码都将按预期工作。