Skip to content

扩展自定义模板

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

扩展自定义模板

定义模板的拖拽规则

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

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);
    }
};

动态生成模板内容

在实际开发中,有时需要根据不同的条件动态生成模板内容。可以通过在模板规则中使用 JavaScript 函数来实现动态内容生成。以下示例演示了如何在模板中动态设置组件属性。

示例:动态生成栅格内容

假设我们希望根据传入的配置动态生成不同数量的列,可以通过在模板规则中使用函数来实现。

js
const DynamicColTemplateRule = (columns) => {
    const columnsArray = [];
    for (let i = 0; i < columns; i++) {
        columnsArray.push({
            type: 'col',
            props: {
                span: 24 / columns // 每列占据总栅格的等分
            },
            display: true,
            hidden: false,
            _fc_drag_tag: 'col'
        });
    }


return {
        // 插入菜单位置,固定为 'template'
        menu: 'template',
        // 模板 ID,唯一!
        name: `dynamic-col-${columns}`,
        // 模板名称
        label: `动态栅格(${columns}列)`,
        // 是否自动替换规则中的字段名
        autoField: false,
        // 是否只能拖入一个
        only: false,
        // 组件的生成规则
        template: [
            {
                type: 'fcRow',
                children: columnsArray,
                display: true,
                hidden: false,
                _fc_drag_tag: 'fcRow'
            }
        ]
    };
};

示例:挂载动态模板

js
// 假设这是你的 Vue 组件
export default {
  mounted() {
    // 按需生成模板规则并挂载
    const col4Template = DynamicColTemplateRule(4);
    const col6Template = DynamicColTemplateRule(6);


this.$refs.designer.addComponent(col4Template);
    this.$refs.designer.addComponent(col6Template);
  }
};

自定义模板与模板配置

自定义模板不仅可以用于简单的布局,还可以结合配置进行高级用法。例如,可以通过传入不同的配置参数,动态生成不同的组件或布局。

示例:结合配置生成模板

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

js
const FormTemplateRule = (config) => {
    return {
        menu: 'template',
        name: 'form-template',
        label: '动态表单模板',
        autoField: true,
        only: false,
        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);
  }
};

自定义模板的应用场景

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

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