我正在做一个简单的redux / react todo应用。我无法显示待办事项。我能够console.log
数据,但无法显示。我做错了什么?
我分隔了文件,这是我的app.js
:
import React, { Component } from 'react';
import Todos from './todos';
import TodoList from "./todo_list";
export default class App extends Component {
render() {
return (
<div>
<Todos />
<TodoList/>
</div>
);
}
}
这是容器Todos
:
import React, {Component} from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { addTodo } from '../actions/index';
class Todos extends Component {
constructor(props) {
super(props);
this.state = {text: ''};
}
addTodo(e) {
e.preventDefault();
this.props.addTodo(this.state.text);
this.setState({
text: ''
});
}
updateValue(e) {
this.setState({text: e.target.value})
}
render() {
return (
<div>
<form onSubmit={(e) => this.addTodo(e)}>
<input
placeholder="Add Todo"
value={this.state.text}
onChange={(e) => {
this.updateValue(e)
}}
/>
<button type="submit">Add Todo</button>
</form>
</div>
);
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({addTodo}, dispatch);
}
export default connect(null, mapDispatchToProps)(Todos);
以下是TodoList
:
import React, {Component} from 'react';
import {connect} from 'react-redux';
class TodoList extends Component {
render() {
return (
<ul>
{ this.props.todo.map((tod) => {
return <li key={tod.message}>{ tod.message }</li>
})}
</ul>
);
}
}
function mapStateToProps({ todo }) {
console.log({ todo });
return { todo };
}
export default connect(mapStateToProps)(TodoList);
减速机:
import { ADD_TODO } from '../actions/types';
export default function(state=[], action) {
switch(action.type) {
case ADD_TODO:
return [ action.payload.message, ...state ]
}
return state;
}
行动
import { ADD_TODO } from './types';
const uid = () => Math.random().toString(34).slice(2);
export function addTodo(message) {
const action = {
id: uid(),
message: message
};
return {
type: ADD_TODO,
payload: action
};
}
这是我从console.log({todo});
获得的这是我的redurs / index:
import { combineReducers } from 'redux';
import TodosReducer from './reducer_addTodo';
const rootReducer = combineReducers({
todo: TodosReducer
});
export default rootReducer;
答案 0 :(得分:2)
这是因为你的TodoList
和减速器之间存在脱节。 TodoList
,在映射时,期望每个待办事项都有一个message
道具,但是你的reducer在返回下一个状态时,只包含状态数组中的消息,而不是message
的对象属性:
case ADD_TODO:
return [ action.payload.message, ...state ]
相反,不要只将message
字符串放在下一个状态的数组中,放入整个对象:
case ADD_TODO:
return [ action.payload, ...state ]
现在todo
数组中的每个元素都是一个对象,并且具有message
和id
属性。另外,尝试使用key
的始终唯一表达式 - 它实际上不应该是todo消息,也不应该是您提供的id
,因为它使用的Math.random
都有可能是键是一样的。