1、先来几张结果图
2、树形菜单的实现代码
<el-col :span="24">
<el-form-item label="上级菜单" prop="parentId">
<!-- normalizer就是转换菜单数据结构,把这个对象的menuId转成id,menuName转成name类似的操作 -->
<treeselect
v-model="form.parentId"
:options="menuOptions"
:normalizer="normalizer"
:show-count="true"
placeholder="选择上级菜单"
/>
</el-form-item>
</el-col>
<!-- 这里定义不同菜单类型对应的label不一样,就可以进行点击的时候不同的操作 -->
<el-col :span="24">
<el-form-item label="菜单类型" prop="menuType">
<el-radio-group v-model="form.menuType">
<el-radio label="M">目录</el-radio>
<el-radio label="C">菜单</el-radio>
<el-radio label="F">按钮</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
这里的menuOption实际上就是接口返回的数据处理成合适的结构
相关事件代码:
/** 转换菜单数据结构 */
normalizer(node) {
if (node.children && !node.children.length) {
delete node.children;
}
return {
id: node.menuId,
label: node.menuName,
children: node.children
};
},
3、小卡片效果代码
<!-- 图标小卡片弹窗的代码 -->
<el-col :span="24" v-if="form.menuType != 'F'">
<el-form-item label="菜单图标" prop="icon">
<!-- 这个就是小组件---弹出框 -->
<!-- placement="bottom-start"就是组件的出现位置 -->
<el-popover
placement="bottom-start"
width="460"
trigger="click"
@show="$refs['iconSelect'].reset()"
>
<!-- 写好的组件调用 -->
<IconSelect
ref="iconSelect"
@selected="selected"
:active-icon="form.icon"
/>
<el-input
slot="reference"
v-model="form.icon"
placeholder="点击选择图标"
readonly
>
<!-- 图标显示的地方svg-icon :icon-class="form.icon"动态绑定样式 如果有的话就是显示你选择的图标在首部 -->
<svg-icon
v-if="form.icon"
slot="prefix"
:icon-class="form.icon"
style="width: 25px"
/>
<!-- 如果没有选择标签就是显示原始的样式即prefix首部放大镜图标,el-input__icon和slot是搭配使用的 -->
<i
v-else
slot="prefix"
class="el-icon-search el-input__icon"
/>
</el-input>
</el-popover>
</el-form-item>
</el-col>
具体情况具体分析,提供一个参考哈