javascript – React:动作创建者不调用reducer
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – React:动作创建者不调用reducer,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3874字,纯文字阅读大概需要6分钟。
内容图文
![javascript – React:动作创建者不调用reducer](/upload/InfoBanner/zyjiaocheng/764/24ae8492069a46e8b4277b118d772149.jpg)
我正在我的动作创建者中进行异步调用并使用结果调用我的reducer,但由于某种原因我无法理解减速器没有被调用.
actions.js(动作和动作创建者)
export const GET_FORMS = 'GET_FORMS'
export function getForms() {
$.get("server url", function(result) {
return {
type: GET_FORMS,
formlist: result.data.forms
}
})
}
reducers.js
import { GET_FORMS } from '../actions/actions'
export default function formAction(state = {forms:[]}, action) {
console.log("received action"+action.type)
switch (action.type) {
case GET_FORMS:
console.log("Action:"+action);
return Object.assign({},state,{
forms:action.formlist
})
default:
return state
}
}
App.js
import React, { Component, PropTypes } from 'react'
import ReactDOM from 'react-dom';
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import auth from '../auth'
import FormTable from '../components/FormTable'
import * as FormActions from '../actions/actions'
class App extends Component {
constructor(props) {
super(props);
this.state = {forms: []};
}
componentDidMount() {
// for some reason if i write this.props.actions.getForms () i get an error
// Uncaught Error: Actions must be plain objects. Use custom middleware for
// async actions.
FormActions.getForms();
}
render() {
const {forms,actions} = this.props
console.log(forms);
return (
<FormTable results={forms} actions = {actions} />
)
}
}
App.PropTypes = {
forms: PropTypes.array.isRequired
}
function mapStateToProps() {
const {
forms:forms
} = {forms:[]}
return {
forms
}
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(FormActions, dispatch)
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(App)
解决方法:
这里有一些事情.
>您的动作创建者不会返回它正在创建的动作. $.get不返回动作,因此将其映射到dispatch是没有效率的.
合理地,这可能会导致对如何从异步动作创建者返回动作感到困惑.由于它是异步的,因此它无法返回最终结果(除非你使用es7异步等待).您尝试的模式与此相同:
class App extends Component {
...
componentDidMount() {
// Instead of calling getForms, do the same directly
$.get(url, function(res) {
return { type: GET_FORMS, forms: res };
});
}
render() { ... }
}
从$.get api我们知道$.get返回jqXHR object
,不是任何行动.所以你必须在自己的回调中使用结果 – 你不能只返回它.下面是componentDidMount的示例(请注意回调绑定到此):
componentDidMount() {
$.get(url, function(res) {
this.props.dispatch({ type: GET_FORMS, forms: res });
}.bind(this))
}
>在组件或动作创建器中执行异步操作是反模式的,或者至少是不鼓励的.在这种情况下,您将在动作创建者中定义异步,这很棒.但是你也在执行异步操作,这很糟糕.相反,您应该使用某种中间件来处理异步操作.中间件只是在调度后采取行动并对其进行处理的函数,而最常见的是redux-thunk.使用redux-thunk,您只需返回一个接受dispatch作为参数的函数.在这种情况下,您的动作创建者将如下所示:
export function getForms() {
return function(dispatch) {
$.get(url, function(result) {
dispatch({ type: GET_FORMS, forms: result });
})
}
}
这与你正在做的非常类似,除了你正在创建一个thunk – 这只是一个定义另一个函数以便稍后执行的函数 – 而不是现在实际执行异步操作,你定义它以后执行.
>你实际上并没有派遣任何东西.
要修复的最简单的问题,但绝对是障碍:)在componentDidMount中,您正在调用已导入的动作创建者,但您不是在调用dispatch.你有50%的方式,因为你通过了动作创建者来连接,但即使你这样做了,你也没有调用绑定动作创建者将传递连接到prop – 你称之为未绑定的动作.
因此,不需要调用FormActions.getForms(),而是需要调用this.props.actions.formActions().前者不受约束,后者则受约束.调用后者与执行this.props.dispatch(FormActions.getForms())相同.
>最后:在这种情况下,您不需要定义mapDispatchToProps.您可以将对象传递给connect的参数.见下文:
// Instead of this
export default connect(mapStateToProps, mapDispatchToProps)(App);
// do this:
export default connect(mapStateToProps, FormActions)(App);
// creates the bound action creator 'this.props.getForms()'
这个主要是一个样式选择,但我认为这是一个很好的模式:)对于多个动作创建者源对象,你可以这样做:
export default connect(mapStateToProps, { ...FormActions, ...UserActions })(App);
内容总结
以上是互联网集市为您收集整理的javascript – React:动作创建者不调用reducer全部内容,希望文章能够帮你解决javascript – React:动作创建者不调用reducer所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。