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

在Redux中实现编辑功能:能否不使用本地state完成?

纯Redux实现Todo条目编辑方案

完全可以通过将编辑相关状态迁移到Redux Store的方式实现纯Redux管理的条目编辑功能,不需要任何本地state。具体修改步骤如下:

步骤1:新增Redux Action定义

在你的TodoActions.js中新增编辑状态相关的action:

// 新增action类型常量
export const SET_EDITING_TODO = 'SET_EDITING_TODO'
export const CLEAR_EDITING_TODO = 'CLEAR_EDITING_TODO'

// 新增action creator
// 触发编辑:传入要编辑的todo条目
export const setEditingTodo = (todo) => ({
  type: SET_EDITING_TODO,
  payload: todo
})
// 关闭编辑态
export const clearEditingTodo = () => ({
  type: CLEAR_EDITING_TODO
})

步骤2:修改Todo Reducer逻辑

在对应的todo reducer中新增editingTodo状态字段,处理新增的action:

// 初始状态新增editingTodo字段,null代表当前无正在编辑的条目
const initialState = {
  todos: [],
  editingTodo: null
}

export default function todoReducer(state = initialState, action) {
  switch(action.type) {
    // 其他原有case逻辑保留
    case SET_EDITING_TODO:
      return {
        ...state,
        editingTodo: action.payload
      }
    case CLEAR_EDITING_TODO:
      return {
        ...state,
        editingTodo: null
      }
    // 原有editTodo的case,提交后自动清空编辑态
    case EDIT_TODO:
      return {
        ...state,
        todos: state.todos.map(todo => 
          todo.id === action.payload.id ? action.payload : todo
        ),
        editingTodo: null
      }
    default:
      return state
  }
}

步骤3:重构TodoList组件

删除所有本地state,从Redux中读取编辑状态、绑定编辑相关的dispatch方法:

import { connect } from "react-redux";
import { editTodo, setEditingTodo, clearEditingTodo } from "../actions/TodoActions"
import { Field, Form, Formik } from "formik";

const TodoList = ({ todos, editTodo, setEditingTodo, editingTodo, clearEditingTodo }) => {
    return (
        <div>
            {/* editingTodo非空时显示编辑表单 */}
            {editingTodo && (
                <div>
                    <h3>Todo edit: </h3>
                    <Formik
                        initialValues={{
                            id: editingTodo.id,
                            name: editingTodo.name,
                            date: editingTodo.date,
                            done: editingTodo.done
                        }}
                        onSubmit={(values) => editTodo(values)}
                        enableReinitialize={true}>
                        <Form>
                            <Field name="name" />
                            <Field name="date" />
                            <button type="submit">
                                Zatwierdz
                            </button>
                            <button type="button" onClick={clearEditingTodo}>取消</button>
                        </Form>
                    </Formik>
                </div>
            )}
            {todos.map(todo => (
                <div key={todo.id}>
                    {todo.name} 
                    <button onClick={() => setEditingTodo(todo)}>Edit</button>
                </div>
            ))}
        </div>
    )
}

const mapStateToProps = (state) => {
    return {
        todos: state.todos,
        editingTodo: state.editingTodo
    };
}
const mapDispatchToProps = {
    editTodo,
    setEditingTodo,
    clearEditingTodo
}

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

补充说明

修改后所有编辑相关的状态都由Redux统一管理,你可以直接通过Redux DevTools追踪编辑状态的变化,也可以在其他组件中直接读取当前正在编辑的条目信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:36:03