前言
在开发过程中拿到一个内嵌比较深的值需要做很多的判断,来保证没有数据而报错,比如:
const obj = {
a: {
b: {
c:"1"
}
}
}
取c, 正确的做法是: const cValue = (obj && obj.a && obj.a.b && obj.a.b.c) || ''; // 需要判断4次,每一层是否有值
ES2020
Optional Chaining Operator(?.) :直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。具体用法可参考ES6( ES6)
取c const cValue = obj?.a?.b?.c //1
如何在项目中支持可选链
1. 安装依赖(Babel)
为了避免出现兼容问题,装好对应的转换器
npm install @babel/plugin-proposal-optional-chaining
2.添加至项目.babel.config.js文件中:
{
"plugins": [
"@babel/plugin-proposal-optional-chaining",
]
}
友情提示:<template>中暂时还不支持可选链语法
3.实际中的示例
全局函数
export default function useOptionChain(target) {
return new Proxy(target, {
get: (target, propKey)=> {
const proKeyArr = propKey.split('?.')
return proKeyArr.reduce((a,b)=>a?.[b],target)
}
})
}
使用
<template>
<div id="app">
//保留可选链的写法,更直观的展示,想要拿数组的元素直接取下标的数字即可,不需要 []
<h1 v-if="useOptionChain(arr)['0?.obj?.a?.b']">数组对象</h1>
<h1 v-if="useOptionChain(obj)['arr?.0?.a']">对象数组</h1>
</div>
</template>
<script>
//引入函数
import useOptionChain from "@/utils";
export default {
name: "App",
components: {},
data() {
return {
arr: [
{
obj: {
a: {
b: "数组对象",
},
},
},
],
obj: {
arr: [
{
a: "对象数组",
},
],
},
};
},
methods: {
useOptionChain,
},
};
</script>
作者:前端龙跃空
链接:https://www.jianshu.com/p/d900d1005cfb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论