首页 web前端 Vue.js 一文带你详解Vue2 中的可选链式调用操作符“?.”

一文带你详解Vue2 中的可选链式调用操作符“?.”

Feb 14, 2022 pm 08:34 PM
vue2

本篇文章带大家了解一下Vue2 中的可选链式调用操作符“?.”,聊聊 ?. 在 template中使用报错的解决方法,希望对大家有所帮助!

一文带你详解Vue2 中的可选链式调用操作符“?.”

一、先说一下什么是?.(可选链式调用操作符

可选链操作符(  ?.  )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。【相关推荐:vue.js视频教程

链接: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining

简单来说就是我们平时使用“ . ”操作符来获取对象某个值的一个升级版本。当上一个值不存在时防止undefined.东西报错。
废话不多说,直接上代码。

let obj = { a: { b: { c: ['冰墩墩', '冬奥会'] } } }

// 当我们想获取“冰墩墩”的时候
// 如果直接obj.a.b.c[0]的话a、b、c任意一项不存在的话都会报错

// 正确的做法是
obj && obj.a && obj.a.b && obj.a.b.c && obj.a.b.c[0] // 冰墩墩

// 而采用?.操作符的话 
obj?.a?.b?.c?.[0] // 冰墩墩
登录后复制

当我们工作中遇到嵌套无比深的数据结构时,用&&来校验属性是否存在。代码就变的十分臃肿。可读性和维护起来让人头皮发麻。但是使用 ?. 就简洁了不少,可阅读性也大大提高

二、?. 在 Vue2 template中使用问题

当我们学会一个新的技能兴致勃勃想在代码的世界中大露一手的时候,发现在Vue2环境下js中能正常使用 ?. ,但是在template中却报错。

1.png

Vue2 template中无法正常识别 ?. 操作符 可能是因为 ?. 可选链语法比较新,没有在template中做关于这方面的处理

想必各位都不是等闲之辈,既然能在js中使用那我们就顺着思路解决这个问题

三、解决方案

  • 第三方库 lodash中的 _get 方法
  • 升级到vue3,目前vue3成为默认版本生态趋近于成熟且template支持可选链操作符
  • computed计算属性中使用 ?.
  • 对template源码进行拦截更改,代码侵入性过高
  • 写一个hook挂到global/mixins上随时调用

想了一圈只有最后一种方案最靠谱 说干就干,让我们先来书写一个自己的 ?. 函数

let obj = { a: { b: { c: ['冰墩墩', '冬奥会'] } } }

function variableJudge(obj, keyName, tag = '?.') {
  if (!obj) return undefined
  let keys = keyName.split(tag)
  return keys.reduce((objNew, keyItem) => {
    if (keyItem === '') return objNew
    if (keyItem.indexOf('.') !== -1) return variableJudge1(objNew, keyItem, '.')
    return objNew?.[keyItem]
  }, obj)
}
//------------------------------ Proxy 版本 --------------------------------------
function variableJudgeProxy(obj, tag = '?.') {
  if (!obj) return undefined
  return new Proxy(obj, {
    get: (obj, key) => {
      const keys = key.split(tag)
      return keys.reduce((objNew, keyItem) => {
        if (keyItem === '') return objNew
        if (keyItem.indexOf('.') !== -1) return variableJudgeProxy(objNew, '.')[keyItem]
        return objNew?.[keyItem]
      }, obj)
    }
  })
}
  console.log(variableJudge(obj, '?.a?.b?.c?.0')) //冰墩墩
  console.log(variableJudgeProxy(obj)['?.a?.b?.c?.0']) //冰墩墩
登录后复制

wait wait wait 既然我们要写自己的 ?. 函数为什么要定义传进来的keyName含有 ?. 呢。
为什么不让keyName直接是 . 语法而且还拥有 ?. 的功能这样既符合我们的开发习惯,又能达到我们的预期,岂不美哉
而且按理说如果上一个值是undefined的话我们应该直接reutrn,但是用reduce方法也无法提前中断。
于是又优化了一版代码

let obj = { a: { b: { c: ['冰墩墩', '冬奥会'] } } }

const variableJudge = (obj, keyName) => {
  if (!obj) return null
  let keys = (keyName + '').split('.')
  let tempObj = obj
  for (let i = 0; i < keys.length; i++) {
    if (!tempObj) return
    if (keys[i] !== &#39;&#39;) tempObj = tempObj?.[keys[i]]
  }
  return tempObj
}
console.log(variableJudge(obj, &#39;.a.b.c.0&#39;)) //冰墩墩
登录后复制

然后我们挂到Vue原型上就可以随时使用了

Vue.prototype.$vj = variableJudge
登录后复制

让我们来看一下在template中如何使用

// 省去了臃肿的代码为空判断 是不是赏心悦目了
<div>{{ $vj(ugc, &#39;.itemList.item.pic.picList.1.picUrl&#39;) }}</div>
登录后复制

四、总结

?.(可选链式调用操作符)其实还有很多的妙用等待大家的发掘,本文只为 ?. 在 Vue2 中template中使用报错的问题来围绕展开

如果文章 / 代码哪里有可以优化的点欢迎大家提出
本文如果对你产生了帮助可以分享给其他人
既然都看到这里了,创作不易,留下一个小小的赞吧。

更多编程相关知识,请访问:编程视频!!

以上是一文带你详解Vue2 中的可选链式调用操作符“?.”的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Vue中export default如何配置组件的lifecycle hooks Vue中export default如何配置组件的lifecycle hooks Mar 04, 2025 pm 03:29 PM

本文阐明了导出默认值在vue.js组件中的作用,强调它仅用于导出,而不是配置生命周期挂钩。 生命周钩被定义为组件选项对象中的方法,其功能un

Vue中export default如何配置组件的watch Vue中export default如何配置组件的watch Mar 04, 2025 pm 03:30 PM

本文使用导出默认值时阐明vue.js组件手表功能。 它通过特定于物业的观看,明智的深层和直接的期权使用以及优化的处理程序功能来强调有效的手表用法。 最佳实践

如何在vue.js中创建和使用自定义插件? 如何在vue.js中创建和使用自定义插件? Mar 14, 2025 pm 07:07 PM

文章讨论创建和使用自定义vue.js插件,包括开发,集成和维护最佳实践。

什么是vuex,如何将其用于VUE应用程序中的状态管理? 什么是vuex,如何将其用于VUE应用程序中的状态管理? Mar 11, 2025 pm 07:23 PM

本文解释了VUE.J.的州管理库Vuex。 它详细介绍了核心概念(状态,获取器,突变,动作)并展示用法,并强调了其比更简单的替代方案对大型项目的好处。 调试和结构

vue.js(基于组件的架构,虚拟DOM,反应数据绑定)的关键功能是什么? vue.js(基于组件的架构,虚拟DOM,反应数据绑定)的关键功能是什么? Mar 14, 2025 pm 07:05 PM

Vue.js凭借其基于组件的体系结构,用于性能的虚拟DOM以及用于实时UI更新的反应性数据绑定来增强Web开发。

如何使用VUE路由器(动态路由,嵌套路线,路线护罩)实现高级路由技术? 如何使用VUE路由器(动态路由,嵌套路线,路线护罩)实现高级路由技术? Mar 11, 2025 pm 07:22 PM

本文探讨了高级VUE路由器技术。 它涵盖动态路由(使用参数),用于层次导航的嵌套路由以及用于控制访问和数据获取的路线护罩。 管理复杂路线的最佳实践

如何配置Vue CLI以使用不同的构建目标(开发,生产)? 如何配置Vue CLI以使用不同的构建目标(开发,生产)? Mar 18, 2025 pm 12:34 PM

本文介绍了如何为不同的构建目标,切换环境,优化生产构建以及确保在调试中开发的源图。

如何将VUE与Docker一起用于容器化部署? 如何将VUE与Docker一起用于容器化部署? Mar 14, 2025 pm 07:00 PM

本文讨论了与Docker使用VUE进行部署,重点介绍了容器中VUE应用程序的设置,优化,管理和性能监视。

See all articles