基于vue+element的动态表单的设计与实现(3)

基于vue+element的动态表单的设计与实现(3),第1张

动态表单的设计与实现
备注:细节可能有误,主要提供思路

接着上一篇,这篇主要讲解表单的三种模式。新建模式无需多说了,我们看看更新和详情模式。

更新模式无非是对表单进行赋值回显;详情模式则是将表单移除,仅展示具体的内容信息;
为了避免如下拉组件需要通过value去找对应的label,建议在新建/更新时,将每个单元的value,label一并保存下来。

那么这样看来,更新模式也好、详情模式也罢,都是为表单注入数据。那么如何注入呢?
回到form-format.js

function format() {
  const $listen = {
    $publish: {},       // 发布者
    $subscribe: {},     // 订阅者
    // 新增$actionValue
    $actionValue: {},   // 动态赋值
    $actionPublish: {}, // 动态响应的发布
  };
}

修改FormItem.vue

mounted() {
  this.init();
  this.handleSubscribe();
  // 新增initActionValue
  this.initActionValue();
  this.initWatchValue();
},
methods: {
  initActionValue() {
    const { $index, $listen, component } = this.item;
    const [, groupNo, fieldId] = $index;
    const currentFieldIndex = $index.join(".");
    const actionCallback = (newValue, newLabel) => {
      this.inpValue = newValue;
      if (newLabel === undefined) {
        // 不存在的话,通过value取找对应的label
        // initChange调用各个组件的change事件,在里面去找label,并写入到formData中
        this.initChange(component, newValue);
      } else {
        // 存在就直接写入
        this.formData[groupNo][fieldId + "--label"] = newLabel;
      }
    };
    if (!$listen.$actionValue[currentFieldIndex]) {
      $listen.$actionValue[currentFieldIndex] = [];
    }
    $listen.$actionValue[currentFieldIndex].push(actionCallback);
  },
}

这边注册好了之后,在为表单组件的入口Index.vue新增一个回显的函数

/**
* 设置表单值
 */
setFieldsValue(data) {
  const { $actionValue } = this.$listen;
  this.tplList.forEach((tpl) => {
    const { groupNo, fields } = tpl;
    const groupData = data[groupNo];
    Object.keys(groupData)
      .filter((v) => v.indexOf("--label") == -1)
      .forEach((field) => {
        const key = `formData.${groupNo}.${field}`;
        $actionValue[key].forEach((f) =>
          f(groupData[field], groupData[field + "--label"])
        );
      });
  });
},

业务代码层,通过ref调用动态表单实例,调用setFieldsValue方法注入数据
如:

this.$refs["dynamic-form"].setFieldsValue({
  basic: { name: "xxx", "name--label": "xxx111" },
 });

其他细节就不写了,这边主要提供思路。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1320521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-11
下一篇 2022-06-11

发表评论

登录后才能评论

评论列表(0条)

保存