繁体   English   中英

为什么Redux没有将我的动作发送到减速器?

[英]Why is Redux not dispatching my action to the reducer?

在我的应用程序React Redux应用程序中,每当用户从下拉列表中选择新的居住状态(例如阿拉巴马州)时,我都会尝试更新状态。 然而,似乎没有任何事情发生。 在我的Redux开发工具中,当我在下拉菜单中更改项目时,Redux状态似乎没有变化。 这是我的代码:

actionTypes.js

export const UPDATE_STATE_OF_RESIDENCE = 'UPDATE_STATE_OF_RESIDENCE';

accountDetailsActions.js

import * as types from '../constants/actionTypes';

export function updateStateOfResidence(stateOfResidence) {
  return {type: types.UPDATE_STATE_OF_RESIDENCE, stateOfResidence};
}

AccountDetailsAccordionContainer.js

import React, {PropTypes} from 'react';
import {connect} from 'react-redux';
import {bindActionCreators} from 'redux';
import * as actions from '../actions/accountDetailsActions';
import AccountDetailsAccordion from '../components/AccountDetailsAccordion';

export const AccountDetailsAccordionContainer = (props) => {
  return (
    <AccountDetailsAccordion
      updateStateOfResidence={actions.updateStateOfResidence}
    />
  );
};

AccountDetailsAccordionContainer.propTypes = {
  actions: PropTypes.object.isRequired,
};

function mapStateToProps(state) {
  return {
    accountDetails: state.accountDetails
  };
}

function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators(actions, dispatch)
  };
}

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(AccountDetailsAccordionContainer);

AccountDetailsAccordion.js

import React from 'react';
import GeneralSelect from './common/GeneralSelect';
import States from '../data/State';
import AccountTypes from '../data/AccountType';

// Since this component is simple and static, there's no parent container for it.
const AccountDetailsAccordion = (props) => {
  return (
    <div>
      <h3 id="accountDetailsPanel">SELECT STATE AND ACCOUNT TYPE</h3>
      <div id="accountDetailsContainer" className="inner-content" style={{paddingTop: 10}}>
        <div>
            <div id="accountOwnerSignerInfo" style={{float:"left", paddingRight:15}}>
            </div>
            <div id="accountAttributes" style={{float:"left"}}>
                <div id="stateSelectionContainer" style={{paddingLeft:5+"em"}}>
                    <div className="input-label">Client's State of Residency: (required)</div>
                    <GeneralSelect id="stateSelect" classString="account-details-field" items={States} defaultString="Select a State" onChange={props.updateStateOfResidence} />
                </div>            
            </div>
        </div>
      </div>
    </div>
  );
};

AccountDetailsAccordion.propTypes = {
  updateStateOfResidence: React.PropTypes.func.isRequired
};

export default AccountDetailsAccordion;

GeneralSelect.js

import React from 'react';

const GeneralSelect = (props) => {  
  const handleChange = (event) => {
    props.onChange(event.target.value);
  };

  return (
    <select id={props.id} className = {props.classString} style={props.styleObject} onChange={handleChange}>
        <option value="nothingSelected" defaultValue>{props.defaultString}</option>
        {
            props.items.map((item) => {
                //if the item has an enabled property, let's use it.  otherwise, render the item no matter what
                return (
                    <option key={item.id} value={item.id}>{item.name}</option>
                );
            })
        }
    </select>
  );
};

GeneralSelect.propTypes = {
    id: React.PropTypes.oneOfType([
        React.PropTypes.string,
        React.PropTypes.number
    ]),
    classString: React.PropTypes.string,
    styleObject: React.PropTypes.object,
    defaultString: React.PropTypes.string,
    items: React.PropTypes.oneOfType([
        React.PropTypes.array,
        React.PropTypes.object
    ]).isRequired,
    onChange: React.PropTypes.func
};

export default GeneralSelect;

accountDetailsReducer.js

import {UPDATE_STATE_OF_RESIDENCE} from '../constants/actionTypes';
import objectAssign from 'object-assign';
import initialState from './initialState';

export default function accountDetailsReducer(state = initialState, action) {
  let newState;
  console.log(action.type);
  switch (action.type) {
    case UPDATE_STATE_OF_RESIDENCE:
      console.log(action);
      return objectAssign({}, state, {stateOfResidence: action.stateOfResidence});

    default:
      console.log('default');
      return state;
  }
}

index.js - 我的root reducer:

import { combineReducers } from 'redux';
import accountDetails from './accountDetailsReducer';

const rootReducer = combineReducers({
    accountDetails
});

export default rootReducer;

initialState.js:

export default {
  accountDetails: {
    stateOfResidence: '',
    accountType: '',
    accountNumber: ''
  }
};

最后,这是我的状态在Redux开发工具中的样子:

在此输入图像描述

我究竟做错了什么?

你有一个错字。

updateStateOfResidence={props.actions.updateStateOfResidence}

代替

updateStateOfResidence={actions.updateStateOfResidence}

它无声地失败的原因是因为你正在使用不受调度程序限制的vanilla actions ,而不是使用props connect()提供的有限操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM