javascript - 从react-admin中的自定义函数回调修改特定的redux-form值

标签 javascript reactjs redux-form react-admin

我修改了 ImageInputonDrop 函数,以便它最终会从我的自定义函数返回一个 url。但是,我想将该返回值设置为 ImageInputimage 值。

...

const uploadImg = ( acceptedFiles ) => { 
    return Promise.resolve(uploadImageToServer(file))
        .then( url => {
            // do something ...
        })
}

const ProductEdit = ({ classes, ...props }) => (
    <Edit {...props} title={<ProductTitle />}>
        <TabbedForm>
          <FormTab label="resources.categories.tabs.details" path="details">
                <ImageInput source="image" label="Related pictures" accept="image/*" options={{onDrop: uploadImg}}>
                    <ImageField source="image" src="url" title="title" />
                </ImageInput>
          </FormTab>
        </TabbedForm>

...

这在功能组件中是否可能实现?我在其他答案中看到可以调用 this.props.change(...) 来将更改分派(dispatch)到 redux 表单。但这里我的uploadImg是一个脱离react.component上下文的普通函数,因此无法访问this。

否则我必须将这个组件重写为类组件吗?

最佳答案

好吧,我发现解决方案是创建一个自定义操作并使用 redux-formconnect 方法分派(dispatch)该操作。

使用FormDataConsumer获取formData和调度方法。

+ import { FormDataConsumer, REDUX_FORM_NAME } from 'react-admin';
+ import { change } from 'redux-form';
+ import {changeImgUrl} from './actions';

...

const uploadImg = ( params, dispatch ) => {
    result = await Promise.resolve(yourUploadImgFunc(params))
             .then( res => return changeImgUrl(res) )
    dispatch(change(REDUX_FORM_NAME, 'image', result))
}

const ProductEdit = ({ classes, ...props }) => (
    <Edit {...props} title={<ProductTitle />}>
        <TabbedForm>
          <FormTab label="resources.categories.tabs.details" path="details">
             <FormDataConsumer>
               {({ formData, dispatch, ...rest }) => (
                <Fragment>
                  <ImageInput source="image" label="Related pictures" accept="image/*" options={{onDrop: (params) => uploadImg(params, dispatch)}}>
                      <ImageField source="image" src="url" title="title" />
                  </ImageInput>
               )}
                </Fragment>
             </FormDataConsumer>
          </FormTab>
        </TabbedForm>
...

然后定义一个新 Action :

// actions.js
export const CHANGE_IMG_URL = 'CHANGE_IMG_URL';

export const changeImgUrl = img_url => ({
    type: CHANGE_IMG_URL,
    url: img_url
});

摘要:
1. 从react-admin的FormDataConsumer收集redux的dispatch props。
2. 使用 redux-form 的 change 方法用您的自定义操作创建操作。

不确定这是否是最好的方法,但它确实有效。希望它可以帮助任何尝试在react-admin上进行自定义的人。

关于javascript - 从react-admin中的自定义函数回调修改特定的redux-form值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641011/

相关文章:

javascript - React.js : Create resource with redux-form, 其余 api 和 async/await

javascript - 箭头函数不应返回赋值 no-return-assign

javascript - 将键值(对象)对添加到数组中的所有对象

reactjs - Node Sass 6.0.0 版本与 ^4.0.0 不兼容 || ^5.0.0 在 React.js

javascript - Material UI 表慢

reactjs - 我正在尝试使用 React.createElement 动态创建 Mui 图标。但是,React 会将该元素小写。有办法保留案例吗?

javascript - 更新数据库对象中的特定字段 | Axios、Redux 形式

javascript - 如何将 JSON 对象从快速服务器发送到下一个 js 页面?

javascript - 将json数据放入canvas html5

javascript - 如何修复(错误 : parsererror errorThrown: SyntaxError: Unexpected token < )using java action