javascript - 为什么我的状态未定义,即使我默认将其设置为空数组?

标签 javascript reactjs redux

我收到“无法读取未定义的属性‘映射’”错误

{props.decks.map((deck, i) => 

我的侧边栏组件

import React from 'react';
import ReactDOM from 'react-dom';
import { connect } from 'react-redux';
import { addDeck, showAddDeck, hideAddDeck } from '../actions';

const mapStateToProps = ({decks, addingDeck}) => ({
  decks,
  addingDeck
});

const mapDispatchToProps = dispatch => ({
  addDeck: name => dispatch(addDeck(name)),
  showAddDeck: () => dispatch(showAddDeck()),
  hideAddDeck: () => dispatch(hideAddDeck())
});

class Sidebar extends React.Component {
  constructor(props) {
    super(props);
    this.createDeck = this.createDeck.bind(this);
  }
  componentDidUpdate() {
    var el = ReactDOM.findDOMNode(this.refs.add);
    if (el) el.focus();
  }
  render() {
    let props = this.props;
    return  (
      <div className='sidebar'>
        <h2> All Decks </h2>
        <button onClick={ e => this.props.showAddDeck() }>
          New Decks
        </button>
        <ul>
          {props.decks.map((deck, i) => 
            <li key={i}> {deck.name} </li>
            )}
        </ul>
        {props.addingDeck && <input ref='add' onKeyPress={this.createDeck} />}
      </div>);
  }
  createDeck(evt) {
    const ENTER = 13;
    if (evt.which !== ENTER) return;
    var name = ReactDOM.findDOMNode(this.refs.add).value;
    this.props.addDeck(name);
    this.props.hideAddDeck();
  }
};

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

我在reducers.js中默认将状态设置为空数组

所以我不明白为什么我的 props.decks 不足

是 ES6 的问题吗?

export const decks = (state, action) => {
  switch (action.type) {
    case 'ADD_DECK':
      let newDeck = { name: action.data, id: +new Date };
      return state.concat([newDeck]);
    default: 
      return state || [];
  }
};

这是我的index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import { Router, Route, browserHistory } from 'react-router';
import { syncHistoryWithStore, routerReducer, ConnectedRouter  } from 'react-router-redux';
import * as reducers from './reducers';
import './index.css';
import App from './components/App';


const store = createStore(combineReducers({reducers,
    routing: routerReducer}));
const history = syncHistoryWithStore(browserHistory, store);

function run () {
  let state = store.getState();
  ReactDOM.render(
    <Provider store={store}>
      <Router history={history}>
        <Route path='/' component={App}></Route>
      </Router>
    </Provider>, document.getElementById('root'));
}

run();
store.subscribe(run);

和App.js

import React from 'react';
import Sidebar from './Sidebar';

const App = ( props ) => {
  return (
    <div className='app'>
      <Sidebar />
      { props.children }
    </div>);
};

export default App;

和package.json

{
  "name": "flashcard-app-3",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "babel-core": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babelify": "^8.0.0",
    "fuzzysearch": "^1.0.3",
    "history": "^4.7.2",
    "live-server": "^1.2.0",
    "prop-types": "^15.6.0",
    "react": "^15.0.0",
    "react-dom": "^15.0.0",
    "react-redux": "^4.4.1",
    "react-router": "^2.0.1",
    "react-router-dom": "^4.2.2",
    "react-router-redux": "^4.0.1",
    "redux": "^3.3.1",
    "watchify": "^3.9.0",
    "react-scripts": "1.0.17"
  },
  "scripts": {
    "start": "set PORT=3001 && react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

最佳答案

问题出现在您创建商店的行中。如果您想通过 state.decks 访问该州的套牌,您应该使用

combineReducers({ routing: routerReducer, ...reducers })

这样,reducers 的属性将被添加到您传递给 combineReducers 的对象中。否则,您必须像这样访问您的状态:state.reducers.decks

如果您想了解更多相关信息,请查看 MDN .

关于javascript - 为什么我的状态未定义,即使我默认将其设置为空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47808465/

相关文章:

javascript - Angular/Node 验证用户

javascript - Redux - 状态正在更新但 React 组件没有

javascript - 如何使用 Cypress stub 模块功能?

javascript - 获取: reject promise and catch the error if status is not OK?

javascript - 如何通过node js将变量传递给powershell

javascript - 如何将全局变量传递给所有组件 - React js

javascript - 将集合与其数据库中的 ID 进行匹配

redux - 为 Redux 操作使用 Flow 联合类型

javascript - 当 x 来自提示函数时,为什么 typeof x 永远不会是 'number'?

javascript - 如何在 React Native State 中添加或减去 Moment JS 值?