自动计算输入字段

Auto Calculate Input Fields

请有人帮忙回答一下:

我有 2 个 NumberInput 控件,一个输入,另一个被禁用。我需要在第一个输入字段中输入数字,禁用字段显示此 number/100。两个 NumberInput 将具有源字段,这些字段将以简单形式保存到当前记录。

如何在 react-admin 中执行此操作

谢谢

最简单的方法是使用 Linking two inputs

节下的文档中描述的方法

本质上:您可以创建自己的输入组件,您可以在其中通过挂钩 useFormState 访问表单值。然后只需按您想要的方式分配所需的值即可,例如除以 100.

编辑

找到了一种更简洁的方法 - 使用 final-form-calculate 创建装饰器并将其传递给 <FormWithRedirect /> 组件,如下所示:

import createDecorator from 'final-form-calculate'

const calculator = createDecorator(
  // Calculations:
{
   field: 'number1', // when the value of foo changes...
   updates: {
     number2: (fooValue, allValues) => allValues["number1"] * 2
   }
})

...

<FormWithRedirect
   ...
   decorators={[calculator]}
/>

看看这个code sandbox

使用 FormDataConsumer

<FormDataConsumer>
  {({ formData }) => (
    <NumberInput defaultValue={formData.my_first_input / 100} source="second_input"/>
  )}
</FormDataConsumer>

使用 useFormState 钩子

import { useFormState } from 'react-final-form';

...

const { values: { my_first_input }} = useFormState({ subscription: { values: true } });

...

<NumberInput defaultValue={my_first_input / 100} source="second_input"/>

来源:https://marmelab.com/react-admin/Inputs.html#linking-two-inputs

动态

您需要使用 react-final-formuseForm 挂钩来使您的输入动态化:

import { useForm, useFormState } from 'react-final-form';

...

const {change} = useForm();
const { values: { my_first_input }} = useFormState({ subscription: { values: true } });


useEffect(() => {
  change('my_second_input', my_first_input / 100);
}, [change, my_first_input]);

...


<NumberInput defaultValue={my_first_input / 100} source="second_input"/>

我得到了这个问题的更简短的解决方案: 我所做的只是在 FormDataConsumer 内进行计算。现在,我可以获得计算值并更新数组中的正确记录。

谢谢

<FormDataConsumer>
  {({
    formData, // The whole form data
    scopedFormData, // The data for this item of the ArrayInput
    getSource, // A function to get the valid source inside an ArrayInput
    ...rest
  }) => {
    if (typeof scopedFormData !== 'undefined') {
      scopedFormData.total = scopedFormData.quantity * scopedFormData.unitprice;
      return (
        <NumberInput disabled defaultValue={scopedFormData.total} label="Total" source={getSource('total')} />
      )
    } else {
      return(
        <NumberInput disabled label="Total" source={getSource('total')} />
      )
    }            
  }}