You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redux Toolkit添加任务报错:Objects are not valid as a React child

Redux添加任务报错"Objects are not valid as a React child"排查

问题描述

尝试从Tasks组件调用addTask方法向Redux TaskSlice添加任务时,出现报错:Objects are not valid as a React child。以下是相关代码及错误栈信息:

Tasks组件代码

import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { addTask } from '../redux/TaskSlice';

const Tasks = () => {
  const {todos} = useSelector(state => state.task);
  const Dispatch =useDispatch();

  const handdleAddTask = (task,time,e)=> {
    e.preventDefault();
    Dispatch(addTask({task,time}));
  }

  return (
    <React.Fragment >
      <form className='form'>
        <button onClick={()=>handdleAddTask('hello','hello')}>Add Task</button>
      </form>
      {todos.map((value,index)=>(
        <div key={index} className='form'>
          <h2>{value.Task}</h2>
          <h3>{value.Date_Time}</h3>
        </div>
      ))}
    </React.Fragment>
  )
}

TaskSlice代码

import { createSlice } from "@reduxjs/toolkit";

export const TaskSlice=createSlice({
    name:'task',
    initialState:{
        todos:[{
            Task:'Dentist appoitment',
            Date_Time:'Thursday at 3 p.m. ',
             },
             {
                Task:'Walk the dog',
                Date_Time:'Monady at 9 a.m',
                 },
        ],
    },
    reducers:{
      addTask : (state,action) => {
        state.todos=[...state.todos , action.todos];
        },
    }
});
export const {addTask}=TaskSlice.actions
export default TaskSlice.reducer

错误栈信息

The above error occurred in the <form> component:
    at form
    at Tasks (http://localhost:3000/main.77d176baa9988f89cb4e.hot-update.js:35:63)
    at div
    at App (http://localhost:3000/static/js/bundle.js:29:1)
    at Provider (http://localhost:3000/static/js/bundle.js:40147:5)

react-dom.development.js:14887 Uncaught Error: Objects are not valid as a React child (found: [object RegExp]). If you meant to render a collection of children, use an array instead.
    at throwOnInvalidObjectType (react-dom.development.js:14887:1)
    at createChild (react-dom.development.js:15139:1)
    at reconcileChildrenArray (react-dom.development.js:15404:1)
    at reconcileChildFibers (react-dom.development.js:15821:1)
    at reconcileChildren (react-dom.development.js:19167:1)
    at updateHostComponent (react-dom.development.js:19924:1)
    at beginWork (react-dom.development.js:21618:1)
    at beginWork$1 (react-dom.development.js:27426:1)
    at performUnitOfWork (react-dom.development.js:26557:1)
    at workLoopSync (react-dom.development.js:26466:1)

问题排查与修复

1. Reducer中错误访问action参数

在TaskSlice的addTask reducer里,错误使用action.todos获取传入数据,但实际通过dispatch(addTask({task,time}))传入的内容存储在action.payload中。同时,传入的字段名(task、time)与现有todos数组的字段名(Task、Date_Time)不匹配,导致新增的任务对象结构错误,渲染时触发React子元素无效的报错。

修正后的TaskSlice reducer:

addTask : (state,action) => {
  // 匹配现有todos的字段结构,从action.payload中获取数据
  state.todos = [...state.todos, {
    Task: action.payload.task,
    Date_Time: action.payload.time
  }];
}

2. 事件参数传递错误

Tasks组件中,button的onClick调用handdleAddTask时未传递事件对象e,导致handdleAddTask中调用e.preventDefault()会抛出Cannot read properties of undefined错误。

修正后的button onClick代码:

<button onClick={(e)=>handdleAddTask('hello','hello',e)}>Add Task</button>

3. 规范变量命名(可选)

组件中Dispatch变量名建议改为小写dispatch,符合React-Redux惯用命名规范:

const dispatch = useDispatch();

修复说明

修复后,新增任务对象结构与现有todos保持一致,React可正常渲染Task和Date_Time字段;同时事件参数传递正确,避免了额外报错。

内容的提问来源于stack exchange,提问作者user18447720

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:45:47