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

如何在Redux Saga执行增删改后调用接口刷新组件?

解决方案:Redux-saga操作后自动刷新员工列表

要实现员工新增、编辑、删除操作完成后自动获取最新列表数据,只需在每个操作的成功流程中触发列表获取动作即可,以下是具体实现方案:

方法一:在操作成功后直接触发列表刷新

修改saga.js中的删除、编辑处理函数,在接口请求成功并发送成功动作后,添加触发获取员工列表的逻辑:

修改后的saga.js

import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
import axios from 'axios'
import { 
    GET_EMPLOYEE_LIST,
    GET_EMPLOYEE_LIST_SUCCESS,
    DELETE_EMPLOYEE,
    DELETE_EMPLOYEE_SUCCESS,
    EDIT_EMPLOYEE,
    EDIT_EMPLOYEE_SUCCESS
 } from './actions/EmployeeActions'
import ConstantList from '../../app/appConfig'
import { toast } from 'react-toastify'

const API_PATH = ConstantList.API_ENPOINT + "/employees"

export function* getEmployeeList() {
    yield takeEvery(GET_EMPLOYEE_LIST, workEmployeeList)
}

export function* deleteEmployee() {
    yield takeEvery(DELETE_EMPLOYEE, workDeleteEmployee)
}

export function* editEmployee() {
    yield takeEvery(EDIT_EMPLOYEE, workEditEmployee)
}

export function* workEmployeeList() {
    try {
        const url = API_PATH + '/search'
        const response = yield call(axios.post, url, {})

        yield put({
            type: GET_EMPLOYEE_LIST_SUCCESS,
            employeeList: response.data.data
        })

    } catch (error) {
        console.log("Request failed!")
    }
}

export function* workDeleteEmployee({id}) {
    try {
        const url = API_PATH + '/' + id
        yield call(axios.delete, url)

        toast.success("Delete Succeed!")
        
        yield put({
            type: DELETE_EMPLOYEE_SUCCESS,
            id
        })
        // 删除成功后触发最新列表获取
        yield put({ type: GET_EMPLOYEE_LIST })
    } catch (error) {
        toast.warning("Delete Failed!")
    }
}

export function* workEditEmployee({ id, employee}) {
    try {
        const url = API_PATH + '/' + id
        yield call(axios.put, url, employee)

        toast.success("Edit Succeed!")

        yield put({
            type: EDIT_EMPLOYEE_SUCCESS,
            id,
            employee
        })
        // 编辑成功后触发最新列表获取
        yield put({ type: GET_EMPLOYEE_LIST })
    } catch (error) {
        toast.warning("Edit Failed!")
    }
}

方法二:监听操作成功动作统一触发刷新(可选)

如果后续有更多操作需要刷新列表,可以单独编写一个saga,监听所有操作成功的动作,统一触发列表获取,避免重复代码:

在saga.js中新增监听saga

// 监听所有操作成功动作,统一触发列表刷新
export function* watchOperationSuccess() {
    yield takeEvery([DELETE_EMPLOYEE_SUCCESS, EDIT_EMPLOYEE_SUCCESS], workEmployeeList)
}

之后在根saga中注册这个新的saga即可。

额外修正:修复Reducer中的编辑逻辑

原EmployeeReducer.js中EDIT_EMPLOYEE_SUCCESS的处理逻辑存在错误,即使依赖列表刷新,也建议修正为正确的状态更新逻辑:

修改后的EmployeeReducer.js

import { 
    DELETE_EMPLOYEE_SUCCESS,
    EDIT_EMPLOYEE_SUCCESS,
    GET_EMPLOYEE_LIST_SUCCESS
} from "../actions/EmployeeActions"

const initialState = {
    data: []
}

const EmployeeReducer = (state = initialState, action) => {
    switch (action.type) {
        case GET_EMPLOYEE_LIST_SUCCESS: {
            return {
                ...state,
                data: action.employeeList
            }
        }
        case DELETE_EMPLOYEE_SUCCESS: {
            return {
                ...state,
                data: state.data.filter(item => item.id !== action.id),
                openConfirmationDialog: false
            }
        }
        case EDIT_EMPLOYEE_SUCCESS: {
            return {
                ...state,
                data: state.data.map(item => 
                    item.id === action.id ? { ...item, ...action.employee } : item
                )
            }
        }
        default: 
            return { ...state }
    }
}

export default EmployeeReducer

说明

  • 方法一适合操作较少的场景,代码直观;方法二更适合后续扩展更多操作的场景,便于维护。
  • 修正后的Reducer确保即使未触发列表刷新,状态也能正确更新,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:15:37