热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

项目业务<权限管理+组件二次封装>

知识点补充一:PropTypevue3为结合ts,props设置自定类型import{defineComponent,PropType}fromvue

知识点补充一:PropType

vue3为结合 ts ,props设置自定类型

import { defineComponent, PropType } from "vue";
// ....代码省略
props: {formItem: {type: Array as PropType < IFormItemType[] > ,default:() &#61; >[]}
}

知识点补充二&#xff1a;require.context方法

webpack的函数&#xff1a;根据传入的参数&#xff0c;获取对应文件的相对路径&#xff0c;返回值调用.keys()方法和得到路径的数组。

权限管理&#xff1a;根据传递对来的路径&#xff0c;去匹配对应的route&#xff0c;设置动态路由

import type { RouteRecordRaw } from "vue-router";
export default function (useMenus: any[]): RouteRecordRaw[] {const routes: RouteRecordRaw[] &#61; [];// 加入全部路由const allRoutes: RouteRecordRaw[] &#61; [];const routeFiles &#61; require.context("&#64;/router/main", true, /\.ts$/);routeFiles.keys().forEach((filePath) &#61;> {const routeModule &#61; require("&#64;/router/main" &#43; filePath.split(".")[1]);allRoutes.push(routeModule.default);});console.log(useMenus);// 递归函数 获取可点击部分的url&#xff0c;并进行筛选function findRouteFun(useMenus: any[]) {for (const menu of useMenus) {if (menu.type &#61;&#61;&#61; 1) {findRouteFun(menu.children);} else if (menu.type &#61;&#61;&#61; 2) {const route &#61; allRoutes.find((item) &#61;> item.path &#61;&#61;&#61; menu.url);if (route) {routes.push(route);}}}}findRouteFun(useMenus);console.log(routes);return routes;
}

组件二次封装
传入对应的配置信息可马上获取一个新的组件
index.ts总出口文件

import MsiForm from "./src/MsiForm.vue";export * from "./types";
export default MsiForm;

types.ts文件

type InputType &#61; "input" | "select" | "password" | "datapicker";export interface IFormItemType {type: InputType;label: string;rules?: any[];placeholder?: string;options?: any[];otherOptions?: any;
}interface colLayoutType {xs?: number;sm?: number;md?: number;lg?: number;xl?: number;
}
export interface IForm {formItem: IFormItemType[];labelWidth?: string;itemStyle?: any;colLayout?: colLayoutType;
}

MsiForm.vue组件

<template><div class&#61;"msi-form"><el-form :label-width&#61;"labelWidth"><el-row><template v-for&#61;"item in formItem" :key&#61;"item.label"><el-col :&#61;"colLayout"><el-form-item :label&#61;"item.label" :style&#61;"itemStyle"><template v-if&#61;"item.type &#61;&#61;&#61; &#39;input&#39;"><el-input:placeholder&#61;"item.placeholder"v-bind&#61;"item.otherOptions"/></template><template v-else-if&#61;"item.type &#61;&#61;&#61; &#39;password&#39;"><el-inputshow-password:placeholder&#61;"item.placeholder"v-bind&#61;"item.otherOptions"/></template><template v-else-if&#61;"item.type &#61;&#61;&#61; &#39;select&#39;"><el-selectv-bind&#61;"item.otherOptions":placeholder&#61;"item.placeholder ? item.placeholder : &#39;请选择..&#39;"><el-optionv-for&#61;"option in item.options":key&#61;"option.value":value&#61;"option.value">{{ option.title }}</el-option></el-select></template><template v-else-if&#61;"item.type &#61;&#61;&#61; &#39;datapicker&#39;"><el-date-picker v-bind&#61;"item.otherOptions"/></template></el-form-item></el-col></template></el-row></el-form></div>
</template><script lang&#61;"ts">
import { defineComponent, PropType } from "vue";
import type { IFormItemType } from "../types";export default defineComponent({name: "index",props: {formItem: {type: Array as PropType<IFormItemType[]>,default: () &#61;> []},labelWidth: {type: String,default: "80px"},itemStyle: {type: Object,default: () &#61;> ({ padding: "10px 20px" })},colLayout: {type: Object,default: () &#61;> ({xs: 24,sm: 24,md: 12,lg: 8,xl: 6})}},setup() {return {};}
});
</script><style lang&#61;"less" scoped>
.msi-form {padding-top: 20px;width: 100%;background-color: #fff;border-radius: 10px;
}
</style>


推荐阅读
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • vue使用
    关键词: ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
author-avatar
346182773_20da31
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有