react-admin:在没有http请求的情况下从商店更改列表

时间:2019-05-17 16:52:53

标签: reactjs redux react-redux react-admin admin-on-rest

我正在使用react-admin,我需要直接从一种资源(例如我的orders资源)控制商店。

每次我运行GET_LIST时,它都会将新记录从存储区追加到列表中,但是,我想从服务器获取新列表并丢弃旧记录。我在这里检索记录的地方:

    dataProvider(GET_LIST, 'orders', {
        filter: { updatedAt: filterDate }, // Get date from Filter.
        sort: { field: 'updatedAt', order: 'DESC' },
        pagination: { page: 1, perPage: 999 },
    }).then(response => response.data)

因此,我决定直接操作商店,经过一番挖掘后,我从源头看到了这个answer和代码:

const dataReducer: Reducer<RecordSetWithDate> = (
    previousState = initialState,
    { payload, meta }
) => {
    if (meta && meta.optimistic) {
        if (meta.fetch === UPDATE) {
            const updatedRecord = {
                ...previousState[payload.id],
                ...payload.data,
            };
            return addRecords([updatedRecord], previousState);
        }
        if (meta.fetch === UPDATE_MANY) {
            const updatedRecords = payload.ids.map(id => ({
                ...previousState[id],
                ...payload.data,
            }));
            return addRecords(updatedRecords, previousState);
        }
        if (meta.fetch === DELETE) {
            return removeRecords([payload.id], previousState);
        }
        if (meta.fetch === DELETE_MANY) {
            return removeRecords(payload.ids, previousState);
        }
    }
    if (!meta || !meta.fetchResponse || meta.fetchStatus !== FETCH_END) {
        return previousState;
    }

    switch (meta.fetchResponse) {
        case GET_LIST:
        case GET_MANY:
        case GET_MANY_REFERENCE:
            return addRecords(payload.data, previousState);
        case GET_ONE:
        case UPDATE:
        case CREATE:
            return addRecords([payload.data], previousState);
        default:
            return previousState;
    }
};

因此,基于此,我创建了一个自定义操作,以从列表中删除旧的ID,并添加从数据源中检索到的新ID:

   import {GET_LIST, DELETE_MANY, FETCH_END } from 'react-admin';
    export const UPDATE_ORDER_ADMIN = 'UPDATE_ORDER_ADMIN';
    export const update_orders_admin = (data, oldIDS) => ({
        type: UPDATE_ORDER_ADMIN,
        payload: { data, ids: oldIDS },
        meta: {
            resource: 'orders',
            optimistic: true,
            fetch: DELETE_MANY,
            fetchResponse: GET_LIST,
            fetchStatus: FETCH_END,
        },
    });

从后端检索数据后,我正在使用此自定义操作:

   dataProvider(GET_LIST, 'orders', {
        filter: { updatedAt: filterDate }, // Get date from Filter.
        sort: { field: 'updatedAt', order: 'DESC' },
        pagination: { page: 1, perPage: 999 },
    }).then(response => response.data)
        .then(data => {
            const ids = orders ? Object.keys(orders) : [];
            update_orders_admin(data, ids);
            this.setState({ isLoading: false })
            return null;
        });

但是,系统正在从后端调用DELETE操作,试图从数据库中删除记录,而我只是想从我的视图中删除这些记录。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在您的自定义操作中,您已将抓取设置为 DELETE_MANY ,这将对执行 DELETE 操作的每个ID进行循环。不知道您的实现是否可以工作,但是当前的错误与之有关。您可以尝试删除获取并查看会发生什么,但是我认为如果没有它,他将无法获取记录。如果我没记错的话,RA只会向数据添加新的ID,但是,如果在此期间发生数据更改,我认为它不会替代更改后的数据,因为您需要重新实现数据提供者来更改更新数据行为根据您的尝试。