Vue笔记-工作空闲时间-v-model

171 阅读2分钟

v-model

v-model是什么?

v-model是Vue中用于在表单输入、选择和其他元素上创建双向数据绑定的指令。它可以根据不同的输入类型自动选取正确的方法来更新元素。

用法

1.基本使用

对于简单的输入框,v-model可以直接绑定到一个数据属性上:

<input v-model="message" />

2.自定义组件中的v-model

在自定义组件中使用v-model时,默认情况下它会将值绑定到名为valueprop,并监听input事件来更新父组件的数据。 Father.vue

<template>
    <div class="father">
        <SonComponent v-model="message" />
        message:{{ message }}
    </div>
</template>

<script>
import SonComponent from './SonComponent.vue'
export default {
    components: { SonComponent },
    data() {
        return {
            message: '',
        }
    },
}
</script>

<style scoped></style>

Son.vue

<template>
    <div class="son">
        <input type="text" :value="value" @input="$emit('input', $event.target.value)" />
    </div>
</template>

<script>
export default {
    props: ['value'],
    data() {
        return {}
    },
}
</script>

<style scoped></style>

3.修改默认行为

可以自定义指定双向绑定的属性名和事件

Father.vue

<template>
    <div class="father">
        <SonComponent v-model="message" />
        message:{{ message }}
    </div>
</template>

<script>
import SonComponent from './SonComponent.vue'
export default {
    components: { SonComponent },
    data() {
        return {
            message: '',
        }
    },
}
</script>

<style scoped></style>

Son.vue

<template>
    <div class="son">
        <input type="text" :value="message" @input="$emit('updateMessage', $event.target.value)" placeholder="名字" />
    </div>
</template>

<script>
export default {
    model: {
        prop: 'message',
        event: 'updateMessage',
    },
    props: ['message'],
    data() {
        return {}
    },
}
</script>

<style scoped></style>

注意:Vue2只能通过v-model双向绑定一个数据,Vue3可以通过modelValue属性和update:modelValue事件来改变默认行为

v-model的原理

v-model原理其实是背后有两个操作:

  • v-bind绑定value属性的值
  • v-on 绑定input事件监听到函数中,函数会获取最新的值,赋值给绑定的属性中

image.png

v-model 是单向数据流吗

是的,因为父组件可以向子组件传递数据,而子组件不能改变父组件传递给它的prop属性,官方推荐的做法是它抛出事件,通知父组件自行改变绑定的值。

v-model和.sync的区别

首先Vue3已经不推荐使用.sync修饰符了,所以主要区别体现在vue2中

1.使用场景不同:

  • v-model主要用于输入类组件,如<input/>
  • .sync适用于任何类型的数据同步

2.实现机制不同:

  • v-model:内部基于value自定义属性和@input事件实现,父组件通过value属性向子组件传递,子组件通过触发@input事件通知父组件更新值
  • .sync:父组件为子组件的属性创建一个对应的更新事件监听器(update:propName),当子组件发送这个事件时,父组件就会更新相应的属性值。

3.语法差异