Skip to content

扩展模板

自定义模板可以帮助你快速创建常用的组件组合或布局,这在日常开发中尤为实用。通过定义自定义模板,你可以一次性拖拽出多个组件,简化开发流程。

扩展自定义模板

数据结构

ts
//拖拽模板描述规则
export interface DragTemplateRule {
    //固定
    menu: 'template';
    //模板的id,不能重复
    name: string;
    //模板的名称
    label: string;
    //是否只能拖入一个
    only?: boolean;
    //是否自动替换规则中的字段名, 表单中可能存在多个时建议为true
    autoField?: false | boolean;
    //表单全局配置, 拖入组件后会自动导入
    formOptions?: {
        //全局样式配置
        globalClass?: GlobalClass;
        //全局变量配置
        globalVariable?: GlobalVariable;
        //全局数据源配置
        globalData?: GlobalData;
        //全局事件配置
        globalEvent?: GlobalEvent;
        //多语言配置
        language?: Object;
        //全局样式
        style?: string;
    } | string;
    //模板的渲染规则,或者json规则,或者通过函数返回json规则
    template: Rule[] | string | ((arg: { t: t }) => string);
}

定义模板的拖拽规则

在创建自定义模板时,需要定义一个规则对象,该对象包含了模板的基本信息和生成规则。以下示例演示了如何定义一个生成三列栅格的模板。

js
const ColTemplateRule = {
    //插入菜单位置,固定为template
    menu: 'template',
    //id,唯一!
    name: 'col3',
    //模板名称
    label: '三列栅格',
    //是否自动替换规则中的字段名,表单中可能存在多个时建议为true,只支持自动生成的字段ID!
    autoField: false,
    //是否只能拖入一个
    only: false,
    //组件的生成规则,可以将设计器中设计好json规则放到此处
    template: [
        {
            type: 'fcRow',
            children: [
                {
                    type: 'col',
                    props: {
                        span: 8
                    },
                    display: true,
                    hidden: false,
                    _fc_drag_tag: 'col'
                },
                {
                    type: 'col',
                    props: {
                        span: 8
                    },
                    display: true,
                    hidden: false,
                    _fc_drag_tag: 'col'
                },
                {
                    type: 'col',
                    props: {
                        span: 8
                    },
                    display: true,
                    hidden: false,
                    _fc_drag_tag: 'col'
                }
            ],
            display: true,
            hidden: false,
            _fc_drag_tag: 'fcRow'
        }
    ]
};

说明

  • menu: template 表示模板将出现在模板菜单中。
  • name: col3 唯一标识符,用于在系统中识别该模板。
  • label: 三列栅格 模板的显示名称。
  • autoField: false 表示在模板中不会自动替换字段名。
  • only: false 表示可以拖拽多个实例。
  • template: 包含组件生成规则的数组,用于定义模板中包含的组件和布局。

挂载拖拽规则

在定义了自定义模板后,需要将其挂载到设计器中,使其在设计器中可用。

js
// 假设这是你的 Vue 组件
export default {
    mounted() {
        // 挂载拖拽规则
        this.$refs.designer.addComponent(ColTemplateRule);
    }
};

封装模板教程

教你封装一个支持城市搜索功能的 Select 下拉选择组件。

1. 设计规则

清空设计区域, 在设计区域新建一个 Select 组件,并为其添加城市搜索功能。

template1.png

2. 获取规则

可通过右侧 JSON 面板或调用 designer.getJson() 方法获取组件配置规则。

template2.png

通过designer.getJson()方法获取规则

vue
<template>
    <fc-designer ref="designer"/>
</template>
<script setup>
    const designer = ref(null);
    //获取当前规则
    function getRule(){
        const json = designer.value.getJson();
        console.log(json);
    }
</script>

3. 定义拖拽规则

新建 cityTemplate.js 文件,用于保存城市选择组件的拖拽配置规则。

ts
const CityTemplate = {
    //插入菜单位置,固定为template
    menu: 'template',
    //id,唯一!
    name: 'cityTemplate',
    //模板名称
    label: '城市',
    //组件的生成规则,可以将设计器中设计好json规则放到此处
    template: "[{\"type\":\"select\",\"field\":\"Fqqcm8cwgwq8afc\",\"title\":\"城市\",\"effect\":{\"fetch\":\"\"},\"$required\":false,\"props\":{\"remoteMethod\":\"$FNX:const key = $inject.args[0];\\n$inject.api.fetch({\\n\\taction: 'https://datavmap-public.oss-cn-hangzhou.aliyuncs.com/areas/csv/100000_province.json?key=' + key,\\n}).then(res=>{\\n  const options = []\\n  res.rows.forEach((row)=>{\\n    if(!key || row.name.indexOf(key) > -1){\\n      options.push({label:row.name,value:row.name});\\n\\t\\t}\\n\\t})\\n  $inject.self.options = options;\\n})\",\"filterable\":true,\"remote\":true,\"placeholder\":\"请选择城市\"},\"options\":[{\"label\":\"选项01\",\"value\":\"1\"},{\"label\":\"选项02\",\"value\":\"2\"},{\"label\":\"选项03\",\"value\":\"3\"}],\"_fc_id\":\"id_Fckbm8cwgwq8agc\",\"name\":\"ref_Fa3mm8cwgwq8ahc\",\"_fc_drag_tag\":\"select\",\"display\":true,\"hidden\":false}]"
}


export default CityTemplate;

4. 导入拖拽规则

使用 addComponent 方法导入 cityTemplate.js 中定义的城市模板配置。

vue
<template>
    <fc-designer ref="designer"/>
</template>
<script setup>
    import {onMounted} from "vue";
    const designer = ref(null);
    //注意:需等待组件完成初始化后,方可调用其方法
    onMounted(() => {
        designer.value.addComponent(CityTemplate);
    });
</script>

更多示例

实例 1: 多组件组合

使用数字输入框输入数值,通过 value 组件自动转换为中文大写金额显示。

js
const chineseAmountTemplate = {
    menu: 'template',
    name: 'chineseAmount',
    label: '中文金额',
    template: [
        {
            type: 'inputNumber',
            field: 'Fgtxlugfgbdvb5c',
            title: '金额',
            info: '',
            $required: false,
            display: true,
            hidden: false,
            _fc_drag_tag: 'inputNumber'
        },
        {
            type: 'fcValue',
            field: 'Fvr1lugfgd3yb7c',
            title: ' ',
            info: '',
            display: true,
            hidden: false,
            _fc_drag_tag: 'fcValue',
            style: {
                color: '#999999'
            },
            computed: {
                value: '"大写: " + TOCHINSESAMOUNT(Fgtxlugfgbdvb5c || 0)'
            }
        }
    ]
}

实例 2: 单组件模板

将输入框封装为带单位显示的功能组件(如金额输入框显示"元"的后缀)。

js
const UnitTemplate = {
    menu: 'template',
    name: 'UnitTemplate',
    label: '金额',
    template: [
        {
            "type": "input",
            "field": "Fpq4m8nxdq6fdbc",
            "title": "金额",
            "$required": false,
            "_fc_id": "id_F3tam8nxdq6fdcc",
            "name": "ref_Fywjm8nxdq6fddc",
            "$easySlots": {
                "suffix": {
                    "type": "text",
                    "value": "元"
                }
            },
            "display": true,
            "hidden": false,
            "_fc_drag_tag": "input"
        }
    ]
}

实例 3: 关联全局配置

支持全局数据源和多语言的 Select 模板,自动加载选项并适配不同语言。

js
const StaffTemplate = {
    menu: 'template',
    name: 'StaffTemplate',
    label: '人员',
    formOptions: {
        language: {
            "zh-cn": {
                "AMw2a0kE": "人员"
            },
            "en": {
                "AMw2a0kE": "Staff"
            }
        },
        globalData: {
            "data_Ffa5m8nyi67vdnc": {
                "label": "加载数据",
                "type": "fetch",
                "action": "/api/xxx",
                "method": "GET",
                "dataType": "json",
                "headers": {},
                "query": {},
                "data": [],
                "parse": "",
                "onError": ""
            }
        },
    },
    template: [{
        "type": "select",
        "field": "Ffrsm8nyhvgsdkc",
        "title": "{{$t.AMw2a0kE}}",
        "effect": {
            "fetch": {
                "to": "options",
                "key": "data_Ffa5m8nyi67vdnc",
                "_uni": 1
            }
        },
        "$required": false,
        "props": {
            "_optionType": 1
        },
        "_fc_id": "id_F2q2m8nyhvgsdlc",
        "name": "ref_Frlsm8nyhvgsdmc",
        "display": true,
        "hidden": false,
        "_fc_drag_tag": "select"
    }]
}

实例 3: 动态生成模板

假设你需要根据不同的业务场景生成不同的表单模板,可以通过配置对象来实现。

js
const FormTemplateRule = (config) => {
    return {
        menu: 'template',
        name: 'form-template',
        label: '动态表单模板',
        template: [
            {
                type: 'fcRow',
                children: config.fields.map(field => ({
                    type: field.type,
                    props: field.props,
                    display: true,
                    hidden: false,
                    _fc_drag_tag: field.type
                })),
                display: true,
                hidden: false,
                _fc_drag_tag: 'fcRow'
            }
        ]
    };
};


// 配置对象示例
const formConfig = {
    fields: [
        { type: 'input', props: { placeholder: '请输入名称' } },
        { type: 'select', props: { options: [{ label: '选项1', value: '1' }, { label: '选项2', value: '2' }] } }
    ]
};


// 挂载模板
export default {
  mounted() {
    const formTemplate = FormTemplateRule(formConfig);
    this.$refs.designer.addComponent(formTemplate);
  }
};

自定义模板的应用场景

  • 常用布局: 例如常用的栅格布局或表单布局,可以定义模板来快速拖拽出常见的布局组件。
  • 业务组件: 封装业务逻辑组件,例如常用的卡片、列表等,可以通过自定义模板来实现快速插入。
  • 复杂组件组合: 对于复杂的组件组合,例如嵌套的表单组件,可以通过自定义模板进行快速构建。

扩展自定义模板功能使得设计器更加灵活和强大。通过定义和挂载自定义模板,你可以快速生成常用的组件组合和布局。利用动态生成模板和配置对象,可以进一步提升模板的适用性和灵活性,满足不同业务场景的需求。