当前位置: 首页 > article >正文

vue2结合element-ui使用tsx格式实现formily自定义组件

简洁

在公司实习,需要参与开发一个基于formily的低代码平台,实现自定义formily组件,在此记录一下。

示例源码

demo源码

实现思路

开始实现自定义组件之前最好先看一下formily官网的core、vue、element部分,如果有能力也可以阅读一下formily的源码,formily官网

项目搭建

在此不过多介绍如何搭建vue2的tsx项目,感兴趣可以看我的gitee示例

父组件中

  1. 父组件创建schema,在x-component中要调用我们自定义的组件,此处命名为"MyComponent",同时需要对其绑定数据
//部分数据代码
      data:{
        type:'object',
        title:'商品',
        'x-decorator':'FormItem',
        //此处的MyComPonent就是自定义组件的名字
        'x-component':'MyComponent',
        'x-validator':{
          required:true,
          message:'请选择商品'
        },  
        //枚举类型,因为自定义的组件中有下拉选择框
        enum: [
          {
              label: "选项1",
              value: '1'
          },
          {
              label: "选项2",
              value: '2'
          },
          {
            label: "选项3",
            value: '3'
        }
      ],
      }
    },
  1. 其实对于父组件来说,使用MyComponent就像使用@formily/element的其他组件一样,只需要在x-component中使用,并且按照相关规范进行传值即可
const { SchemaField } = createSchemaField({
  components: {
      FormItem,
      Input,
      //一定要注意在此注册自定义组件!!!
      MyComponent
  },
})
  1. 完整代码
    csdn里的markdown不支持显示tsx的代码,我就用CodeSnap进行贴图了,需要源码可以去仓库取
    在这里插入图片描述

子组件(自定义组件)中

子组件是实现的关键,如果要深入了解原理等一定要去仔细看文档和源码,我也不是太了解

  1. 子组件主要是需要做到接收父组件的数据并能够返回数据,根据数据渲染样式,本自定义组件就是简单的实现一个输入框和一个下拉选择框
  2. 注意!对于表单来说,这个自定义组件是一个formItem,这也是自定义组件的意义,可以进一步根据需要扩充
  3. 主要代码如下
const MyComponent= Vue.extend({
  name:'my-component',
  props:{
    value:{
      type: Object as () => inputSelectType,
      default:()=>({})
    },
    //下拉选择框的选项
    options:{
      type:Array as () => Array<optionType>
    }
  },
  render(){
    //贪图省事使用了组合式API里的ref,也可以使用watch进行实现数据动态变化
    var newValue=ref(this.$props.value);
    var {options}=this.$props;
    return (
      <div style={{display:'flex'}}>
        <el-input v-model={newValue.value.price}></el-input>
        <el-select v-model={newValue.value.goods} >
          {options.map((option:optionType)=>(
            <el-option label={option.label} value={option.value} key={option.value}></el-option>
          ))}
        </el-select>
      </div>
    )
  }
})
  1. 子组件中并没有schema,它只是实现自定义组件
  2. 由于子组件需要接收options进行选择框的传参,而formily的json schema中传的值的enum,因此需要做一个数据映射,使得子组件能接收到传来的enum的数据并转为options,实际上formily也是把enum映射为dataSource的
//连接到Formily表单系统
const FormItem = connect(
  MyComponent,
  //映射属性,将dataSource映射为options
  mapProps(
    { dataSource: 'options', loading: true },
    (props) => {
      return {
        ...props,
      }
    },
  )
)

以上就是一个简单的示例了,如果要问很深层次的原理我也不太懂


http://www.kler.cn/a/294436.html

相关文章:

  • 【Linux】进程池实现指南:掌控并发编程的核心
  • 服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例
  • 手动搭建 Ghost 博客
  • 金属箔电阻
  • 【测试框架篇】单元测试框架pytest(3):用例执行参数详解
  • 【LeetCode】【算法】3. 无重复字符的最长子串
  • 匹配电子邮件地址的正则表达式
  • 人生苦短我用Python Excel文件基本操作
  • 【60天备战软考高级系统架构设计师——第九天:面向对象设计原则】
  • [SUCTF 2018]annonymous1
  • 移动UI:成就勋章页面该如何设计,用例子说明。
  • 大数据决策分析平台建设方案(56页PPT)
  • SpringBoot2:请求处理原理分析-RESTFUL风格接口
  • 交换机自动化备份配置(H3C_无人值守)
  • 前端小白操作指南:如何删除项目中 pre-commit 的提交限制?
  • 【机器人工具箱Robotics Toolbox开发笔记(十五)】六自由度机器人笛卡尔空间轨迹规划仿真实例
  • 过去十年中,深度学习领域经历了许多重要的算法创新和突破。以下是一些关键的深度学习算法,按照时间顺序排列:
  • ChatGPT在医疗行业的应用前景与挑战探析
  • GraphRAG入门:基本概念、应用场景及学习方法
  • 2024国赛数学建模A题B题C题D题E题思路资料模型
  • yolov5 +gui界面+单目测距 实现对图片视频摄像头的测距
  • AI基础 L1 Introduction to Artificial Intelligence
  • Prometheus + Grafana + nVisual 实现运维监控全面可视化
  • 【区块链 + 物联网】基于电子标签的区块链溯源系统 | FISCO BCOS应用案例
  • QT Android开发之Android端usb调试模式设置与问题解决
  • 分类算法可视化方法