【问题标题】:React Redux Reducer: 'this.props.tasks.map is not a function' errorReact Redux Reducer:“this.props.tasks.map 不是函数”错误
【发布时间】:2016-11-04 04:19:53
【问题描述】:

我正在制作一个 React Redux 示例;但是,我遇到了一个问题并收到以下错误:

TypeError: this.props.tasks.map 不是函数 [了解更多]

我尝试了很多事情,但我似乎无法理解为什么这不起作用。我相信这是 allReducers 从 Tasks 函数映射任务的时候。我已经来回修复了这个错误,但它会抱怨它是未定义的。我会解决这个问题并回到这个问题。任何帮助,将不胜感激。我确定我犯了一个简单的错误。以下是我的以下文件

App.js

import React from 'react';
import TaskBoard from "../containers/task-board";
require('../../scss/style.scss');

const App = () => (
    <div>
        <h2>Task List</h2>
        <hr />
        <TaskBoard/>
    </div>
);

export default App;

index.js

    import {combineReducers} from 'redux';
    import {Tasks} from './reducer-tasks';
    const allReducers = combineReducers({
        tasks: Tasks
    });

    export default allReducers

task-board.js

    import React, {Component} from 'react';
    import {bindActionCreators} from 'redux';
    import {connect} from 'react-redux';
    import {deleteTaskAction} from '../actions/ActionIndex';
    import {editTaskAction} from '../actions/ActionIndex';
    class TaskBoard extends Component {
        renderList() {
            return this.props.tasks.map((task) => {
                if(task.status == "pending"){
                    return (<li key={task.id}>
                        {task.id} {task.description}
                        <button type="button">Finish</button>
                        <button type="button">Edit</button>
                        <button onClick={() => this.props.deleteTask(task)} type="button">Delete</button>
                    </li>
                );
            }
        });
    }
    render() {
        if (!this.props.tasks) {
            console.log(this.props.tasks);
            return (<div>You currently have no tasks, please first create one...</div>);
        }
        return (
            <div>
                {this.renderList()}
            </div>
        );
    }
}
    function mapStateToProps(state) {
        return {
            tasks: state.tasks
        };
    }
    function matchDispatchToProps(dispatch){
        return bindActionCreators(
        {
            deleteTask: deleteTaskAction,
            editTask: editTaskAction
        }, dispatch)
    }
    export default connect(mapStateToProps,matchDispatchToProps)(TaskBoard);

reducer-tasks.js

const initialState = {
	tasks: [
        {
            id: 1,
            description: "This is a task",
            status: "pending"
        },
        {
            id: 2,
            description: "This is another task",
            status: "pending"
        },
        {
            id: 3,
            description: "This is an easy task",
            status: "pending" 

        }
	]
}

export function Tasks (state = initialState, action) {
    switch (action.type) {
        case 'ADD_TASK':
            return Object.assign({}, state, {
            	tasks: [
            		...state.tasks,
            		{
            			description: action.text,
            			status: action.status
            		}
            	]
            })
            break;

        case 'EDIT_TASK':
            return action.payload;
            break;

        case 'DELETE_TASK':
            return Object.assign({}, state, {
            	status: action.status
            })
            break;
    }

    return state;
}

actionindex.js

    export const addTaskAction = (task) => {
        return {
            type: 'ADD_TASK',
            text: "Here is a sample description",
            status: "pending"
        }
    };
    export const deleteTaskAction = (task) => {
        return {
            type: 'DELETE_TASK',
            status: "deleted"
        }
    };
    export const editTaskAction = (task) => {
        return {
            type: 'EDIT_TASK',
            payload: task
        }
    };

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    这是因为函数'map'只能用于数组,不能用于对象。

    如果您在 task-board.js 的渲染函数中打印出 this.props.tasks,您会看到它是一个包含任务数组的 OBJECT,而不是实际的任务数组本身。

    所以要解决这个问题很容易,而不是:

        return this.props.tasks.map((task) => {
    

    这是

        return this.props.tasks.tasks.map((task) => {
    

    然后就可以了

    【讨论】:

    • 好的,谢谢,我会记住在尝试映射之前打印变量以查看它是对象还是数组。谢谢你的巧妙技巧。同样在 delete_task 我如何返回以便它将“待处理”状态更改为“已删除”?
    • 如您如何将状态中的“状态”从待处理更新为已删除?
    • 好的,我可以向您展示如何做到这一点,但由于这是一个单独的问题,我需要包含代码,您能否为它提出一个新问题?另外,如果您可以将此标记为正确答案,我将不胜感激:D
    • 好的(:新问题可以在这里找到stackoverflow.com/questions/40419180/…
    【解决方案2】:

    根据你的reducer组成,你的initialState应该是:

    const initialState = [
        {
            id: 1,
            description: "This is a task",
            status: "pending"
        },
        {
            id: 2,
            description: "This is another task",
            status: "pending"
        },
        {
            id: 3,
            description: "This is an easy task",
            status: "pending" 
    
        }
    ]
    

    【讨论】:

    • 我明白你的意思。我现在已经把它改成了这个,但我仍然得到同样的错误。 TypeError: this.props.tasks.map 不是函数
    【解决方案3】:

    如果您在获取数据之前尝试渲染,请检查服务器代码。如果是这种情况,redux/react 会抛出 .map is not a function。

    始终获取数据,使用中间件,然后尝试从服务器渲染客户端。

    我在 redux 中遇到了同样的问题,问题是我在渲染客户端后尝试获取数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2020-09-15
      相关资源
      最近更新 更多