React、Redux 和重组:"dispatch is not a function"
React, Redux and Recompose: "dispatch is not a function"
我有一个 container/component(来自 Redux
示例)抱怨“dispatch 不是函数”。在我添加 Recompose
之前,我已经完成了这项工作。我认为 Recompose
在 dispatch()
周围放置了一个包装器,所以我需要以某种方式公开它。也许 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 (
...
无论使用哪种方法,其余代码都将按预期工作。
我有一个 container/component(来自 Redux
示例)抱怨“dispatch 不是函数”。在我添加 Recompose
之前,我已经完成了这项工作。我认为 Recompose
在 dispatch()
周围放置了一个包装器,所以我需要以某种方式公开它。也许 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 (
...
无论使用哪种方法,其余代码都将按预期工作。