- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Error: Actions must be plain objects. Use custom middleware for async actions.
我试图在 mapDispatchToProps
中链接粗箭头函数,但它似乎不起作用。
容器和 Action 创建者:
// Actions Creator
const inputChange = (name: string) => (
e: React.FormEvent<HTMLInputElement>
) => ({
type: INPUT_CHANGE,
name,
value: e.currentTarget.value
});
// Dispatch
const mapDispatchToProps = {
inputChange
};
// Connect
export default connect(
mapStateToProps,
mapDispatchToProps
)(SignUp);
dumb组件
const SignUp = ({ inputChange }) => (
<input
type="password"
placeholder="Password"
onChange={inputChange('password')}
/>
);
也许这段代码的某些部分看起来有点奇怪,因为我删除了一些 types
以避免添加额外的无意义代码。
无论如何,错误来自 mapDispatchToProps
,使用单个粗箭头似乎没问题,但是当我开始链接它们时,我收到此错误(即使它们返回一个对象)。
最佳答案
由于提到的错误 actions
必须是普通对象,但是当您链接函数时,您实际上传递的是 function
(链上的下一个)而不是对象
。
这里的问题是,除了实际的 DOM
事件之外,您还想传递一个额外的参数,例如 input
的名称,即:“password "、"用户"等...
那为什么不直接给 input
一个名字,然后在 action creator 函数中获取它(就像你对 value
属性所做的那样)。
你的表单看起来像这样:
const Form = ({ inputChange, form }) => (
<div>
<input name="user" onChange={inputChange} type="text" value={form.user} />
<input name="password" onChange={inputChange} type="password" value={form.password} />
</div>
);
const mapState = state => ({
form: state
});
const mapDispatch = {
inputChange
};
const ConnectedForm = connect(
mapState,
mapDispatch
)(Form);
在你的 action creator 中:
const inputChange = ({ target }) => ({
type: INPUT_CHANGE,
payload: {
value: target.value,
inputName: target.name
}
});
你的 reducer 可以处理它,像这样:
const reducer = (state = {user: '', password: ''}, action) => {
switch (action.type) {
case INPUT_CHANGE: {
const { inputName, value } = action.payload;
return {
...state,
[inputName]: value
};
}
default:
return state;
}
};
运行示例:
// mimic imports
const { createStore } = Redux;
const { Provider, connect } = ReactRedux;
const INPUT_CHANGE = "INPUT_CHANGE";
const reducer = (state = {user: '', password: ''}, action) => {
switch (action.type) {
case INPUT_CHANGE: {
const { inputName, value } = action.payload;
const nextState = {
...state,
[inputName]: value
};
console.clear();
console.log('store', nextState);
return nextState;
}
default:
return state;
}
};
const inputChange = ({ target }) => ({
type: INPUT_CHANGE,
payload: {
value: target.value,
inputName: target.name
}
});
const store = createStore(reducer);
const Form = ({ inputChange, form }) => (
<div>
<input name="user" onChange={inputChange} type="text" value={form.user} />
<input name="password" onChange={inputChange} type="password" value={form.password} />
</div>
);
const mapState = state => ({
form: state
});
const mapDispatch = {
inputChange
};
const ConnectedForm = connect(
mapState,
mapDispatch
)(Form);
class App extends React.Component {
render() {
return (
<div>
<ConnectedForm />
</div>
);
}
}
const root = (
<Provider store={store}>
<App />
</Provider>
);
const rootElement = document.getElementById("root");
ReactDOM.render(root, rootElement);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.min.js
"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/4.4.10/react-redux.min.js"></script>
<div id="root"/>
关于javascript - mapDispatchToProps 中的链接粗箭头让我出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901716/
在学习 React-Redux 时,我偶然发现了以下代码,我不确定以下两行和使用 mapDispatchToProps 之间有什么区别? let { dispatch, actions } =
我有: const mapDispatchToProps = dispatch => ( { slipsRadioClickHandler: (value) => { disp
Error: Actions must be plain objects. Use custom middleware for async actions. 我试图在 mapDispatchToPro
我想对 mapDispatchToProps 使用速记符号,但是当我替换老式的 bindActionCreators 策略时 function mapDispatchToProps(dispatch:
假设一个无状态的功能性 UserProfile 组件显示给定 url 的用户数据。假设它被 connect(mapStateToProps, mapDispatchToProps)(UserProfi
在我的index.js中addCoin行动正在发挥作用。 import { addCoin } from './reducer/portfolio/actions' const element = d
我是 redux 的新手,遇到了 mapDispatchToProps 的问题, 我的 react 应用程序中有一个具有不同 div 的组件,每次用户单击 div 时,它都应该通过参数更改所选颜色,然
我有一个看似微不足道的问题,但我一生都无法弄清楚。 FooContainer.tsx ... public render() { ... this.props.onSubmit(123) //
这个问题已经有答案了: What is mapDispatchToProps? (6 个回答) 已关闭 4 年前。 mapStateToProps 之间有什么区别 和 mapDispatchToPro
我已经使用 redux 编写了一个容器组件,我的 mapDispatchToProps 实现如下所示 const mapDispatchToProps = (dispatch, ownProps) =
我对 mapDispatchToProps 有疑问。如何使用按钮中的 onClick 从 mapDispatchToProps “触发”操作? - 登录表单.js。我知道,我还有很多东西要学 :D c
我希望能够在发送参数的同时访问 mapDispatchToProps 中的事件对象。你如何看待这件事? 这是我目前所拥有的: const mapDispatchToProps = dispatch =
父组件 const myParentComponent = ({ sourceValue, classes, doStuff }) => { return (
人们似乎总是在他们需要的每个组件的底部定义这些函数,这是有原因的吗? 当我创建一个 react/redux 项目时,我将它们放在 /mappingFunctions 目录中,然后将它们导入到我需要它们
我不明白的是,在这个柯里化(Currying)风格声明中,为什么调度输入是第二个? connect 不是以 dispatch 作为输入调用这个函数,然后将返回值赋给 props 吗?所以返回值应该是获
我很难理解 mapDispatchToProps 这里使用了一个 mapDispatchToProps 函数 const mapDispatchToProps = () => { return {
我能看懂下面的示例代码: const mapStateToProps = state => { return { todo: state.todos[0] } } const mapD
我正在将 React 与 Redux 结合使用并遵循教程,但我终究无法找出这个错误。 Uncaught TypeError: this.props.fetchPosts is not a functi
请告诉我,为什么当我调用 this.props.getOnEvents() 时,会出现“getOnEvents() is not a function”的错误,这里出了什么问题,如何修复?我正在查看c
所以我的应用程序中有这个简化的结构: 在组件中我有: handlePageClick(data) { this.props.onChangePage(data.selected
我是一名优秀的程序员,十分优秀!