用form-generator添加自定义Vue

6 篇文章 0 订阅
3 篇文章 5 订阅

一、新建myTree.vue

<template>
  <el-card class="box-card">
    <el-tree :data="datas" @check="getCheckedKeys" show-checkbox default-expand-all node-key="id" ref="tree"
      highlight-current :props="defaultProps">
    </el-tree>
  </el-card>
</template>
<div class="buttons">
  <el-button @click="getCheckedNodes">通过 node 获取</el-button>
  <el-button @click="getCheckedKeys">通过 key 获取</el-button>
  <el-button @click="setCheckedNodes">通过 node 设置</el-button>
  <el-button @click="setCheckedKeys">通过 key 设置</el-button>
  <el-button @click="resetChecked">清空</el-button>
</div>

<script>
  export default {
    data() {
      return {
        //示例数据
        datas: [{
          id: 1,
          label: '一级 1',
          children: [{
            id: 4,
            label: '二级 1-1',
            children: [{
              id: 9,
              label: '三级 1-1-1'
            }, {
              id: 10,
              label: '三级 1-1-2'
            }]
          }]
        }, {
          id: 2,
          label: '一级 2',
          children: [{
            id: 5,
            label: '二级 2-1'
          }, {
            id: 6,
            label: '二级 2-2'
          }]
        }, {
          id: 3,
          label: '一级 3',
          children: [{
            id: 7,
            label: '二级 3-1'
          }, {
            id: 8,
            label: '二级 3-2'
          }]
        }],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    },
    props: ['data_conf', 'value'],//data_conf为树结点数据,value为选择值
    created() {
      // console.log(JSON.stringify(this.data_conf))
      console.log('1. value = ' + JSON.stringify(this.value))
      this.datas = this.data_conf
    },
    mounted() {
      this.setCheckedKeys()
    },
    watch: {
      value(val) {
        console.log("in mytree 收到初始化值:"+val)  // 在查看表单数据时,会调用本方法
        this.setCheckedKeys()
      },
      data_conf(val) {
        //绘制表单时,添加为接口地址后,form-generator会向该接口请求数据,请求成功后,将返回的数据,
        //赋值给config.js中定义的dataConsumer: 'data_conf',即本组件中的
        console.log("in mytree 收到data_conf值:"+val)
        this.datas = val;
      }
    },
    methods: {
      getCheckedNodes() {
        console.log(this.$refs.tree.getCheckedNodes());
      },
      getCheckedKeys() {
        console.log(this.$refs.tree.getCheckedKeys());
        //向父级组件传值,固定写法
        this.$emit("input", this.$refs.tree.getCheckedKeys())
      },
      setCheckedNodes() {
        this.$refs.tree.setCheckedNodes([{
          id: 5,
          label: '二级 2-1'
        }, {
          id: 9,
          label: '三级 1-1-1'
        }]);
      },
      setCheckedKeys() {
        if (this.value && this.$refs.tree) {
          this.$refs.tree.setCheckedKeys(this.value);
        }
      },
      resetChecked() {
        this.$refs.tree.setCheckedKeys(this.value);
      }
    },

  };
</script>

二、在项目的main.js中引入

import myTree from  '@/components/form/myTree';
Vue.component('myTree', myTree);

三、在generator/config.js中声明,即添加绘图器左侧的按钮,效果如图

添加左侧按钮

具体代码

// 输入型组件 【左面板】
export const inputComponents = [  //... 
  /** myTree */
  {
    // 组件的自定义配置
    //__config__中定义的属性,都可以在自定义组件中访问
    __config__: {
      label: 'my树',
      labelWidth: null,
      showLabel: true,
      changeTag: true,
      tag: 'myTree',   //自定义组件的名称,myTree.vue, 要一致
      tagIcon: 'input',
      defaultValue: [''],
      required: true,
      layout: 'colFormItem',
      span: 24,
      document: 'https://element.eleme.cn/#/zh-CN/component/input',
      // 正则校验规则
      //regList: [],
      url: '',
      dataType: 'dynamic',
      method: 'get',
      dataPath: 'data',           // 访问url返回结果中的数据键名
      dataConsumer: 'data_conf',  //myTree组件中负责接收初始化值的属性,即tree各节点的值
    },
    // 组件的插槽属性
    __slot__: {
      prepend: '',
      append: ''
    },
    // 其余的为可直接写在组件标签上的属性
    //placeholder: '请输入',
    style: {width: '100%'},
    clearable: true,
    'prefix-icon': '',
    'suffix-icon': '',
    maxlength: null,
    'show-word-limit': false,
    readonly: false,
    disabled: false,
},
]

四、在RightPanel.vue中配置,即组件需要配置哪些属性。

右侧属性面板
这里主要配置接口地址,配置地址后,如果正确,会将树进行初始化。
配置成功后效果图
此时,控制台会输出如下:
在这里插入图片描述
关键代码:在相关位置上,添加本标签的名称 ‘myTree’,属性面板即可显示

<template v-if="['el-cascader', 'el-table', 'el-tree', 'myTree'].includes(activeData.__config__.tag)">
            <el-divider>选项</el-divider>
            <el-form-item v-if="activeData.__config__.dataType" label="数据类型">
              <el-radio-group v-model="activeData.__config__.dataType" size="small">
                <el-radio-button label="dynamic">
                  动态数据
                </el-radio-button>
                <el-radio-button label="static">
                  静态数据
                </el-radio-button>
              </el-radio-group>
            </el-form-item>
            ...
</template>          

五、关键说明

自定义组件的关键在于三点:
(1)子组件本身的初始化,在config.js中定义组件后,其中的__config__中的dataConsumer: 'data_conf’值(也可以自己定义)负责接收相关数据,与myTree.vue中的props: [‘data_conf’, ‘value’]要保持一致。
(2)子组件向父组件传值,即生成表单后对应变量赋值时,固定调用 this.$emit(“input”, 值),表单才能取到值。
(3)当父组件向子组件传值,即表单值恢复显示时,会将值交给value,需要在watch中定义接收方法,即

 watch: {
      value(val) {
        console.log("in mytree 收到初始化值:"+val)  // 在查看表单数据时,会调用本方法
        this.setCheckedKeys()        
      },
      data_conf(val) {
        //绘制表单时,添加为接口地址后,form-generator会向该接口请求数据,请求成功后,将返回的数据,
        //赋值给config.js中定义的dataConsumer: 'data_conf',即本组件中的
        console.log("in mytree 收到data_conf值:"+val)
        this.datas = val;        
      }
    },

六、使用本方法,可以构建复杂的子组件了。

后记:本方法可能比较笨拙,我抛砖引玉,欢迎大家批评批评。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
form-generator 是一个开源的表单生成器,可以帮助我们快速构建各种表单页面。在 form-generator 中,我们可以自定义点击事件,以实现自己的业务逻辑。 首先,我们需要在 form-generator 中找到要自定义点击事件的组件。可以通过查看组件的文档或者源代码来确定。 通过查看文档或者源代码,我们可以找到该组件的 props 属性,其中包含了 onClick 事件。我们可以为该事件自定义一个处理函数。 接下来,我们可以在我们的代码中引入该组件,并使用 v-bind 将我们的处理函数传递给 onClick 事件。例如: ```html <template> <div> <form-generator :props="formProps" @onClick="handleClick" ></form-generator> </div> </template> <script> import FormGenerator from 'form-generator' export default { components: { FormGenerator }, methods: { handleClick(formData) { // 处理点击事件的逻辑 // 可以根据 formData 中的数据进行相应的处理 } } } </script> ``` 在上面的代码中,我们定义了一个名为 handleClick 的处理函数,它接收一个参数 formData,该参数包含了用户在表单中填写的数据。在该处理函数中,我们可以根据 formData 中的数据进行相应的业务逻辑处理。 最后,我们将 handleClick 函数传递给 form-generator 的 onClick 事件。当用户点击 form-generator 中的某个组件时,该处理函数将会被触发,从而执行我们定义的业务逻辑。 通过上述步骤,我们就可以在 form-generator自定义点击事件,并根据用户的操作实现自己的业务逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值