在说Vue3中的v-model之前,让我们先来看一下Vue2中的v-model是怎么样的。
1.Vue2中v-model的应用场景
<template>
<div>
<div>v-model指令</div>
<hr>
<div>{{uname}}</div>
用户名:<input type="text" v-model='uname'>
<!-- v-model的本质是属性绑定和事件绑定的结合 -->
<input type="text" :value='uname' @input='uname=$event.target.value'> -------(*)
<!-- ---------------------------------------------------------------- -->
<!-- v-model也可以使用到组件上 -->
<my-com v-model='info'></my-com>
<!-- 此时 $event表示子组件传递的具体数据 this.$emit('input', 100) -->
<my-com :value='info' @input='info=$event'></my-com>
<!-- Vue2中$event有两层含义 -->
<!-- 1. 如果是原始DOM的事件,那么$event表示js的原生事件对象 -->
<!-- 2、如果是组件的自定义事件,那么$event是$emit传递的数据 -->
</div>
</template>
<script>
import { ref } from 'vue'
export default {
name: 'App',
setup () {
const uname = ref('tom')
return { uname }
}
}
</script>
复制代码
对于上述代码中(*)部做出说明
$event是指当前触发的事件(鼠标事件,键盘事件等)
$event.target则指的是事件触发的目标,即哪一个元素触发了事件,这将直接获取该dom元素
复制代码
<button @click=”console.log($event)” name=”哈哈”>单击
总结:Vue2中v-model的应用场景
- 用到表单元素上:$event表示事件对象
- 用到组件上:$event表示子组件传递的数据
- Vue3中v-model新的特性
- v-model的本质是 :modelValue 和 @update:modelValue 两者的绑定
<template>
<div>
<div>v-model指令用法-Vue3</div>
<hr>
//1.在模板中显示
<div>{{info}}</div>
<!-- <TestEvent v-model='info' /> -->
<TestEvent :modelValue='info' @update:modelValue='info=$event' />
</div>
</template>
<script>
import TestEvent from './TextEvent.vue'
import { ref } from 'vue'
export default {
name: 'App',
components: { TestEvent },
setup () {
const info = ref('hello')
return { info }
}
}
</script>
复制代码
<template>
<div>
子组件 {{modelValue}}
</div>
<button @click='handleEdit'>点击</button>
</template>
<script>
export default {
name: 'TestEvent',
props: {
// Vue3中,v-model默认绑定的属性名称是modelValue
modelValue: {
type: String,
default: ''
}
},
setup (props, context) {
const handleEdit = () => {
// props.modelValue = 'nihao'
// 通知父组件修改数据
// .sync修饰符:update:绑定的属性名称
context.emit('update:modelValue', 'nihao')
}
return { handleEdit }
}
}
</script>
复制代码
- v-model可以使用多次
<template>
<div>
<div>v-model指令用法-Vue3</div>
<hr>
<div>{{info}}</div>
<div>{{msg}}</div>
<!-- v-model提供了一种双向绑定机制(在组件上-父子之间的数据交互) -->
<!-- .sync修饰符已经被废弃,替代方案是v-model -->
<!-- <TestEvent v-model='info' :msg.sync='msg' /> -->
<TestEvent v-model:modelValue='info' v-model:msg='msg' />
<!-- <TestEvent :modelValue='info' @update:modelValue='info=$event' /> -->
</div>
</template>
<script>
import TestEvent from './TextEvent.vue'
import { ref } from 'vue'
export default {
name: 'App',
components: { TestEvent },
setup () {
const info = ref('hello')
const msg = ref('hi')
return { info, msg }
}
}
</script>
复制代码
<template>
<div>
子组件 {{modelValue}}
</div>
<button @click='handleEdit'>点击</button>
</template>
<script>
export default {
name: 'TestEvent',
props: {
// Vue3中,v-model默认绑定的属性名称是modelValue
modelValue: {
type: String,
default: ''
},
msg: {
type: String,
default: ''
}
},
setup (props, context) {
const handleEdit = () => {
// props.modelValue = 'nihao'
// 通知父组件修改数据
// .sync修饰符:update:绑定的属性名称
context.emit('update:modelValue', 'nihao')
context.emit('update:msg', 'coniqiwa')
}
return { handleEdit }
}
}
</script>
复制代码
总结:
- v-model可以通过绑定多个属性的方式,向子组件传递多个值并且保证双向绑定
- 可以替代Vue2中sync修饰符(sync修饰符在Vue3中已经被废弃)
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END