Vue2 使用可选链操作符 ?.

取数据的时候数据层级比较深,控制台报了如下错误:

是由于某个属性为空,所有报错,但是如果使用v-if或者三元操作符的话,由于层级较深,代码就会显得非常长,不好看,所以想使用可选链操作符来进行非空判断,直接使用会出现如下报错:

这是因为vue2的template不支持可选链,一开始我选择把vue版本升级为2.7.0,但是升级版本之后出现报错:Syntax Error: TypeError: Cannot read properties of null (reading 'content')

没能解决,只好将版本降为2.6.10

然后尝试了一位博主的方法,我的步骤如下:

1、安装babel:

npm install @babel/plugin-proposal-optional-chaining --save-dev

解析可选链,解决兼容性问题 

2、在babel.config.js中添加该插件:

module.exports = {
  presets: [
    '@vue/cli-plugin-babel/preset'
  ],
  'env': {
    'development': {
      'plugins': ['dynamic-import-node', '@babel/plugin-proposal-optional-chaining']
    }
  }
}

此时可以在<script>中使用了,但是在 <template>中依旧报错

3、在utils.js中增加一个函数:

export const useChain = (target) => {
  return new Proxy(target, {
    get: (target, key) => {
      const keys = key.split('?.')
      return keys.reduce((a, b) => a?.[b], target)
    }
  })
}

4、将其挂载到vue原型上:

main.js:

import { useChain } from './utils/index'
Vue.prototype.$c = useChain

 5、在<template>中使用:

<count-to :start-val="0" :end-val="$c(a)['b?.c']" :duration="2000" />
或者
<div>{{$c(data)['a?.b?.c']}}</div>

data() {
    return {
      a: {
        b:{
           c:'1'
        }  
      }
    }
  }

或者:
const data = {
  a: {
    b: {
      c: 'c'
    }
  }
}

6、总结:

在Vue2.7.0以下版本里面默认不支持,需要babel进行编译,在vue2.7.0以上和vue3里面好像可以直接使用,但是我将版本升级到2.7.0之后报了很多错,止步于Syntax Error: TypeError: Cannot read properties of null (reading 'content')这个错无法解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值