Я делаю асинхронный вызов в своем создателе действия и вызываю свой редуктор с результатом, но по какой-то причине я не мог понять, что редуктор не называется.Реакция: создатель действия, не вызывающий редуктор
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)
Спасибо для подробного объяснения того, как работает поток сокращений, я смог получить редуктор, захватив действие от создателя действия, и используя регистратор, я смог проверить, что есть изменение состояния. Но в методе рендеринга App.js формы array/object по-прежнему кажутся пустыми. Я делаю что-то неправильно в mapstatetoprops. –
yes - mapStateToProps всегда будет возвращать пустой массив. Вы используете назначение destructuring, поэтому const {forms: forms} = {forms: []}; всегда будут form = []. Если вы используете соединение, вам нужно указать, какую часть глобального состояния вы хотите вводить в компонент. Подробнее об использовании можно прочитать здесь: http://rackt.org/redux/docs/basics/UsageWithReact.html –
Yup. Я получил, что я не отображал формы в состояние и, следовательно, не смог получить изменения. Ссылка помогла мне отобразить мое состояние в формах и отобразить данные в моем методе рендеринга. –