gpt4 book ai didi

javascript - 为什么我的待办事项不使用 Redux 呈现?

转载 作者:行者123 更新时间:2023-11-30 15:12:48 26 4
gpt4 key购买 nike

我正在做一个简单的 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);

reducer :

import { ADD_TODO } from '../actions/types';

export default function(state=[], action) {
switch(action.type) {
case ADD_TODO:
return [ action.payload.message, ...state ]
}
return state;
}

和 Action

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}); 得到的信息

enter image description here

这是我的 reducer /索引:

import { combineReducers } from 'redux';
import TodosReducer from './reducer_addTodo';

const rootReducer = combineReducers({
todo: TodosReducer
});

export default rootReducer;

最佳答案

这是因为您的 TodoList 和 reducer 之间存在断开连接。 TodoList,在映射时,期望每个 todo 都有一个 message 属性,但是你的 reducer 在返回下一个状态时,只包含状态数组中的消息,而不是一个对象消息 属性:

case ADD_TODO:
return [ action.payload.message, ...state ]

相反,不要只将 message 字符串放入下一个状态的数组中,而是放入整个对象:

case ADD_TODO:
return [ action.payload, ...state ]

现在 todo 数组中的每个元素都将是一个对象并具有 messageid 属性。此外,尝试对 key 使用始终唯一的表达式——它真的不应该是待办事项消息,也不应该是您提供的 id,因为它使用的是 Math.random 两者都有可能键相同。

关于javascript - 为什么我的待办事项不使用 Redux 呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44872537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com