百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

VUE实战技巧,让你的代码少一点

bigegpt 2024-08-29 11:27 4 浏览

这三个小技巧应该熟知:

  • 组件 : 全局组件注册
  • Vue权限控制 : 高精度全局权限控制
  • Render函数 : 拯救繁乱的template
  • 路由分区以及动态添加路由
  • 「全局组件注册」

    创建全局.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文件
    })
    

    使用globalComponents

    // 2 - 将globalComponent.js引入main.js
    import global from './components/globalComponent'


    // 3 - 使用这类组件不再需要引入和注册,直接标签使用即可
    <template>
    <div>
    <h1>I am HelloWorld</h1>
    <Child1></Child1>
    </div>
    </template>




    「高精度全局权限处理」


    开发中 - 处理一些按钮显示权限问题

    这种场景出现几率极高,尤其是处理含有多种角色的项目,如果这一类型的权限判断有多次处理,每一次出现都经历判断的话,代码将会异常难看且冗余,因此我们可以通过全局权限判断来处理

    /*
        在项目里新建一个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的值进行判断即可

    拯救繁乱的template

    <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,因此我们可以这样写

    // 创建一个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去判断

    「路由分区以及动态添加路由」

    总路由管理文件 - index.js
    分区路由
    - index.routes.js
    - login.routes.js
    在大型项目中,往往会有很多互不关联的模块,例如电商平台中的商城,个人信息,这种情况下就可以对路由进行

    // 总路由管理文件 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
    

    总结:这些方法看似简单,但运用起来能给我们的开发带来不小的便利,理解其中的理念去减少代码量,减少冗余,在合适的场景下使用合适的方法才能提高自己的能力

    相关推荐

    或者这些Joplin插件也可以帮助你的笔记应用再一次强大

    写在前面距离上次分享《搭建私有全平台多端同步笔记,群晖NAS自建JoplinServer服务》已过去一段时间,大家是否开始使用起来了呢?如果你和我一样已经使用过Joplin有一段时间了,那或许你也会...

    Three.JS教程4 threejs中的辅助类

    一、辅助类简介Three.js提供了一些辅助类(Helpers)以帮助我们更容易地调试、可视化场景中的元素。ArrowHelepr:创建箭头辅助器;AxisHelper:创建坐标轴辅助器;BoxH...

    第2章 还记得点、线、面吗(二)(第二章还能敲钟吗)

    glbgltf模型(webvrmodel)-gltf模型下载定制,glb模型下载定制,三维项目电商网站在线三维展示,usdz格式,vr模型网,网页VR模型下载,三维模型下载,webgl网页模型下载我...

    如何检查Linux系统硬件信息?从CPU到显卡,一网打尽!

    你可能会问:“我为什么要关心硬件信息?”答案很简单:硬件是Linux系统的根基,了解它可以帮你解决很多实际问题。比如:性能调优:知道CPU核心数和内存大小,才能更好地调整程序运行参数。故障排查:系统卡...

    SpriteJS:图形库造轮子的那些事儿

    从2017年到2020年,我花了大约4年的时间,从零到一,实现了一个可切换WebGL和Canvas2D渲染的,跨平台支持浏览器、SSR、小程序,基于DOM结构和支持响应式的,高...

    平时积累的FPGA知识点(6)(fpga经典应用100例)

    平时在FPGA群聊等积累的FPGA知识点,第六期:1万兆网接口,发三十万包,会出现掉几包的情况,为什么?原因:没做时钟约束,万兆网接口的实现,本质上都是高速serdes,用IP的话,IP会自带约束。...

    芯片逻辑调度框架设计 都需要那些那些软件工具

    设计芯片逻辑调度框架通常需要使用以下软件工具:1.逻辑设计工具:例如Vivado、Quartus、SynopsysDesignCompiler等,用于设计和实现逻辑电路。2.仿真工具:例如Mo...

    ZYNQ与DSP之间EMIF16通信(正点原子领航者zynq之fpga开发指南v3)

    本文主要介绍说明XQ6657Z35-EVM高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。[基于TIKeyStone架构C6000系列TMS320C6...

    好课推荐:从零开始大战FPGA(从零开始的冒险4399)

    从零开始大战FPGA引子:本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“...

    业界第一个真正意义上开源100 Gbps NIC Corundum介绍

    来源:内容由「网络交换FPGA」编译自「FCCM2020」,谢谢。FCCM2020在5月4日开始线上举行,对外免费。我们有幸聆听了其中一个有关100G开源NIC的介绍,我们对该文章进行了翻译,并对其中...

    高层次综合:解锁FPGA广阔应用的最后一块拼图

    我们为什么需要高层次综合高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++...

    Xilinx文档编号及其内容索引(部分)

    Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文...

    Xilinx Vivado联合Modelsim软件仿真

    引言:Xilinx公司Vivado开发软件自带仿真工具,可以实现一般性能的FPGA软件仿真测试,其测试执行效率以及性能都不如第三方专用仿真软件Modelsim强。本文我们介绍下如何进行Vivado20...

    体育动画直播是怎么做出来的?从数据到虚拟赛场的科技魔法!

    你是否见过这样的比赛直播?没有真实球员,却能看梅西带球突破?足球比赛变成动画版,但数据100%真实?电竞比赛用虚拟形象直播,选手操作实时同步?这就是体育动画直播——一种融合实时数据、游戏引擎和AI的...

    Dialogue between CPC and political parties of neighboring countries held in Beijing

    BEIJING,May26(Xinhua)--TheCommunistPartyofChina(CPC)inDialoguewithPoliticalPartiesof...