Vform Vue3自定义组件(vant篇)

一、引入Vant
npm i vant -S
二、因为vform使用的是vite,所以直接配置vite相关内容
// 引入vite-plugin-style-import插件,方便自动按需引入组件样式
npm i vite-plugin-style-import@1.4.1 -D
// 配置插件
vite.config.js
import styleImport, { VantResolve } from 'vite-plugin-style-import';
plugins: [
    styleImport({
      resolves: [VantResolve()],
    }),
],
三、引入组件
main.js
import { createApp } from 'vue';
import { Button } from 'vant';

const app = createApp();
app.use(Button);
四、定义组件
  1. extension的samples文件夹中新建组件,注意名称必须携带-widget,因为之后的拖拽加载是通过component的:is=“{{type}}-widget”
  2. 参照alert-widget书写非容器组件(字段组件)代码
  3. 参照card-widget书写容器组件代码
  4. 配置属性扩展,extension-schema.js中,根据组件属性进行配置,
    属性说明:
    type:必须是新建组件的名称,例如组件名为cell-widget.vue,type必须为cell。原因参照(1),i18通过type显示容器名称。需要在lang的en-US_extension.js和zh-CN_extension.js的widgetLabel中配置type对应的名称。
    category:容器类型,container容器组件,其他为字段组件
    icon: 容器中显示的图标,可通过iconfont.cn进行下载引入展示
    formItemFlag:是否嵌套el-form-item组件内,因为不使用elment,所以写false
    options:为组件属性,配置属性后可在组件类中通过field.options.xxxx进行绑定
  5. 引入组件,并加载属性编译器extension-loader.js
(1)引入组件属性扩展
import {cellSchema} from "@/extension/samples/extension-schema"
(2)引入组件
import CellWidget from '@/extension/samples/vantwidget/cell/cell-widget'
(3)引入SFC配置(在‘6’中说明SFC代码配置)
import {cellTemplateGenerator} from '@/extension/samples/extension-sfc-generator'
(4)加载属性扩展
addCustomWidgetSchema(cellSchema)  //加载组件Json Schema
(5)注册组件
app.component(CellWidget.name, CellWidget)
(6)注册主页面右侧属性配置器
PERegister.registerCPEditor(app, 'cell-title', 'cell-title-editor',
    PEFactory.createInputTextEditor('title', 'extension.setting.title'))
方法说明:propertyRegister.js  property-editor-factory.js
        registerCPEditor: 注册常见属性对应的属性编辑器
        createInputTextEditor:注册输入框属性编辑器
        createBooleanEditor:注册Boolean属性编辑器
        ……
        更多配置参照:propertyRegister.js  property-editor-factory.js
(7)注册SFC代码生成器
    registerFWGenerator('cell', cellTemplateGenerator)
  1. 编辑SFC代码生成器 extension-sfc-generator.js
    export const cellTemplateGenerator = function (fw, formConfig) {
        // 重新编译属性(固定属性)
        const wop = fw.options
        const titleAttr = `:title="${wop.title}"`
        const valueAttr = `:value="${wop.value}"`
        const labelAttr = `:label="${wop.label}"`
        const sizeAttr = `:size="${wop.size}"`
        const iconAttr = `:icon="${wop.icon}"`
        const borderAttr = `:border="${wop.border}"`
        const islinkAttr = `:is-link="${wop.islink}"`
        const requiredAttr = `:required="${wop.required}"`
        const centerAttr = `:center="${wop.center}"`
        const arrowDirectionAttr = `:arrow-direction="${wop.arrowDirection}"`
        const clickAttr = `@click="${wop.onClick}"`

        /**
        * 重新编译属性(form动态属性)
        * 参照sfc-generator.js的getFlAttrs()方法,新增form属性可在该方法进行配置
        */ 
            // const {vModel, readonly, disabled, size, type, showPassword, placeholder, clearable,
    //   minlength, maxlength, showWordLimit, prefixIcon, suffixIcon, appendButtonChild, value} = getElAttrs(fw, formConfig)
    // return `<el-input ${vModel} ${readonly} ${disabled} ${size} ${type} ${showPassword} ${placeholder} ${clearable}
    //         ${minlength} ${maxlength} ${showWordLimit} ${prefixIcon} ${suffixIcon}>${appendButtonChild}</el-input>`

    // SFC支持导出任意组件
    const cellTemplate =
        `<van-cell ${value}></van-cell>`
        
    // 导出template,提供给extension-loader.js中进行SFC加载
    return cellTemplate
}

至此vForm3中引入vant组件功能(字段组件)完全实现

五、其他类功能说明,(看到哪里更新到哪里)

1、src->extension自定义组件主要文件夹

    extension—>samples组件生成,属性配置,sfc配置文件夹
        samples—>extension-schema.js 属性配置器
        samples—>extension-sfc-generator.js sfc配置器
    extension—>extension-helper.js 公共方法引入
    extension—>extension-loader.js 自定义组件配置主要类,加载属性编译器,引入组件,配置sfc等功能

2、src->utils 公共属性配置文件夹

    utils—>sfcgenerator.js sfc属性及组件配置
        registerFWGenerator 注册字段组件的代码生成器

3、src—>form-designer 主工程编译器

    form-designer—>index.vue 页面配置,左侧容器,中间组价配置器,右侧属性配置器
    form-designer—>form-widget 组件主控制类
        form-widget —>container-widget默认配置的容器组件
        form-widget —>field-widget默认配置的字段组件
        form-widget —>index.vue拖拽以后显示组件控制器,通过component is加载组件
    form-designer—>setting-panel 组件属性控制
        setting-panel—>index.vue 组件属性生成类,Boolean、select、input等
    form-designer—>toolbar-panel 顶部工具类
        toolbar-panel—>index.vue 主页面工具类实现,PC、Pad、H5、清空等功能
    form-designer—>widget-panel 左侧组件类型配置器
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容