【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略

news2024/11/24 0:13:04

回顾  前期  

趁着下班前五分钟书写——Vue3通讯(常规写法、语法糖、v-modle、兄弟通讯)_0.活在风浪里的博客-CSDN博客Vue3 组件通讯https://blog.csdn.net/m0_57904695/article/details/128145150?spm=1001.2014.3001.5501 

目录

 一、可选链接运算符【?.】

 二、空值合并操作符【??】

 三、提升代码可读性,减少 if-else 几个小技巧 ☠

对象配置/策略模式📑 【重要 好用】

四、Vue3 setup设置name

结语: 


 

一、可选链接运算符【?.】

左面值不是null 和 undefined,就执行右面的值(拼接上左面)

不使用 可选链接运算符

if (data && data.children && data.children[0] && data.children[0].title) {
    // I have a title!
}

使用后

let title = data?.children?.[0]?.title;

对于静态属性用法是:

object?.property

对于动态属性将其更改为:

object?.[expression] 

 对于方法的调用你可以这样写

object.runsOnlyIfMethodExists?.()

举例:

let parent = {
    name: "parent",
    friends: ["p1", "p2", "p3"],
    getName: function() {
      console.log(this.name)
    }
  };
  
  parent.getName?.()   // parent
  parent.getTitle?.()  //不会执行

二、空值合并操作符【??】

空值合并操作符(??)是一个逻辑操作符,
当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

console.log(null ?? 666)   
console.log(undefined ?? 666)
// 以上输出结果都为666

 ?? 与 || 的区别

One ?? Two
One || Two

相同点:
?? 和 || 的语法相同。

不同点:

判断的方法不同:
使用 ?? 时,只有One为 null 或者 undefined 时才会返回 two;
使用 || 时,One会先转化为布尔值判断,为true时返回One , false 返回Two,

若左边能转成true,返回左边式子的值,反之返回右边式子的值;


 // ??
  undefined ?? 2    // 2
  null ?? 2        // 2
  0 ?? 2            // 0
  "" ?? 2            // ""
  true ?? 2        // true
  false ?? 2        // false


 // ||
  undefined || 2    // 2
  null || 2        // 2
  0 || 2            // 2
  "" || 2            // 2
  true || 2        // true
  false || 2        // 2

顺便记录下转布尔值的两种方法 

方法一:使用 双重逻辑非  !!,语法 【!!要转换的值】

方法二:使用Boolean()函数,可以强制把值转换为布尔值,语法 【Boolean(字符串)】


 三、提升代码可读性,减少 if-else 几个小技巧 ☠

 使用 if else

let c
if(a){
    c = a
} else {
    c = b
}

使用 || 短路运算符 (会先转换为布尔值,若左边能转成true,返回左边式子的值,反之返回右边式子的值) 

let c = a || b

例:有A、B、C、D四种种类型,在A、B的时候输出1,C输出2、D输出3,默认输出0。

let type = 'A'

//if else if
if (type === 'A' || type === 'B') {
    console.log(1);
} else if (type === 'C') {
    console.log(2);
} else if(type === 'D') {
    console.log(3);
} else {
    console.log(0)
}

//switch case
switch (type) {
    case 'A':
    case 'B':
        console.log(1)
        break
    case 'C':
        console.log(2)
        break
    case 'D':
        console.log(3);
        break;
    default:
        console.log(0)
}

对象配置/策略模式📑 【重要 好用】

接下来我们用对象配置的方法实现一下上述的例子

let type = 'A'

let tactics = {
    'A': 1,
    'B': 1,
    'C': 2,
    'D': 3,
    default: 0
}
console.log(tactics[type]) // 1

接下来用几个例子让大家更加熟悉一点。

例一:根据不同的用户使用不同的折扣,如:普通用户不打折,普通会员用户9折,年费会员8.5折,超级会员8折

先使用 if else 实现😢

// 获取折扣 --- 使用if else
const getDiscount = (userKey) => {
    if (userKey === '普通会员') {
        return 0.9
    } else if (userKey === '年费会员') {
        return 0.85
    } else if (userKey === '超级会员') {
        return 0.8
    } else {
        return 1
    }
}
console.log(getDiscount('普通会员')) // 0.9

在 使用对象配置/策略模式实现🙂

// 获取折扣 -- 使用对象配置/策略模式
const getDiscount = (userKey) => {
    // 我们可以根据用户类型来生成我们的折扣对象
    let discounts = {
        '普通会员': 0.9,
        '年费会员': 0.85,
        '超级会员': 0.8,
        'default': 1
    }
 // 如果左边值转换布尔值后为true就返回左边,否则反之 
    return discounts[userKey] || discounts['default']
}
console.log(getDiscount('普通会员')) // 0.9

从上面的案列中可以明显看得出来,使用对象配置比使用if else可读性更高,后续如果需要添加用户折扣也只需要修改折扣对象就行👍


对象配置不一定非要使用对象去管理我们键值对,还可以使用 Map去管理🦋,如:

// 获取折扣 -- 使用对象配置/策略模式
const getDiscount = (userKey) => {
    // 我们可以根据用户类型来生成我们的折扣对象
    let discounts = new Map([
        ['普通会员', 0.9],
        ['年费会员', 0.85],
        ['超级会员', 0.8],
        ['default', 1]
    ])
    return discounts.get(userKey) || discounts.get('default')
}
console.log(getDiscount('普通会员')) // 0.9

例二:绩效为A的人年终奖有4倍工资,绩效为B的有3倍,绩效为C的只有2倍。

const calculateBonus = (performanceLevel, salary) => { 
    if (performanceLevel === 'A'){
        return salary * 4
    }
    if (performanceLevel === 'B'){
        return salary * 3
    }
    if (performanceLevel === 'C'){
        return salary * 2
    }
}
calculateBonus( 'B', 20000 ) // 输出:60000

完成了,但是如果增加了一种新的 绩效等级D,或者把 A等级的倍数改成5,那我们必须阅读所有代码才能去做修改

所以我们可以用对象配置/策略模式去简化这个函数😺

let state = new Map([
    ['A', 4],
    ['B', 3],
    ['C', 2]
])

const hCalc = (type, money) => { 
    return state.get(type) * money
}

 hCalc( 'B', 20000 ) // 输出:60000

四、Vue3 setup设置name

 vue3 中使用 setup 语法时,指定 name 属性有三种方式,个人推荐最后一种方式。

方式1:传统方式

传统方式是使用 defineComponent() 方法定义组件,通过对象形式设置 name 属性和 setup 函数传递给该方法。代码如下:

<template>
  <div>
    Test, {{str}}
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'

export default defineComponent({
  name: 'Test',
  setup: () => {
    const str = ref('hello')
    return {
      str
    }
  }
})
</script>

方式2:两个 script 标签

这种方式与传统方式类似,只是在传统方式的基础上,将 setup 提取到另一个标签中。代码如下:


<template>
  <div>
    Test, {{str}}
  </div>
</template>

<script lang="ts" setup>
import { defineComponent, ref } from 'vue'
const str = ref('hello')
</script>

<script lang="ts">
export default defineComponent({
  name: 'Test'
})
</script>

这种方式在 webstorm 中写起来很不顺手,webstorm 总是自动合并两个 script 标签中的代码。

方式3:优雅的方式

这种方式个人最推荐,首先安装配置插件,之后在 script 标签上指定 name 属性即可,一劳永逸。

安装插件 vite-plugin-vue-setup-extend,该插件的作用就是使 vue script setup 语法支持 name 属性。


yarn add vite-plugin-vue-setup-extend -D

 vite.config.ts 中配置插件:

import vueSetupExtend from 'vite-plugin-vue-setup-extend';


export default defineConfig({
  plugins: [
    ...
    vueSetupExtend(),
    ...
  ],
  ...
})

完成插件的配置后,便可以在 script 标签上指定 name 属性:


<template>
  <div>
    Test, {{str}}
  </div>
</template>

<script lang="ts" setup name="Test">
import { ref } from 'vue'
const str = ref('hello')
</script>

这种方式需要特别注意,如果 script标签中内容为空时,name 属性就无法加载。一定要确保 script 标签内一定要有内容,哪怕是一行注释也行:

<script lang="ts" setup name="Test">// ...</script>

结语: 

本文到这里就要完结了,感谢你的阅读!再见,

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库

&#xff08;1&#xff09;因为AD20需要自己画原理图库和PCB库。所以我建议新手先用立创EDA画好原理图&#xff0c;转换为PCB&#xff08;注意&#xff0c;只需要转换出PCB即可&#xff0c;因为我们需要立创EDA的PCB库。不懂没关系&#xff0c;后面就清楚了&#xff09; &#…

把随身WiFi的esim卡移植到SIM卡放到手机使用

esim移植到实体sim卡&#xff0c;手把手教你esim改实体卡操作 自用先机的棒子&#xff0c;3-5倍虚标&#xff0c;在单位用&#xff0c;网速还行就是信号不好&#xff0c;uz801_v3.0的板子&#xff0c;410单天线&#xff0c;没有改装潜力&#xff0c;发热还大&#xff0c;加了风…

炸裂!速度百倍提升,高性能 Python 编译器 Codon 火了!

众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官…

[附源码]Nodejs计算机毕业设计基于Web企业客户管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

数据分析图表-FineReport 图表切换接口

1. 概述 1.1 问题描述 图表往往是按照从左往右或从右往左的顺序来切换。那么如何实现点击图表直接切换到其他不相邻的图表呢&#xff1f;效果如下图所示&#xff1a; 1.2 实现思路 给图表添加 JavaScript 类型的超级链接&#xff0c;调用图表接口FR.Chart.WebUtils.getChart(…

如何选择美股l2接口类型?

如何选择美股l2接口类型&#xff1f; 首先要选择稳定的美股l2接口&#xff0c;因为在进行股票行情分析的时候对于其数据的真实性和准确性都有很高的要求。不靠谱的数据平台容易造成数据传输卡顿&#xff0c;或数据获取不准确的情况&#xff0c;轻则影响企业运作&#xff0c;重…

SpringSecurity[6]-Thymeleaf中Spring Security的使用/退出登录/Spring Security中CSRF

上一篇:SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现 链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客 十一、基于表达式的访问控制 十四、Thymeleaf中Spring Security的使用 Spring…

java计算机毕业设计基于安卓Android的校园财务流水系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

Unity脚本基础

【重点面试题】1、Unity3D中的协程&#xff08;coroutine&#xff09;&#xff0c;C#线程和进程之间的区别是什么&#xff1f; 简记&#xff1a;协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Un…

workerman+TP6实战网站客服系统之项目初始化

TP6 官方手册: 安装 ThinkPHP6.0完全开发手册 看云 安装TP6: composer create-project topthink/think tp6 报错: 解决问题: PHP默认把这个 proc_open 函数禁用了,取消禁用即可 取消禁用函数流程参考之前一篇文章 php workerman入门之运行起来_山山河川的博客-CSDN博…

Java中的匿名内部类

一、什么是匿名内部类&#xff1f; 定义&#xff1a;巴拉巴拉巴拉&#xff0c;就不写了。 语法&#xff1a; 部分内容来源于&#xff1a;什么是匿名内部类&#xff0c;如何使用匿名内部类_Weihaom_的博客-CSDN博客_匿名内部类 二、为什么要有匿名内部类&#xff1f; 在开发…

【大数据入门核心技术-Flume】(二)Flume安装部署

目录 一、准备工作 1、基本Hadoop环境安装 2、下载安装包 二、安装 1、解压 2、修改环境变量 3、修改并配置 flume-env.sh 文件 4、验证是否安装成功 一、准备工作 1、基本Hadoop环境安装 参考 Hadoop安装 【大数据入门核心技术-Hadoop】&#xff08;五&#xff09…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案&#xff0c;基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

[附源码]Node.js计算机毕业设计高铁乘坐舒适性在线调查及评价系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

挑灯夜战800个小时,终从外包成功上岸字节!入职那一天我眼眶湿润了

P8Java导图笔记 主目录&#xff1a; Java基础篇&#xff1a; JAVA基础对应详细解析文档 Java多线程并发篇&#xff1a; Java多线程并发知识点对应详解解析文档 JVM篇&#xff1a; JVM脑图对应详细文档解析 Spring原理 Spring原理对应详细解析文档 数据库 数据库对应详细解析文档…

[附源码]计算机毕业设计的连锁药店销售管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

全面回顾2022年加密行业大事件:破后而立方能绝处逢生

2022年&#xff0c;加密领域以Luna/UST的崩溃为起点开启了漫长的加密寒冬&#xff0c;在严峻的宏观环境下以及一系列戏剧性事件中遭受了沉重打击。2022年初&#xff0c;加密货币生态系统的市值达到近3万亿美元&#xff0c;而截至年底已蒸发2万亿美元&#xff0c;随之消失的还有…

「秒杀购物商城业务服务」「分布式架构服务」盘点中间件服务

​ 秒杀购物商城业务服务-分布式架构介绍 基于MySQL数据库集群技术实现服务的高可用基于Tomcat的集群负载机制实现Tomcat服务器的高可用基于Nginx负载均衡机制实现负载均衡&#xff08;介绍和配置&#xff09;基于Redis缓存服务实现数据缓存控制相关介绍和技术点分析对未来的…

分布式系统(概念、时间、状态)

文章目录分布式系统基本概念设计目标时间基本概念时间同步同步系统异步系统网络时间协议&#xff08;NTP&#xff09;逻辑时钟 & 向量时钟发生在先逻辑时钟向量时钟状态 & 快照全局状态 & 割集快照算法分布式系统 基本概念 分布式计算&#xff1a;是利用分布在网…

第二证券|“抗病毒面料”接棒炒作 是噱头还是新转机?

疫情防控常态化之下&#xff0c;“抗病毒抗菌”面料赚足了商场眼球。 由于合资公司的电子束接枝改性面料具有“抗病毒抗菌”的作用&#xff0c;“童装榜首股”安奈儿(002875.SZ)创下了14天10个涨停板的记载&#xff0c;12月13日&#xff0c;股价上涨逾6%。 主营精纺呢绒面料及…