验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

vue如何封装一个高质量的表单通用组件

阅读:1061 来源:乙速云 作者:代码code

vue如何封装一个高质量的表单通用组件

      基于Element-plus实现二次封装表单组件

      • 特性复用:必须继承原有组件的所有特性。

      • 命名规范:二次组件名必须见名知意,我们一般都是起一个公用名+原有组件名,比如lib-form。

      • 接口简单:自定义暴露出来的接口越简单越好。

      • 容易拓展:留有自定义插槽,让用户可以自己选择。

      • 功能完善:具备更完善的功能如:表单验证、动态删减表单,集成第三方的插件(富文本)...

      • 场景通用:具备多个场景使用,比如弹框嵌套表单、页面嵌套表单。

      封装一个高质量的通用组件,上面是真的只是基操,话不多说,直接上实践手把手教你封装组件。

      步骤1

      继承原有组件的所有特性(这也是封装的核心)。先明确三个大方向:

      表单固定属性,继承Form表单的所有属性、方法。

       // 定义el-form的ref继承原有组件的form属性
       export interface FormInstance {
        registerLabelWidth(width: number, oldWidth: number): void,
        deregisterLabelWidth(width: number): void,
        autoLabelWidth: string | undefined,
        emit: (evt: string, ...args: any[]) => void,
        labelSuffix: string,
        inline?: boolean,
        model?: Record,
        size?: string,
        showMessage?: boolean,
        labelPosition?: string,
        labelWidth?: string,
        rules?: Record,
        statusIcon?: boolean,
        hideRequiredAsterisk?: boolean,
        disabled?: boolean,
        validate: (callback?: Callback) => Promise,
        resetFields: () => void,
        clearValidate: (props?: string | string[]) => void,
        validateField: (props: string | string[], cb: ValidateFieldCallback) => void,
      }

      表单项固定属性,继承表单项的所有属性、方法。

      // 表单每一项的配置选项
      export interface FormOptions {
        // 表单项显示的元素
        type: '',// 定义表单项类型
        value?: any, // 表单项的值
        label?: string,// 表单项label
        prop?: string,// 表单项的标识
        rules?: RuleItem[],// 表单项的验证规则
        placeholder?: string,// 表单项的占位符
        attrs?: {  // 按需定义不同表单类型属性
          ...
        },
        children?: FormOptions[],// 表单项的子元素,可能存在嵌套表单组件,如select
        ....// 适当扩展我们需要的属性,比如上传组件属性,行布局表单属性
      }

      由于Element-plus组件都是以el-为前缀,所以type取值只需要取el-后面部分作为值就行,比如el-input取 'input' 为值。

      vue如何封装一个高质量的表单通用组件

      表单验证效果,继承组件原有的所有验证属性。由于Element-plus的验证都是使用 async-validator 这个插件的验证方法,直接复用插件源码路径async-validator/src/interface.ts文件下的所有代码:

      // 核心代码:封装验证方式时的属性
      export interface RuleItem {
        type?: RuleType; // 验证种类
        required?: boolean;// 是否必填
        pattern?: RegExp | string;// 验证方式匹配
        min?: number; // 表单项最小值
        max?: number; // 表单项最大值
        len?: number; // 表单项字符长度
        trigger?: string | string[];// 验证触发方式
        ....
      }

      步骤2

      实现一个完善的通用组件封装,通过对标签封装、接口 暴露、开发者传参等。明确表单类型,根据不同类型表单复用多种场景,不仅开发者用户拓展,而且,让开发者用最少代码就可以复用:

      
        
          ... 
        

      普通表单项封装,比如日期、输入等组件。

      
          
            
            
          
      

      嵌套表单项封装,比如下拉框,除了select组件还嵌套option组件。

      
          
            
              
              
            
          
      
      富文本表单项封装

      本文使用的是wangEditor。

    import E from 'wangeditor';
    // 遍历传入的prop的options对象,初始化富文本
    if (item.type === 'editor') {
    // 初始化富文本
    nextTick(() => {
      if (document.getElementById('editor')) {
        const editor = new E('#editor');
        editor.config.placeholder = item.placeholder!;
        editor.create();
        // 初始化富文本的内容
        editor.txt.html(item.value);
        editor.config.onchange = (newHtml: string) => {
          model.value[item.prop!] = newHtml;
        };
        edit.value = editor;
      }
    });
    }
    上传表单项封装

    向开发者暴露上传的核心方法:预览、删除、上传成功等,同时允许开发者自定义上传信息以及渲染区域等。

    
      
      
        
        
      
    
    同行多个表单布局封装

    有时业务需要,一行可以定义多个表单,所以需要使用el-row,此时需要修改FormOptions属性接口,完善多个表单场景,cols是一个数组定义FormOptions数组,colOption是el-col组件的相关属性,然后重新复用嵌套表单的代码。

    
        
        
        
          
            
              
              
            
          
        
        
        
    

    提交取消按钮区域:这个最好可以实现插槽让开发者可以自定义。

    
          
    

    步骤3

    开发者的调用封装组件,通过配置不同表单类型的数组,然后调用lib-form封装组件实现业务代码复用。

    组件的调用:根据业务需要,可以适当定义我们需要的组件属性以及必须要传的参数。

    
      
        Click to upload
      
      
        
          jpg/png files with a size less than 500kb
        
              提交     重置   

    表单项的配置数组:由于这配置数组比较长,所以一般可以单独抽离出来,不要写在vue文件中,这样可以提高代码的可读性。

    // 这里以多行表单布局为例子
    let options: FormOptions[] = [
      {
        type: 'row',
        rowGutter: 20,
        cols: [
          {
            type: 'input',
            value: '',
            label: '用户名',
            prop: 'username',
            placeholder: '请输入用户名',
            rules: [
              {
                required: true,
                message: '用户名不能为空',
                trigger: 'blur',
              },
              {
                min: 2,
                max: 6,
                message: '用户名在2-6位之间',
                trigger: 'blur',
              },
            ],
            attrs: {
              clearable: true,
            },
            colOption: {
              offset: 0,
              span: 12,
            },
          },
          {
            type: 'input',
            value: '',
            label: '用户名',
            prop: 'username',
            placeholder: '请输入用户名',
            rules: [
              {
                required: true,
                message: '用户名不能为空',
                trigger: 'blur',
              },
              {
                min: 2,
                max: 6,
                message: '用户名在2-6位之间',
                trigger: 'blur',
              },
            ],
            attrs: {
              clearable: true,
            },
            colOption: {
              offset: 0,
              span: 12,
            },
          },
        ],
      },
     ]
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>