[vue3进阶] 11.自定义v-model

我们之前学习过,可以使用v-model进行数据的双向绑定,
在input输入框内容变化时,我们的数据同时变化,不用我们去手动赋值

<input type="text" v-model="content" />

v-model这个指令是vue为我们提供的一种语法糖,
下面这种写法和使用v-model是等价的

<input
      type="text"
      :value="content"
      @input="content = $event.target.value"
    />

把数据content绑定到input的value上,然后在input事件发生时,改变content的值
完整的代码

<template>
  <div>
    <input
      type="text"
      :value="content"
      @input="content = $event.target.value"
    />
    <div>{{ content }}</div>
  </div>
</template>

<script>
// 自定义v-model
export default {
  name: 'App',
  data() {
    return {
      content: '',
    }
  },
}
</script>

<style></style>

我们在输入框输入内容时,content的值也变化了,
现在知道了v-model的原理,我们也可以在自定义的组件上使用v-model了

我们在日常开发中,表单的输入框通常会有一个标签label,来提示输入框要输入的内容,



现在我们就来开发一个组件,它包括这个标签和input输入框,并且使用自定义v-model

<template>
  <div>
    <label>{{ label }}</label>
    <input
      type="text"
      :value="modelValue" // 3.把modelValue的值绑定到input的value上
      @input="$emit('update:modelValue', $event.target.value)" // 4.在input事件触发时,发送‘update:modelValue’事件
    />
  </div>
</template>

<script>
export default {
  props: {
    label: {
      type: String,
      default: '',
    },
    modelValue: { // 1.在props中定义一个modelValue,用于绑定在输入框中
      type: String,
      default: '',
    },
  },
  emits: ['update:modelValue'], // 2.在emits中声明‘update:moveValue’,这个事件,表明在这个组件中会触发这个事件
}
</script>

<style></style>

总结下来几点就是:
1.在props中定义一个modelValue(默认必须是这个名字),用于绑定在输入框中
2.在emits中声明‘update:moveValue’,这个事件,表明在这个组件中会触发这个事件,这个emits是vue3新增的,之前也说过,这一步和我们今天自定义v-model的主题没关系
3.把modelValue的值绑定到input的value上
4.在input事件触发时,发送‘update:modelValue’事件

这样,我们的自定义组件myInputItem.vue,就可以使用v-model,
在app.vue中使用

<template>
  <div>
    <myInputItem v-model="content" label="用户名"></myInputItem>
    <div>{{ content }}</div>
  </div>
</template>

<script>
// 自定义v-model
import myInputItem from './components/myInputItem.vue'
export default {
  name: 'App',
  components: {
    myInputItem,
  },
  data() {
    return {
      content: '',
    }
  },
}
</script>

<style></style>

效果如下


关于自定义v-model就说这么多了,其实v-model还有更高级的用法,这里就不介绍了,大家先掌握基础用法就行了,平时开发基本也够用了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容