使用React,Redux和Axios处理异步请求?

我是React

JS和Redux的新手,它实在太庞大了,无法继续使用。我正在尝试使用Axios发出POST请求,但无法执行。可能是容器文件中缺少某些内容。下面是代码。检查plnkr

提交后,我收到@@ redux-form /

SET_SUBMIT_SUCCEEDED消息。但是,当我检查“网络”标签时,看不到对API的调用。而且,当我安慰提交的值时,我只会看到名称和全名值。它不包含徽标和详细信息。我想念什么?

   import React, { PureComponent } from 'react'

import PropTypes from 'prop-types'

import { Field,reduxForm } from 'redux-form'

import { Columns,Column, TextArea, Label,Button } from 'bloomer'

import FormField from 'FormField'

const validate = (values) => {

const errors = {}

const requiredFields =

['organizationName','organizationFullName','organizationDetails']

requiredFields.forEach((field) => {

if (!values[field]) {

errors[field] = 'This field can\'t be empty!'

}

})

return errors

}

const formConfig = {

validate,

form: 'createOrganization',

enableReinitialize: true

}

export class CreateOrganization extends PureComponent {

static propTypes = {

isLoading:PropTypes.bool.isRequired,

handleSubmit: PropTypes.func.isRequired, // from react-redux

submitting: PropTypes.bool.isRequired // from react-redux

}

onSubmit = data => {

console.log(data)

}

render () {

const { handleSubmit,submitting,isLoading } = this.props

return (

<Columns isCentered>

<form onSubmit={handleSubmit(this.onSubmit.bind(this))} >

<Column isSize='3/6' >

<Label>Organization Name</Label>

<Field

name="organizationName"

component={FormField}

type="text"

placeholder="Organization Name"

/>

</Column>

<Column isSize='3/6'>

<Label>Organization Full Name</Label>

<Field

name="organizationFullName"

component={FormField}

type="text"

placeholder="Organization Full Name"

/>

</Column>

<Column isSize='3/6'>

<Label>Organization Logo</Label>

<Input

name="organizationLogo"

type="file"

placeholder="Logo"

/>

</Column>

<Column isSize='3/6'>

<Label>Organization Details</Label>

<TextArea placeholder={'Enter Details'} />

</Column>

<Column >

<span className="create-button">

<Button type="submit" isLoading={submitting || isLoading} isColor='primary'>

Submit

</Button>

</span>

<Button type="button" isColor='danger'>

Cancel

</Button>

</Column>

</form>

</Columns>

)

}

}

export default reduxForm(formConfig)(CreateOrganization)

   import React, { PureComponent } from 'react'

import PropTypes from 'prop-types'

import { connect } from 'react-redux'

import Loader from 'Loader'

import organization from 'state/organization'

import CreateOrganization from '../components/createOrganization'

export class Create extends PureComponent {

static propTypes = {

error: PropTypes.object,

isLoaded: PropTypes.bool.isRequired,

create: PropTypes.func.isRequired,

}

onSubmit = data => {

this.props.create(data)

}

render () {

const { isLoaded, error } = this.props

return (

<CreateOrganization onSubmitForm={this.onSubmit} isLoading=

{isLoading} />

)

}

}

const mapStateToProps = state => ({

error: organization.selectors.getError(state),

isLoading: organization.selectors.isLoading(state)

})

const mapDispatchToProps = {

create: organization.actions.create

}

export default connect(mapStateToProps, mapDispatchToProps)(Create)

回答:

您的redux操作创建者必须是普通的,反对的,并应使用强制性的key进行调度和操作type。但是,使用像redux-

thunk您这样的自定义中间件可以axios在操作创建者内调用请求,因为没有定制,middlewares操作创建者就需要返回普通对象

您的动作创建者看起来像

export function create (values) {

return (dispatch) => {

dispatch({type: CREATE_ORGANIZATION});

axios.post('/url', values)

.then((res) =>{

dispatch({type: CREATE_ORGANIZATION_SUCCESS, payload: res});

})

.catch((error)=> {

dispatch({type: CREATE_ORGANIZATION_FAILURE, payload: error});

})

}

}

你的减速器看起来像

export default (state = initialState, action) => {

const payload = action.payload

switch (action.type) {

case CREATE:

return {

...state,

loading: true,

loaded: false

}

case CREATE_SUCCESS:

return {

...state,

data: state.data.concat(payload.data),

loading: false,

loaded: true,

error: null

}

}

case CREATE_FAILURE:

return {

...state,

loading: false,

loaded: true,

error: payload

}

default:

return state

}

}

现在,在创建商店时,您可以像

import thunk from 'redux-thunk';

import { createStore, applyMiddleware } from 'redux';

const store = createStore(

reducer,

applyMiddleware(thunk)

);

除此之外,您还需要设置redux表单

您需要使用CombineReducers和Provider来传递商店

import reducer from './reducer';

import { combineReducers } from 'redux';

import { reducer as formReducer } from 'redux-form'

export const rootReducer = combineReducers({

reducer,

form: formReducer

})

以上是 使用React,Redux和Axios处理异步请求? 的全部内容, 来源链接: utcz.com/qa/408313.html

回到顶部