【问题标题】:Set form values with mobx-react-form using object/props使用 object/props 使用 mobx-react-form 设置表单值
【发布时间】:2021-07-19 17:07:23
【问题描述】:

我正在使用 mobx-react-form,我需要使用从商店中的对象中提取的默认值填写表单。不幸的是,如果我尝试使用 FormModel.$("email").set(object.email);在我的组件 mobx 中抱怨我无法在动作之外修改观察到的对象并且我超过了 maxdepth。

特别是我的代码看起来像这样(为了清楚起见,删除了一些细节)

import React from 'react';
import ReactDOM from "react-dom"
import { observer } from "mobx-react-lite"
import validatorjs from 'validatorjs';
import MobxReactForm from 'mobx-react-form';

    const fields = [{
      name: 'email',
      label: 'Email',
      placeholder: 'Email',
      rules: 'required|email|string|between:5,25',
      // value: user.email,
    }, … 
    ]

const FormModel = new MobxReactForm({ fields }, { plugins, hooks }); //nothing exception here standard plugins/hooks

const UserForm = observer(({open, onClose, object}) => {  //My component…object has fields with names email…

  FormModel.$("email").set(object.email); //This works fine if I replace object.email with "foo" 

  return (<MobxInput field={FormModel.$("email")} fullWidth />);
});

export default UserForm;

是的,我已经检查过该对象是否具有适当的字段(它只是从父对象传入的一个裸对象……在这种情况下甚至不是可观察对象)。

我的第一种方法是将所有内容简单地放在 UserForm 中,然后简单地从对象中填充字段中的值,但是当我这样做时,输入在结果表单中不起作用(我怀疑 mobx 正在尝试观察在其中创建的对象观察者,这不起作用)。

问题是我需要使用相同的表单,有时我需要使用用户存储中的用户对象提供的数据,有时需要使用空白值来创建新用户,而我现在对如何执行此操作有点困惑。

【问题讨论】:

    标签: mobx mobx-react mobx-react-form


    【解决方案1】:

    首先,你不能这样做:

    const UserForm = observer(({open, onClose, object}) => {
      // This won't really work very well
      FormModel.$("email").set(object.email);
    
      return (<MobxInput field={FormModel.$("email")} fullWidth />);
    });
    

    因为每次您更改输入中的值时,您的整个 UserForm 组件也会重新呈现(因为它观察到刚刚更改的 FormModel.$("email") 值)并且当它重新呈现时,您会立即将新值从 object 更改为旧值。我不确定你为什么会得到 maxdepth 错误,但在某些情况下甚至可能会出现无限循环。在渲染内部修改类似的东西通常是一种不好的做法。你至少需要使用useEffect,或者类似的东西。

    我无法在动作之外修改观察到的对象

    发生这种情况是因为默认情况下您需要在操作中执行所有突变。不过,如果你不喜欢它,你可以配置它:

    import { configure } from "mobx"
    
    configure({
        enforceActions: "never",
    })
    

    但最好坚持下去,它可能会捕获一些不需要的行为。

    我用你的一些代码快速编写了Codesandbox example,它展示了如何制作多个表单并将默认值传递给它们:

    const UserForm = observer(({ object }) => {
      const [FormModel] = useState(() => {
        const fields = [
          {
            name: 'email',
            label: 'Email',
            placeholder: 'Email',
            rules: 'required|email|string|between:5,25',
            value: object?.email || ''
          }
        ];
    
        return new MobxReactForm({ fields }, { plugins });
      });
    
      return (
        <form onSubmit={FormModel.onSubmit}>
          <input {...FormModel.$('email').bind()} />
          <p style={{ color: 'red' }}>{FormModel.$('email').error}</p>
    
          <button type="submit">submit</button>
        </form>
      );
    });
    

    这只是众多方法中的一种,这完全取决于您最终需要什么。

    【讨论】:

    • doh...没想到...非常感谢。
    • 没问题!如果问题已解决,请将答案标记为已接受,或者随时提出其他问题
    • 对不起,我是我们的一天并在手机上回复,我想在接受之前先试一试。无论如何,我看到了你是如何做到的,并且能够弄清楚如何修复我的代码。效果很好!我曾假设由于 mobx-react-form 使用的是 mobx,所以我不需要使用状态挂钩来进行更改(例如,在 mobx 示例中用于观察本地状态),但我显然很困惑。非常感谢(特别是添加代码框)!
    猜你喜欢
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 2019-05-10
    • 2017-11-04
    • 2020-12-26
    • 2023-03-11
    • 2019-01-10
    • 2023-03-29
    相关资源
    最近更新 更多