Мне интересно, какой самый эффективный способ передать константу в шаблон. В настоящее время я использую data, но, насколько я понимаю, его следует в основном использовать для состояния, которое изменяется с течением времени, а Vue добавляет прослушиватели событий к данным. Константы — это просто постоянные значения, которые используются для вывода в шаблонах, они никогда не изменятся в течение всего срока службы приложения.
<template>
<div>
<input type = "radio" name = "color" :value=Colors.GREEN />
<input type = "radio" name = "color" :value=Colors.RED />
</div>
</template>
<script lang = "ts">
import Vue from 'vue';
import Colors from '@/viewmodels/colors';
export default Vue.extend({
name: 'ExampleComponent',
data() {
return () => {
Colors
}
}
})
</script>
Какое определение для Colors? Это перечисление?






Решение зависит от того, изменится ли значение Colors на протяжении жизненного цикла вашего компонента. Если это не изменится, просто используйте вычисляемое свойство:
Vue.config.devtools = false;
Vue.config.productionTip = false;
const Colors = {
GREEN: '#0F0',
};
Vue.component('ExampleComponent', {
name: 'ExampleComponent',
template: `
<div>
Value: <span style = "color:${Colors.GREEN}">{{ Colors.GREEN }}</span>
</div>
`,
computed: {
Colors: () => Colors
}
})
new Vue({
el: '#app',
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
<example-component />
</div>Если вы планируете изменить его (на основе взаимодействия с пользователем или сценария), поместите его в data():
Vue.config.devtools = false;
Vue.config.productionTip = false;
const Colors = {
GREEN: '#0F0',
};
Vue.component('ExampleComponent', {
name: 'ExampleComponent',
template: `
<div>
Value: <span :style = "{color: Colors.GREEN}">{{ Colors.GREEN }}</span>
<button @click = "changeColors">Change Colors</button>
</div>
`,
data: () => ({
Colors
}),
methods: {
changeColors() {
this.Colors = {
GREEN: 'red'
}
}
}
})
new Vue({
el: '#app',
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
<example-component />
</div>Если вы хотите разрешить пользователю выбирать один из доступных вариантов в Colors, это означает, что содержимое Colors не изменится, поэтому вы будете использовать вычисляемое для Colors вместе с data() для текущего выбранного цвета:
Vue.config.devtools = false;
Vue.config.productionTip = false;
const Colors = {
GREEN: '#090',
RED: '#C00',
BLUE: '#009',
ORANGE: '#F90'
};
Vue.component('ExampleComponent', {
name: 'ExampleComponent',
template: `
<div> Value:
<span
:style = "{color: currentColor, fontWeight: 'bold'}"
v-text = "currentColor" />
<select v-model = "currentColor">
<option
v-for = "(color, key) of Colors"
v-text = "\`\${key}: \${color}\`"
:key = "key"
:value = "color" />
</select>
</div>
`,
data: () => ({
currentColor: Colors.GREEN
}),
computed: {
Colors: () => Colors
},
methods: {
setColor(color) {
this.currentColor = color;
}
}
})
new Vue({
el: '#app',
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
<example-component />
</div>Вы обновили свой вопрос с помощью флажков. Поэтому я добавил пример с использованием как флажков, так и радио, в зависимости от того, что может понадобиться:
Vue.config.devtools = false;
Vue.config.productionTip = false;
const Colors = {
GREEN: '#090',
RED: '#C00',
BLUE: '#009',
ORANGE: '#F90'
};
Vue.component('ExampleComponent', {
name: 'ExampleComponent',
template: `
<div> checkedColors:
<label v-for = "(color, key) of Colors"
:key = "key">
<input name = "color"
type = "checkbox"
:value = "color"
v-model = "checkedArray">
<span v-text = "color" :style = "{color}" />
</label>
<hr>
pickedColor:
<label v-for = "(color, key) of Colors"
:key = "color">
<input name = "picked"
type = "radio"
:value = "color"
v-model = "picked">
<span v-text = "color" :style = "{color}" />
</label>
<hr>
<pre>checkedArray: {{ stringify(checkedArray) }}</pre>
<pre>picked: {{ picked }}</pre>
</div>
`,
data: () => ({
checkedArray: [],
picked: Colors.GREEN
}),
computed: {
Colors: () => Colors
},
methods: {
stringify(value) {
return JSON.stringify(value, true, 2);
}
}
})
new Vue({
el: '#app',
})<script src = "https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id = "app">
<example-component />
</div>
Возможный дубликат Как я могу использовать const в шаблоне vue?