功能使用说明

下拉框select和单选框radio新增字段关联属性,何为关联属性呢?
如:当下拉框的内容为1时,让姓名输入框隐藏,让性别输入框展示。
大家应该明白了吧,此字段是根据当前选中的值来控制其他字段是否展示和隐藏。
注意:如果下拉框有三个选项【1、2、3】,当=1时设置了姓名输入隐藏,则=2和=3时需要设置姓名输入框显示。
image.png

拖拽表单-新增关联属性

1、formItemProperties新增关联属性

控制只有类型=select和radio的时候进行展示。

  1. <a-form-item
  2. v-if="selectItem.type === 'select' || selectItem.type === 'radio'"
  3. label="关联属性"
  4. >
  5. <KChangeOption
  6. v-model="selectItem.linkFieldSet"
  7. type="linkFieldSet"
  8. :mdata="options.options"
  9. />
  10. </a-form-item>

image.png

2、KChangeOption新增关联属性内容

页面属性:

  1. <a-row v-if="type === 'linkFieldSet'" :gutter="8">
  2. <span v-for="(val, index) in value" :key="index">
  3. <div class="option-change-box">
  4. <a-col :span="20">
  5. <a-select
  6. :options="mdata"
  7. v-model="val.linkField"
  8. placeholder="选择关联属性"
  9. /></a-col>
  10. <a-col :span="4"
  11. ><div @click="handleDelete(index)" class="option-delete-box">
  12. <a-icon type="delete" /></div
  13. ></a-col>
  14. <a-col :span="24"
  15. ><a-input
  16. v-model="val.showLinkField"
  17. placeholder="显示(数据字段,逗号分割)"
  18. ></a-input
  19. ></a-col>
  20. <a-col :span="24"
  21. ><a-input
  22. v-model="val.hideLinkField"
  23. placeholder="隐藏(数据字段,逗号分割)"
  24. ></a-input>
  25. </a-col>
  26. </div>
  27. <a-divider style="border-color: #13c2c2; margin: 4px 0" dashed />
  28. </span>
  29. <a-col :span="24"><a @click="handleAddLinkField">增加</a></a-col>
  30. </a-row>

新增方法:

  1. handleAddLinkField() {
  2. let addData = [];
  3. if (this.value == undefined) {
  4. addData = [
  5. {
  6. linkField: "",
  7. showLinkField: "",
  8. hideLinkField: "",
  9. },
  10. ];
  11. } else {
  12. addData = [
  13. ...this.value,
  14. {
  15. linkField: "",
  16. showLinkField: "",
  17. hideLinkField: "",
  18. },
  19. ];
  20. }
  21. this.value = addData;
  22. console.log(addData);
  23. this.$emit("input", addData);
  24. },

3、this.$emit(‘input’,val)

子组件在传值的时候,选用input,如this.$emit(‘input’,val),在父组件直接用v-model绑定,就可以获取到了
而子组件也可以通过$emit(‘input’,false),去改变父组件中v-model 和 子组件中 value 的值 。
实战案例:
1、父组件

  1. <parent title="用户名" v-model="username"></parent>
  1. 2、子组件
data () {
        return {
            val:""
        }
    },
    methods:{
        changeData:function(){
            console.log(111);
            this.$emit('input',this.val);
        }
    }

其中,子组件this.$emit(‘input’,this.val); v-model 绑定的是 input 事件
vue 再父子组件传值时,除了传统的父组件 :属性去传值外,还可以使用 父组件v-model传值,子组件props[‘value’]接收

拖拽表单-控制关联字段

1、源码解析及改造

通过源码解析,我们发现当点击字段属性都会响应一个方法:handleChange
代码跟踪:1、k-form-build -> 2、KFormBuild-index -> 3、KFormBuild-buildBlocks -> 4、KFormItem-index
我们发现-handleChange中只有value和key两个参数,两个参数无法获取当前组件的其他属性,此处我们对handleChange进行改造,增加第三个参数 record(当前组件的详细信息)
image.png

2、实现关联控制

通过上面的代码,我们通过一层层的响应,最终在使用k-form-build的组件中通过handleChange获取相关参数。

    <k-form-build
      ref="kfb"
      :value="jsonData"
      :dynamicData="dynamicData"
      @change="handleChange"
    />


handleChange(value, key, record) {
      if (record.linkFieldSet != undefined) {
        record.linkFieldSet.forEach((item) => {
          if (item.linkField == value) {
            let hideLinkField = item.hideLinkField;
            let showLinkField = item.showLinkField;
            // console.log('***---')
            // console.log(hideLinkField)
            // console.log(showLinkField) 
            if (hideLinkField != undefined) {
              this.$refs.kfb.hide(hideLinkField.split(","));
            }
            if (showLinkField != undefined) {
              this.$refs.kfb.enable(showLinkField.split(","));
            }
          }
        });
      }
    },