木灵鱼儿
阅读:438
vue3 v-model
在vue2的时候,v-model和.sync
修饰符在职能上是一样的,容易混淆,在vue3时做了统一,为此移除了.sync
修饰符,以及组件内的model
选项,新增了可以多个v-model的使用方式。
我们先看看vue2的v-model写法:
<ChildComponent v-model="pageTitle" />
<!-- 等同于 -->
<ChildComponent :value="pageTitle" @input="pageTitle = $event" />
model选项
export default {
model: {
prop: 'title',
event: 'change'
},
props: {
title: {
type: String,
default: 'Default title'
}
},
methods: {
onClick() {
this.$emit("change", "xxx");
}
}
}
<ChildComponent v-model="pageTitle" />
使用.sync
其实也差不多,只是不用v-model了
<ChildComponent :title.sync="pageTitle" />
export default {
props: {
title: {
type: String,
default: 'Default title'
}
},
methods: {
onClick() {
this.$emit("update:title", "xxx");
}
}
}
由于职能都差不多,很容易造成使用上的混乱,或者有的人要么不使用,要么就是乱用,vue3对这个地方进行了调整。
下面是vue3的写法:
<ChildComponent v-model="pageTitle" />
<!-- 等同于: -->
<ChildComponent
:modelValue="pageTitle"
@update:modelValue="pageTitle = $event"
/>
首先是默认绑定的值由原来的value
改为modelValue
,默认使用的input
事件也改为update:modelValue
,从这里就可以看出,其实vue3就是将model与sync进行融合了。
除了默认的用法,还可以像sync
那样,实现多个model绑定,其格式如下:
v-model:propName="pageTitle"
model后面接一个参数用于表示绑定的prop值,还是很好理解的。
<ChildComponent v-model:title="pageTitle" v-model:content="pageContent" />
<!-- 等同于: -->
<ChildComponent
:title="pageTitle"
@update:title="pageTitle = $event"
:content="pageContent"
@update:content="pageContent = $event"
/>
使用了参数后,会默认生成一个@update:propName
的自定义事件,个人建议是这个事件自己手动在组件的emits
中再声明一下。
<script>
export default {
props: ['title', 'content'],
emits: ['update:title', 'update:content'],
}
</script>
虽然说不声明emits也能用就是了。
input的model
上述所说的都是针对组件形式的model绑定,如果是input这些表单元素,其实还是会按照vue2的那种形式:
<input v-model="searchText" />
<!-- 等同于 -->
<input
:value="searchText"
@input="searchText = $event.target.value"
/>
只有在组件的时候value会被转为modelValue
,事件input转为update:modelValue
。
修饰符
vue2之前是无法在model绑定的时候使用自定义修饰符的,现在vue3支持了,使用方式稍微有点奇怪,但是官方文档已经有很详细的用法了,这里就自行查看文档吧!
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。
相关推荐
vue-router4 新增功能
动态路由这个其实在3版也有,不过3版原来使用的api是addRoutes,这个api顾名思义,就是可以传入一个路由数组来进行注册,后来被废弃,现在3版和4版统一采用addRouteapi。addRoute一次只能添加一个路由,但是有两种用法:添加一条新路由router.addRoute({ path: "/about", name: "About", component: () => import("../views/About.vue"), })给已存在的路由注册一个子路由,父路由必须有name属性route...
vue-router4 一些常见配置的改动
创建路由实例方式改变3版本的时候是通过new的方式创建路由实例,4版本是改用了createRouter的方式:import { createRouter } from 'vue-router' const router = createRouter({ // ... })路由模式配置改变3版本路由模式是由mode属性控制,值为字符串,现在通过import引入不同函数来创建不同的路由模式:"history"改为createWebHistory()"hash"改为createWebHashHistory()"abstract"...
vue3 filter过滤器
vue3直接移除了filter过滤器,官方推荐,如果要使用过滤器可以使用computed计算属性和method函数来代替。如果使用了全局过滤器,官方也提供了一个属性来进行迁移修复,但是也只推荐用于迁移。const app = createApp(App) //给当前app的全局属性上挂载一个过滤器对象 app.config.globalProperties.$filters = { currencyUSD(value) { return '$' + value } }使用的时候:<template> <h1>Bank Account Bala...
vue3 keyCode修饰符
vue2我们在监听按键事件的时候,是可以通过在事件后面加上按键码来实现监听某一个按键的。<input @keyup.13="submit" />甚至我们还可以使用按钮别名alias的方式调用<input @keyup.enter="submit" />还可以全局自定义别名,通过Vue.config.keyCodes属性。Vue.config.keyCodes = { f1: 112 }随着ECMAScript的标准推荐,官方已经不推荐使用keyCode键码了,这个功能在js的官方定义上是一个已弃用的状态,最新的标准是使用...
vue3 取消$on、$off、$once
在vue2的时候,我们可以通过$on、$off、$once、$emit来实现一个事件总线EventBus,但是vue3的时候,又换了一套逻辑思想。官方不鼓励使用EventBus在组件之间进行通信,虽然短期内确实是非常简单的解决方案,但是从长远来看,它总是很难维护的,所以官方更加推荐使用其他方式:父子组件之间可以通过Props和自定义事件来进行沟通,如果是兄弟组件,可以通过父级组件来沟通使用Provide / inject方式来跨层级沟通,比如与插槽的内容组件。Provide / inject也可以用于跨层级沟通,以避免props,emit事件层级过深的问题通过使用插槽的形式来避免层级沟通...
vue3 transition、watch、挂载api的变化
transition动画的变化就是vue3调整了一下动画类名,原来vue2是:.v-enter{ opacity: 0; } .v-leave{ opacity: 1; }这两个在vue3中改为:.v-enter-from{ opacity: 0; } .v-leave-to{ opacity: 1; }其相关属性也对应发生了变化:leave-class被重命名为 leave-from-class(可以写成 leaveFromClass在渲染函数或 JSX 中)enter-class被重命名为 enter-from-class(可以写成 enterFromClass在...
vue3 自定义指令
vue3将自定义指令的生命钩子函数全部改为与组件的生命钩子函数相同,原来vue2时,自定义指令的生命钩子是一套完全不同的,但是也正因为如此,它的钩子函数有点晦涩难懂,这次统一了我觉得是一件非常好的事情,让我们的记忆力压力减轻了很多,也方便了我们的理解。vue3写法:const myDirective = { // 在绑定元素的 attribute 前 // 或事件监听器应用前调用 created(el, binding, vnode, prevVnode) { // 下面会介绍各个参数的细节 }, // 在元素被插入到 DOM 前调用 beforeMoun...
vue3 异步组件
书接上文,我们的函数式组件在vue3里只能声明一个函数再通过h函数组合处理,然后导出使用,你会发现这个组件是一个函数类型。然后我再去看一下vue2时,我们的异步组件引入方式:const asyncModal = () => import('./Modal.vue')你会发现除了异步组件也是一个函数类型,这就尴尬了,怎么区分呢?vue3提供了一个defineAsyncComponent函数用于区分异步组件。import { defineAsyncComponent } from 'vue' const asyncModal = defineAsyncComponent(() =>...
vue3 函数式组件 functional
由于vue3对dom的渲染做了优化,优化了diff算法,在vue2时不管元素是否参与更新,都会被重新创建,vue3则针对不参与更新的元素,打上一个静态标记,此时这个元素只会创建一次,后续的渲染更新则不会重新创建。于是函数式组件在vue3中性能的提升可以忽略不计,于是functional组件的声明被移除,不在支持:template中不能再写上functional来表示函数式组件vue组件中的{ functional: true }选项也被删除但是,这也并不意味着无法创建函数式组件了,vue3也有提供创建的方式,但是需要引入h函数。创建一个js组件:_test.js_import { h }...