「如何优雅的使用Vue?」不可不知的Vue实战技巧
ccwgpt 2024-10-11 11:09 39 浏览 0 评论
作者: CHICAGO
转发连接:https://juejin.im/post/5e475829f265da57444ab10f
前言
在大家都会用vue的时代,我们又如何去区别是新手小白还是资深vue玩家呢? 如何让自己与刚学vue的人拉开差距呢? 其实,很多人对于vue只停留在基础使用。想要提升自己,就应该想办法将其运用到更高的层次。
本文会从以下三个方面,来进阶我们对vue的运用能力
- 组件 : 全局组件注册
- Render函数 : 拯救繁乱的template
- Vue权限控制 : 高精度全局权限控制
1 -「全局组件注册」
组件是我们非常常用的东西,很多人使用组件都是通过一个一个文件去引用和注册。如果一个组件在整个项目里面的使用次数较多,每一次使用都需要引用并注册,就会显得特别麻烦
- 一般组件应用弊端
- 傻瓜式,太笨拙
- 繁琐,低效
<template>
<div>
<h1>I am HelloWorld</h1>
<Child1></Child1>
</div>
</template>
<script>
import Child1 from './child1.vue' // 引入
export default {
name: 'HelloWorld',
data(){
return{
}
},
components:{ // 注册
Child1
},
props: {
msg: String
},
methods:{
}
}
</script>
<style scoped lang="less">
</style>
当我们在项目需要重复多次使用该组件,会导致出现很多重复的引入和注册代码,既繁琐又不雅观。因此我们可以通过一个全局的Js文件来管理,将需要多次使用的组件进行全局注册
创建全局.js文件管理全局组件
// 1 - globalComponent.js
import Vue from 'vue' // 引入vue
// 处理首字母大写 abc => Abc
function changeStr(str){
return str.charAt(0).toUpperCase() + str.slice(1)
}
/*
require.context(arg1,arg2,arg3)
arg1 - 读取文件的路径
arg2 - 是否遍历文件的子目录
arg3 - 匹配文件的正则
关于这个Api的用法,建议小伙伴们去查阅一下,用途也比较广泛
*/
const requireComponent = require.context('.', false, /\.vue$/)
console.log('requireComponent.keys():',requireComponent.keys()) // 打印
requireComponent.keys().forEach(fileName => {
const config = requireComponent(fileName)
console.log('config:',config) // 打印
const componentName = changeStr(
fileName.replace(/^\.\//, '').replace(/\.\w+$/, '') // ./child1.vue => child1
)
Vue.component(componentName, config.default || config) // 动态注册该目录下的所有.vue文件
})
// 2 - 将globalComponent.js引入main.js
import global from './components/globalComponent'
// 3 - 使用这类组件不再需要引入和注册,直接标签使用即可
<template>
<div>
<h1>I am HelloWorld</h1>
<Child1></Child1>
</div>
</template>
运行程序,我们看下是否能够正常显示并分析两句打印
Extra:路由分区以及动态添加路由
假设我们有很多路由,每一个路由都通过傻瓜式的引入方式,会导致整个项目代码量增多,繁琐,更重要的一点是增加后期维护的难度。因此我们也可以通过上面类似的方式,对路由的引入和使用进行管理,实现分区引入路由,将不同功能下的路由进行区分,通过动态的方式进行引入,即方便快捷又增加可维护
创建专门的路由.js文件管理所有的路由
总路由管理文件 - index.js
分区路由
- index.routes.js
- login.routes.js
在大型项目中,往往会有很多互不关联的模块,例如电商平台中的商城,个人信息,这种情况下就可以对路由进行分区
// 分区路由文件写法
export default {
path:'/index',
name:'Index',
component: () => import('../views/Index.vue'), // 懒加载式引入,当跳转到时才进行引入chunk
children: [...]
}
// 总路由管理文件 index.js 写法
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const routerList = [] // 路由数组 - 存放所有路由
function importAll(routerArr){
// 该函数用于将所有分区路由中的路由添加到路由数组
routerArr.keys().forEach( key => {
console.log(key)
routerList.push(routerArr(key).default)
})
}
importAll(require.context('.',true,/\.routes\.js/))
const routes = [
...routerList
]
const router = new VueRouter({
routes
})
export default router
运行程序,我们看下是否能够正常显示并分析两句打印
优化之后的代码,会更灵活,更具有观赏性,既便捷高效,又方便维护
2 -「拯救繁乱的template」
很多人在写组件的时候,会依赖脚手架中的<template></template>标签,其实template也存在一定的缺陷,例如:
- template里存在一值多判断
- 过多使用template会使代码冗余,杂乱
VUE给我们提供了一个render函数,我们可以通过这个函数巧妙的解决template造成的问题
实战 - 处理多个button
<template>
<div>
<h1>I am Home</h1>
<!-- 假设按钮有多种类型,通过value来显示不同类型 -->
<div v-if='value === 1'>
<button>button1</button>
</div>
<div v-else-if='value === 2'>
<button>button2</button>
</div>
<div v-else>
<button>button3</button>
</div>
</div>
</template>
<script>
export default {
name: 'Home',
data(){
return{
value:1
}
},
methods:{
}
}
</script>
<style scoped lang="less">
</style>
上面这种写法,当出现多种类型的button,就会显得杂乱无章,当然,很多人会选择去封装一个button组件,那么这个组件的封装,又是一个技巧点,利用VUE的render函数,减少不必要的template,因此ru我们可以这样写
// 创建一个button.vue文件 写法如下
<script>
export default {
props:{
type:{
type:String,
default:'normal'
},
text:{
type:String,
default:'button'
}
},
render(h){
/*
h 类似于 createElement, 接受2个参数
1 - 元素
2 - 选项
*/
return h('button',{
// 相当于 v-bind:class
class:{
btn:true,
'btn-success':this.type === 'success',
'btn-danger':this.type === 'danger',
'btn-warning':this.type === 'warning',
'btn-normal':this.type === 'normal',
},
domProps:{
innerText: this.text || '默认'
},
on:{
click:this.handleClick
}
})
},
methods:{
handleClick(){
this.$emit('myClick')
}
}
}
</script>
<style scoped>
.btn{
width: 100px;
height:40px;
line-height:40px;
border:0px;
border-radius:5px;
color:#ffff;
}
.btn-success{
background:#2ecc71;
}
.btn-danger{
background:#e74c3c;
}
.btn-warning{
background:#f39c12;
}
.btn-normal{
background:#bdc3c7;
}
</style>
// 引入
<template>
<div>
<h1>I am Home</h1>
<!-- 按钮根据value显示不同类型的button -->
<Button type='success' text='button1' @myClick='...'></Button>
</div>
</template>
<script>
import Button from './button.vue'
export default {
name: 'Home',
data(){
return{
value:1
}
},
components:{
Button
},
methods:{
}
}
</script>
<style scoped lang="less">
</style>
上面这种写法,根据value来显示不同类型的button,我们只需要通过value去修改type,text等,就可以实现这一目的,而不需要去创建多个<button>,通过v-if去判断
优化之后的代码,避免了一值多判断的缺点,减少冗余,更加灵活, 这种方式较适合业务简单,使用次数多的组件
3 -「高精度全局权限处理」
权限的控制由前端处理的场景很多,例如根据后台返回内容,判断该人是否对此功能有权限,进而去修改元素v-if / v-show,这种情况下,当这个功能在多处地方出现,就会导致我们做很多很多不必要的重复代码,如果判断条件繁琐的情况,更加冗余,代码量也会增加很多。因此我们可以造一个小车轮,挂在全局上对权限进行处理
实战 - 处理某按钮显示权限问题
这种场景出现几率极高,尤其是处理含有多种角色的项目,如果这一类型的权限判断有多次处理,每一次出现都经历判断的话,代码将会异常难看且冗余,因此我们可以通过全局权限判断来处理
/*
在项目里新建一个common文件夹用于存放全局 .js 文件
这种全局文件夹做法相当普遍,一般项目里都应该有这样一个文件夹来管理全局的东西
*/
// common/jurisdiction.js 用于存放与权限相关的全局函数/变量
export function checkJurisdiction(key) {
// 权限数组
let jurisdictionList = ['1', '2', '3', '5']
let index = jurisdictionList.indexOf(key)
console.log('index:',index)
if (index > -1) {
// 有权限
return true
} else {
// 无权限
return false
}
}
// 将全局权限Js挂载到全局中
// main.js
import { checkJurisdiction } from './common/jurisdiction'
// 优雅操作 - VUE自定义指令
Vue.directive('permission',{
inserted(el, binding){
// inserted → 元素插入的时候
let permission = binding.value // 获取到 v-permission的值
if(permission){
let hasPermission = checkJurisdiction(permission)
if(!hasPermission){
// 没有权限 移除Dom元素
el.parentNode && el.parentNode.removeChild(el)
}
}else{
throw new Error('需要传key')
}
}
})
// 使用方式
<template>
<div>
<h1>I am Home</h1>
<!-- 按钮根据value -->
<div v-permission="'10'">
<button>权限1</button>
</div>
<div v-permission="'5'">
<button>权限2</button>
</div>
</div>
</template>
// 无需再通过value去判断,直接通过v-permission的值进行判断即可
运行程序,我们看下是否能够正常显示并分析打印
可以看到 v-permission = "'10'"是没有权限且不显示,v-permission = "'5'"是具有权限且显示
总结
以上三个方面操作起来看似简单,但很多人在写代码的时候,喜欢停留在业务上,只考虑能否实现,实际上,很多大型项目都需要有这些理念去减少代码量,减少冗余,在合适的场景下使用合适的方法才能提高自己的能力
? Tips: 如果文章有错误的地方,希望指出,觉得有用的小伙伴点个赞哦 QAQ
推荐Vue学习资料文章:
《「实践」深入对比 Vue 3.0 Composition API 和 React Hooks》
《前端网红框架的插件机制全梳理(axios、koa、redux、vuex)》
《深入学习Vue的data、computed、watch来实现最精简响应式系统》
《10个实例小练习,快速入门熟练 Vue3 核心新特性(一)》
《10个实例小练习,快速入门熟练 Vue3 核心新特性(二)》
《教你部署搭建一个Vue-cli4+Webpack移动端框架「实践」》
《尤大大细品VuePress搭建技术网站与个人博客「实践」》
《是什么导致尤大大选择放弃Webpack?【vite 原理解析】》
《带你了解 vue-next(Vue 3.0)之 小试牛刀【实践】》
《带你了解 vue-next(Vue 3.0)之 初入茅庐【实践】》
《一篇文章教你并列比较React.js和Vue.js的语法【实践】》
《深入浅出通过vue-cli3构建一个SSR应用程序【实践】》
《聊聊昨晚尤雨溪现场针对Vue3.0 Beta版本新特性知识点汇总》
《【新消息】Vue 3.0 Beta 版本发布,你还学的动么?》
《Vue + Koa从零打造一个H5页面可视化编辑器——Quark-h5》
《深入浅出Vue3 跟着尤雨溪学 TypeScript 之 Ref 【实践】》
《手把手教你深入浅出vue-cli3升级vue-cli4的方法》
《Vue 3.0 Beta 和React 开发者分别杠上了》
《手把手教你用vue drag chart 实现一个可以拖动 / 缩放的图表组件》
《Vue3 尝鲜》
《手把手让你成为更好的Vue.js开发人员的12个技巧和窍门【实践】》
《2020 年,Vue 受欢迎程度是否会超过 React?》
《手把手教你Vue解析pdf(base64)转图片【实践】》
《手把手教你Vue之父子组件间通信实践讲解【props、$ref 、$emit】》
《深入浅出Vue3 的响应式和以前的区别到底在哪里?【实践】》
《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》
《基于Vue/VueRouter/Vuex/Axios登录路由和接口级拦截原理与实现》
《手把手教你D3.js 实现数据可视化极速上手到Vue应用》
《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【上】》
《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【中】》
《吃透 Vue 项目开发实践|16个方面深入前端工程化开发技巧【下】》
作者: CHICAGO
转发连接:https://juejin.im/post/5e475829f265da57444ab10f
相关推荐
- 后端开发必看!Spring Boot3 如何轻松整合 MyBatis 管理 Mapper 接口?
-
你是否曾在使用SpringBoot3进行后端开发时,面对MyBatis管理Mapper接口一头雾水?项目工期紧张,却因为整合问题迟迟无法推进数据层开发,相信不少互联网大厂的后端开发人员都...
- 每天一个 Python 库:Django全能Web框架,一站式后台开发
-
为什么选择Django?Django=高效+全能+开箱即用内置功能说明ORM数据库操作更高效Admin管理后台1分钟搭好Auth登录认证/权限管理自动搞定路由、表单、静态资源通通内置...
- 作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?
-
在互联网大厂后端开发领域,MyBatis作为一款主流的持久层框架,凭借其灵活的配置与强大的数据处理能力,广泛应用于各类项目之中。然而,随着业务场景日趋复杂、系统规模不断扩张,开发过程中常面临SQL...
- 后端必看!Spring Boot3 跨域难题的五种破局之道
-
你在SpringBoot3开发中遇到过跨域问题吗?相信不少后端开发小伙伴都有过这样的经历:精心编写的接口,在前端调用时却突然报错,页面控制台跳出一堆关于跨域的错误提示,让人抓耳挠腮。别着急,今天...
- 这些 Python 后端技术竟成互联网大厂‘敲门砖’,你掌握了几个?
-
你是不是经常在技术群里刷到同行的“凡尔赛”发言?“刚用XX技术搞定大厂项目,offer直接到手”;又或者满心期待点开大厂招聘JD,却被Python后端那密密麻麻的技术要求,看得头皮发...
- 后端开发必读,一文带你了解如何配置MyBatis?
-
作为互联网大厂的后端开发人员,MyBatis想必是大家在项目开发中频繁使用的得力工具。不过,在实际操作中,你是否常常遭遇这些棘手状况:明明严格依照教程完成了MyBatis的配置,可项目启动时却无...
- 作为干电气的,低压断路器你真的了解吗?
-
低压断路器按结构型式分为万能式和塑料外壳式两类,本文主要介绍塑料式外壳小型断路器,小型断路器生厂厂家有很多,常见的为DZ型为中法合资的梅兰日兰,其余还有ABB公司的E系列F系列S系列,西门子的3...
- 高低压成套电气设备(五)(高低压成套设备技术的标准)
-
KYN28-12型户内金属铠装抽出式开关柜概述:KYN28-12(GZS1-12)型户内金属铠装抽出式开关柜系3~10KV三相交流50Hz单母线及单母线分段系统的成套配电装置。主要用于发电厂、中小型发...
- 深入解析:进线柜、出线柜等六种配电柜的组成和作用
-
配电柜家族深度解析:进线、出线、计量及其他从高压变电站到千家万户,电力如何安全可靠地输送?答案在于配电系统,而配电柜正是这个系统的核心组成部分,是电力系统心脏的守护者。本文将深入剖析六种常见配电柜——...
- 自主开发"开关机械特性测试数据智能分析工具"提升检修质量
-
5月9日,南网超高压公司天生桥局依托"大瓦特"智能平台天生桥局检修人员通过自主创新,成功开发出"开关机械特性测试数据智能分析工具",该成果标志着天生桥局在业技融合与数字化转型方面取得了重要突破。该分析...
- 烧焦后的电闸箱终于改完了,最终选择了安全实用的方案。
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:端木先生R几个月前,我家电闸箱零线排烧焦,当时真的有点小慌。后来找朋友研究半天,站内很多朋友给了不少宝贵意见,终于上周改造完了。十分感谢大伙...
- 什么是断路器的“壳架电流”?和“额定电流”有什么关系?
-
【我是头条创作者“振生的电气知识角”,欢迎在评论区留言,▲左上角点击+“关注”】小伙伴儿们,你们是不是会有疑问:断路器的“壳架电流”和脱扣器的“整定电流”什么关系?二者是否是一回事儿呢?接下来,我们...
- 断路器各种电流之间的关系是什么?作为电气人都需要掌握的知识!
-
提起断路器,想必大部分电气人员都不陌生了,但是如果说到断路器各种电流之间的关系,可能不少电气人员都是云里有雾摸不着头脑,甚至还有一些电气人员是一问三不知的。我们都知道断路器是指能够关合、承载和开断正常...
- ABB高压授权柜UniSafe 提供尽可能多的供配电回路
-
ABB高压开关柜UniSafe以其环保、紧凑的设计而著称,不仅结构紧凑、空间利用率高,还能在有限的占地面积内提供尽可能多的供配电回路,大大节省了资源和土建费用。内部结构部件采用优质材料,如敷铝锌钢板或...
- 如何选择空气开关,详细介绍分析(如何选择空气开关,详细介绍分析方法)
-
空气开关C型与D型的选择需根据负载特性、电流冲击需求和应用场景综合判断,以下是具体分析:一、核心区别空气开关结构简图施耐德空开西门子空开ABB空开ABB塑料外壳断路器施耐德塑料外壳断路器施耐德塑料外壳...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 后端开发必看!Spring Boot3 如何轻松整合 MyBatis 管理 Mapper 接口?
- 每天一个 Python 库:Django全能Web框架,一站式后台开发
- 作为后端开发,你知道MyBatis有哪些隐藏的 “宝藏” 扩展点吗?
- 后端必看!Spring Boot3 跨域难题的五种破局之道
- 这些 Python 后端技术竟成互联网大厂‘敲门砖’,你掌握了几个?
- 后端开发必读,一文带你了解如何配置MyBatis?
- 作为干电气的,低压断路器你真的了解吗?
- 高低压成套电气设备(五)(高低压成套设备技术的标准)
- 深入解析:进线柜、出线柜等六种配电柜的组成和作用
- 自主开发"开关机械特性测试数据智能分析工具"提升检修质量
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)