目录

vue3中使用h函数加载elementPlus-组件

目录

vue3中使用h()函数加载elementPlus 组件

需求:后端返回一段html代码片段,前端页面直接渲染该片段,但是需要对代码片段中的一些、元素进行替换,比如,某个元素替换成 el-tree-select。

import { h, render } from 'vue';
import { ElTreeSelect, ElSelect, ElOption, ElDatePicker, ElConfigProvider } from 'element-plus';
export const renderElTreeSelect = (el, data) => {
    // 递归构建部门树
    function buildDeptTree(parentId) {
        return data
            .filter((dept) => dept.deptParent === parentId) // 找到所有子节点
            .map((child) => ({
                ...child,
                children: buildDeptTree(child.deptId) // 递归构建子节点的子树
            }));
    }
    // 创建一个dom元素
    const dom = document.createElement('div');
    // 将元素插入到原本的元素之前
    el.before(dom);
    // 定义一个
    const comp = defineComponent({
        setup() {
            const selectedValue = ref('');
            const treeData = ref([]);
            // 获取组织机构树
            treeData.value = buildDeptTree(0);
            return () =>
                h(ElTreeSelect, {
                    // 树形数据
                    data: treeData.value,
                    // 唯一标识字段
                    nodeKey: 'deptId',
                    props: {
                        label: 'deptName'
                    },
                    // 绑定值
                    modelValue: selectedValue.value,
                    // 变更事件
                    'onUpdate:modelValue': (val) => {
                        el.attr('value', val);
                        selectedValue.value = val;
                    },
                    placeholder: '请选择部门'
                });
        }
    });
    // 渲染组件
    render(h(comp), dom);
    // 隐藏原来的组件:后面可能取值需要,暂定隐藏不删除
    el.hide();
};