尝试在 <Create /> 上使用 react-admin 转换功能
Trying to use react-admin transform function on <Create />
我是 react-admin 的新手,我正在尝试构建自定义图片库输入。它应该显示一个带有图像的模态(数据已经被获取并存储在 redux 中)这样用户就可以 select 一个或多个图像(在 selection 上调度一个动作来更新 reducer 的值)和我在 <Create />
的转换函数中需要这些 selected 图像 ID,这样我就可以在调用 dataProvider 方法之前添加所需的数据。
但我有一个奇怪的问题,这可能是因为我缺乏反应知识。在下面的代码片段中,我尝试获取 useReducer
s 值,然后将其添加到表单中。
import React, { useReducer, useMemo, useEffect, useCallback } from 'react';
import { Create as Ra_create } from 'react-admin';
const ctxInitialValues = {};
const galleryCtx = React.createContext(ctxInitialValues);
const CreateWithGallery = (props) => {
const [selectedImages, dispatch] = useReducer((state, { type, payload }) => {
switch (type) {
case 'UPDATE_STATE':
return { ...payload };
case 'INIT_RECORD':
return {
...state,
[payload]: [],
};
default:
return state;
}
}, ctxInitialValues);
const updateSelection = (record, image, operation) => {
if (operation === 'add') {
let newState = {
...selectedImages,
[record]: [...selectedImages[record], image],
};
dispatch({
type: 'UPDATE_STATE',
payload: newState,
});
} else if (operation === 'remove') {
let newState = {
...selectedImages,
[record]: selectedImages[record].filter((item) => item.id !== image.id),
};
dispatch({
type: 'UPDATE_STATE',
payload: newState,
});
}
};
const transformPayload = (data) => {
let transformed = {
...data,
};
// but I get {} here
for (let record in selectedImages) {
transformed[record] = selectedImages[record].map((item) => ({
id: item.id,
}));
}
return transformed;
};
useEffect(() => {
console.log(selectedImages);
// I get fresh values here
}, [selectedImages]);
const initializeRecord = (record) => {
dispatch({
type: 'INIT_RECORD',
payload: record,
});
};
return (
<galleryCtx.Provider
value={{
selectedImages,
updateSelection,
initializeRecord,
}}
>
<Ra_create {...props} transform={transformPayload}>
{props.children}
</Ra_create>
</galleryCtx.Provider>
);
};
export { galleryCtx };
export default CreateWithGallery;
当我尝试访问转换函数中的 selectedImages 值时,我得到了 {},这是初始状态。我已经尝试使用 useCallback 和 useMemo 来确保在每次调度后更改值,但它没有任何区别。
这个问题也有类似的行为:
React Admin: how to pass state to transform
如何在转换函数中使用状态?
要解决此问题,您可以按照 react-admin docs 中的说明使用 transform prop on。但仍然不清楚,为什么我们不能在 or 上的转换函数中获取状态。
我最终在组件上设置了 transform 道具(在自定义工具栏中):
const CustomToolbar = (props: any) => {
const transform = useCallback((data: any) => {
return {
...data,
files: something_from_state,
};
}, [something_from_state]);
const handleClick = () => {
};
return <Toolbar {...props}>
<SaveButton
handleSubmitWithRedirect={handleClick} transform={transform}/>
</Toolbar>
};
我是 react-admin 的新手,我正在尝试构建自定义图片库输入。它应该显示一个带有图像的模态(数据已经被获取并存储在 redux 中)这样用户就可以 select 一个或多个图像(在 selection 上调度一个动作来更新 reducer 的值)和我在 <Create />
的转换函数中需要这些 selected 图像 ID,这样我就可以在调用 dataProvider 方法之前添加所需的数据。
但我有一个奇怪的问题,这可能是因为我缺乏反应知识。在下面的代码片段中,我尝试获取 useReducer
s 值,然后将其添加到表单中。
import React, { useReducer, useMemo, useEffect, useCallback } from 'react';
import { Create as Ra_create } from 'react-admin';
const ctxInitialValues = {};
const galleryCtx = React.createContext(ctxInitialValues);
const CreateWithGallery = (props) => {
const [selectedImages, dispatch] = useReducer((state, { type, payload }) => {
switch (type) {
case 'UPDATE_STATE':
return { ...payload };
case 'INIT_RECORD':
return {
...state,
[payload]: [],
};
default:
return state;
}
}, ctxInitialValues);
const updateSelection = (record, image, operation) => {
if (operation === 'add') {
let newState = {
...selectedImages,
[record]: [...selectedImages[record], image],
};
dispatch({
type: 'UPDATE_STATE',
payload: newState,
});
} else if (operation === 'remove') {
let newState = {
...selectedImages,
[record]: selectedImages[record].filter((item) => item.id !== image.id),
};
dispatch({
type: 'UPDATE_STATE',
payload: newState,
});
}
};
const transformPayload = (data) => {
let transformed = {
...data,
};
// but I get {} here
for (let record in selectedImages) {
transformed[record] = selectedImages[record].map((item) => ({
id: item.id,
}));
}
return transformed;
};
useEffect(() => {
console.log(selectedImages);
// I get fresh values here
}, [selectedImages]);
const initializeRecord = (record) => {
dispatch({
type: 'INIT_RECORD',
payload: record,
});
};
return (
<galleryCtx.Provider
value={{
selectedImages,
updateSelection,
initializeRecord,
}}
>
<Ra_create {...props} transform={transformPayload}>
{props.children}
</Ra_create>
</galleryCtx.Provider>
);
};
export { galleryCtx };
export default CreateWithGallery;
当我尝试访问转换函数中的 selectedImages 值时,我得到了 {},这是初始状态。我已经尝试使用 useCallback 和 useMemo 来确保在每次调度后更改值,但它没有任何区别。 这个问题也有类似的行为: React Admin: how to pass state to transform
如何在转换函数中使用状态?
要解决此问题,您可以按照 react-admin docs 中的说明使用 transform prop on。但仍然不清楚,为什么我们不能在 or 上的转换函数中获取状态。
我最终在组件上设置了 transform 道具(在自定义工具栏中):
const CustomToolbar = (props: any) => {
const transform = useCallback((data: any) => {
return {
...data,
files: something_from_state,
};
}, [something_from_state]);
const handleClick = () => {
};
return <Toolbar {...props}>
<SaveButton
handleSubmitWithRedirect={handleClick} transform={transform}/>
</Toolbar>
};