1. Vue3相较于Vue2的变化
Vue3作为前端框架的一次升级,相较于Vue2在性能优化、API设计、开发体验等方面都有所提升。除了改进原有特性之外,Vue3还新增了一些特性,其中比较重要的是丰富的内置指令。
2. 新增的内置指令
2.1 v-model指令
Vue2中的v-model指令存在一些使用上的瑕疵,如只适用于表单元素、针对自定义组件需要进行额外的适配等,Vue3中对这些问题做出了一些优化。
首先是v-model支持自定义组件的情况。在Vue2中,如果想要在自定义组件上使用v-model,需要通过prop和emit两个属性进行适配。而在Vue3中,可以通过在自定义组件中添加一个model选项,以达到v-model的效果:
// 在自定义组件的选项中添加 model 选项即可
app.component('MyComponent', {
// new v-model API
props: {
modelValue: String,
// !!! 注意名字后缀会被自动识别为事件,不要在 modelValue 名字后面添加 $ 前缀
updateModelValue: Function
},
emits: ['update:modelValue'],
template: `
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
`
});
此外,v-model在Vue3中还可以在非表单元素上使用,甚至可以使用自定义的值的类型:
<!-- 自定义的实时类型转换 -->
app.directive('model', {
created(el, binding) {
if (!binding.modifiers.lazy) {
el.addEventListener('input', () => {
const selected = binding.value
.split('.')
.reduce((o, i) => o[i], el.$model);
selected[binding.arg] = el.valueAsNumber || el.value;
});
} else {
el.addEventListener('change', () => {
const selected = binding.value
.split('.')
.reduce((o, i) => o[i], el.$model);
selected[binding.arg] = el.valueAsNumber || el.value;
});
}
}
});
// 使用自定义 model 指令
<template>
<div>
<div class="progress">
<div class="progress-bar" role="progressbar"
:rent="value.width"
model="step1.width">
{{ step1.width + '%' }}
</div>
</div>
<input v-model.lazy="step1.width" type="range" name="width" id="width" min="0" max="100">
</div>
</template>
2.2 v-bind指令
在Vue3中,v-bind指令也进行了一些改进,使得其具有更加灵活的应用场景。
首先是在绑定对象属性时的能力,Vue3中可以将一个对象不加限制地绑定到一个元素的多个属性上:
// Vue3
<template>
<div :style="{color: color, fontSize: fontSize}">
Color: {{ color }}, Font size: {{ fontSize }}
</div>
</template>
// Vue2
<template>
<div :style="{color: color} :font-size="fontSize">
Color: {{ color }}, Font size: {{ fontSize }}
</div>
</template>
同时,在Vue3中也增强了对class和style对象属性的支持,可以用在更多的场景中:
// Vue3
<template>
<div :class="[{'text-right': isRightAligned, 'text-first': isFirstClass}]">
{{ content }}
</div>
</template>
// Vue2
<template>
<div :class="{'text-right': isRightAligned, 'text-first': isFirstClass}">
{{ content }}
</div>
</template>
3. 总结
Vue3在内置指令方面进行了多次改进,使得开发者能够在开发过程中更加灵活地使用Vue的特性。尽管说v-model和v-bind两个指令在Vue2中已经非常出色,但是Vue3在这两个指令基础上进行了升级,让其应用范围更广泛、使用更加灵活方便,在Vue3中学习和使用内置指令将会更加愉快!