我怎么能在vue模板中使用const?

lit*_*ear 15 javascript vue.js vuejs2

我试图在*.vue文件中定义一个const

<script>
    export const CREATE_ACTION = 1
    export const UPDATE_ACTION = 2
<script>
Run Code Online (Sandbox Code Playgroud)

并在模板中使用它们

<template>
    ...
    <select :disabled="mode === UPDATE_ACTION">
    ....
</template>
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用.那么,我如何在vue模板中使用const?

小智 50

如果你将它们暴露在你的数据上,你就会使它们变得不必要的反应性,正如@mix3d 提到的那样......

更好的方法是将它们添加到 Vue 对象Reactivity in Depth 中

<template>
      <div v-if="action === CREATE_ACTION">Something</div>
</template>

<script>
export default {
    created() {
        this.CREATE_ACTION = CREATE_ACTION;
        this.UPDATE_ACTION = UPDATE_ACTION;
    }
})
</script>
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法,除了它似乎不太适合 TypeScript。谁能建议一种消除 TS 错误的方法吗? (3认同)
  • 这是我认为最合适的答案。在数据中公开会使它们产生反应,而且您仍然必须在模板中使用字符串值,这是我们首先要避免的。 (2认同)

Ber*_*ert 20

将它们暴露在您的数据上.

new Vue({
    ...
    data:{
        CREATE_ACTION: CREATE_ACTION
        UPDATE_ACTION: UPDATE_ACTION
    }
    ...
})
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点是这些值默认获得所有 Vue 交互性(以及相关的开销)。不是很好,但在小用途中应该没问题。 (13认同)
  • 但是我想在另一个组件中使用它,并且……更加优美? (2认同)
  • 将它们暴露给数据会创建值的可观察副本。您实际上不再与常数进行比较。 (2认同)

Sau*_*abh 11

您可以将插件用于此目的,因为您希望将其包含在多个组件中:

// constsPlugin.js
const YOUR_CONSTS = {
  CREATE_ACTION: 1,
  UPDATE_ACTION: 2
  ...
}

YourConsts.install = function (Vue, options) {
  Vue.prototype.$getConst = (key) => {
    return YOUR_CONSTS[key]
  }
}

export default YourConsts
Run Code Online (Sandbox Code Playgroud)

main.js或你定义的地方new Vue(),你必须像这样使用它:

import YourConsts from 'path/to/plugin'

Vue.use(YourConsts)
Run Code Online (Sandbox Code Playgroud)

现在您可以在组件模板中使用它,如下所示:

<div>
   <select :disabled="mode === $getConst('UPDATE_ACTION')">
</div>
Run Code Online (Sandbox Code Playgroud)


MiC*_*c83 9

使用 Mixin 怎么样?这就是我这样做的方式。不确定这是最好的还是推荐的方式,但代码看起来更干净。

数据/actions.js

export const CREATE_ACTION = 1;
export const UPDATE_ACTION = 2;

export const actionsMixin = {
  data() {
    return {
      CREATE_ACTION,
      UPDATE_ACTION
    }      
  }
}
Run Code Online (Sandbox Code Playgroud)

我的组件.vue

<template>
  <div v-if="action === CREATE_ACTION">Something</div>
</template>

<script>
import {actionsMixin, CREATE_ACTION} from './data/actions.js';

export default {
  mixins: [actionsMixin]
  data() {
    return {
      action: CREATE_ACTION
    }      
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

  • 仍然会为不应更改的静态对象产生反应性开销。 (4认同)

小智 7

<template>
  <div v-if="FOO_CONST.bar">Something</div>
</template>

<script>
import {FOO_CONST} from './const.js';

export default {
  data() {
    return {
      FOO_CONST: Object.freeze(FOO_CONST) // this makes vue not reactive this data property
    }      
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)


iSW*_*ORD 7

在 Vue 3 中,您可以使用setup()

例子:

<template>
  <div>
    hello {{ fooConst }}
  </div>
</template>

<script>
const fooConst = "bar";

export default {
  setup() {
    return {
      fooConst,
    }
  },
}
</script>
Run Code Online (Sandbox Code Playgroud)

或完全使用 Composition API:

<script setup>
const fooConst = "bar";
</script>

<template>
  <div>
    hello {{ fooConst }}
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)