支持 vuejs 中的可选链

Har*_*ari 15 vue.js electron vue-cli-4 ecmascript-2020

我已经使用 @vue/cli-service 4.2 创建了 vue 和电子应用程序,因为我面临着可选链接的问题。

我不能用?用于验证条件,如 (@babel/plugin-proposal-optional-chaining)

例如。a?.b?.c 这意味着它检查天气 a 是否存在然后检查 b 否则返回 false 与 angular 中的模板表达式相同。

任何人都知道如何在 vuejs 中配置可选链。

Jun*_*our 11

尝试vue-template-babel-compiler

它用于Babel启用Optional Chaining(?.)Nullish Coalescing(??)许多新的 ES 语法Vue.js SFC

Github 存储库:vue-template-babel-compiler

演示版

演示图

用法

1. 安装

npm install vue-template-babel-compiler --save-dev
Run Code Online (Sandbox Code Playgroud)

2. 配置

1.Vue -CLI

Vue-CLI 的 DEMO 项目

// vue.config.js
module.exports = {
    chainWebpack: config => {
        config.module
            .rule('vue')
            .use('vue-loader')
            .tap(options => {
                options.compiler = require('vue-template-babel-compiler')
                return options
            })
    }
}
Run Code Online (Sandbox Code Playgroud)

2. Nuxt.js

Nuxt.js 的演示项目

// nuxt.config.js
export default {
  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {
    loaders: {
      vue: {
        compiler: require('vue-template-babel-compiler')
      }
    },
  },
  // ...
}
Run Code Online (Sandbox Code Playgroud)

详细使用方法请参考REAMDE

支持Vue-CLI, Nuxt.js, Webpack,任何环境使用vue-loader v15+

  • webpack 配置对我不起作用...有什么要求吗?我有 vue-loader 14 和 webpack 3 已经过时了,其他的东西或多或少都是最新的 (3认同)

Aka*_*eth 6

一个快速更新是 Vue 3 捆绑了对可选链接的支持。

要进行测试,您可以尝试编译以下 Vue 组件代码。

<template>
  <div id="app" v-if="user?.username">
    @{{ user?.username }} - {{ fullName }} <strong>Followers: </strong>
    {{ followers }}
    <button style="align-self: center" @click="followUser">Follow</button>
  </div>
</template>

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

export default defineComponent({
  name: 'App',
  props: {
    test: Object
  },
  data() {
    return {
      followers: 0,
      user: {
        id: 1,
        test: {},
        username: '_sethAkash',
        firstName: undefined,
        lastName: 'Seth',
        email: 'sethakash007@gmail.com',
        isAdmin: true
      }
    }
  },
  computed: {
    fullName(): string {
      //
      return `${this?.test?.firstName} ${this?.user?.lastName}`
    }
  },
  methods: {
    followUser: function () {
      this.followers += 1
    }
  },
  watch: {
    followers(newFollowerCount, oldFollowerCount) {
      if (oldFollowerCount < newFollowerCount) {
        console.log(`${this?.user?.username} has gained a follower!`)
      }
    }
  },
  mounted() {
    this.followUser()
  }
})
</script>
Run Code Online (Sandbox Code Playgroud)


Edm*_*645 5

根据这里对某个问题的评论

您可以创建一个全局 mixin 并使用该eval函数来评估表达式。

例子:

Vue.mixin({
  methods: {
    $evaluate: param => eval('this.'+param)
  }
});
Run Code Online (Sandbox Code Playgroud)

在模板中:

<template>
  <p>{{ $evaluate('user?.name') }}</p>
</template>

Run Code Online (Sandbox Code Playgroud)

他们还补充说,它可能并不完美:

尽管它仍然无法替代真正的运算符,尤其是当您多次出现它时


编辑

如上所述,使用eval可能会带来一些意想不到的问题,我建议您使用计算属性代替。

在证监会:

<template>
  <p>{{ userName }}</p>
</template>

<script>
export default {
  data(){
    return { 
      user: {
        firstName: 'Bran'
      }
    }
  },
  computed: {
    userName(){
      return this.user?.firstName
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

  • 您不应该使用“eval”。它会在某些浏览器中导致错误,显然这是一个不好的做法。 (4认同)