我正在使用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操作,试图从数据库中删除记录,而我只是想从我的视图中删除这些记录。
有什么想法吗?
答案 0 :(得分:0)
在您的自定义操作中,您已将抓取设置为 DELETE_MANY ,这将对执行 DELETE 操作的每个ID进行循环。不知道您的实现是否可以工作,但是当前的错误与之有关。您可以尝试删除获取并查看会发生什么,但是我认为如果没有它,他将无法获取记录。如果我没记错的话,RA只会向数据添加新的ID,但是,如果在此期间发生数据更改,我认为它不会替代更改后的数据,因为您需要重新实现数据提供者来更改更新数据行为根据您的尝试。