(原创)vue中v-model的高级用法(多用于组件封装)

28 篇文章 2 订阅
18 篇文章 0 订阅

input中使用v-model

先从最基础的使用说起,input中使用v-model完成双向绑定的原理:
v-bind:value的数据绑定和@input的事件监听;

<input v-model="message" />
<!-- 相当于  -->
<input :value="message" @input="message = $event.target.value" />

组件中使用v-model

对比input元素不同的只是属性的名称和事件触发的名称而已,固定用法,默认的属性为model-value,方法为update:model-value!

<my-input v-model="message" />
<!-- 相当于  -->
<my-input :model-value="message" @update:model-value="message = $event" />

具体的使用方法如下:
使用这种方法主要是代码优雅并且整洁,如下子组件就不需要再传递到父组件就行值的修改。

<!-- App.vue -->
<my-input v-model="msg1"></my-input>
<template>
  <div>
    <input type="text" :value="modelValue" @input="input">
  </div>
</template>

<script>
  export default {
    props: {
      modelValue: String
    },
    methods: {
      input(e) {
        this.$emit('update:modelValue', e.target.value)
      }
    },
  }
</script>

升级 —— 使用计算属性的setter和getter来完成。

众所周知,子组件不能随意修改父组件传递下来的数据(props),因此可以通过计算属性来更新数据。

<template>
  <div>
    <input type="text" v-model="value">
  </div>
</template>

<script>
  export default {
    props: {
      modelValue: String
    },
    computed: {
        value: {
            get() {
                return this.modelValue
            },
            set(value) {
                this.$emit('update:modelValue', value)
            }
        }
    }
  }
</script>

再升级 —— 绑定多个属性(可以给v-model传入一个参数,那么这个参数的名称就是我们绑定属性的名称)

v-model:title相当于做了两件事:①绑定了title属性;②监听了 @update:title的事件;

<!-- App.vue -->
<my-input v-model="msg" v-model:title="title"></my-input>
<template>
  <div>
    <input type="text" :value="modelValue" @input="input">
    <input type="text" :value="title" @input="input1">
  </div>
</template>

<script>
  export default {
    props: {
      modelValue: String,
      title: String
    },
    methods: {
      input(e) {
        this.$emit('update:modelValue', e.target.value)
      },
      input(e) {
        this.$emit('update:title', e.target.value)
      }
    },
  }
</script>

以上就是组件中v-model的基本用法,但是一般用的比较多的是弹窗中,如下实例!

实例:控制弹窗显隐

需求:在父组件可以点击打开弹窗,子组件点击关闭弹窗
在这里插入图片描述

<!-- 父组件 -->
<modal v-model:showModal="showModal"></modal>
<button @click="showModal=true">打开弹窗</button>
<!-- modal.vue -->
<template>
  <div class="bg" v-if="showModal">
    <div class="modal">
      那个男人他来了,他真的来了 <br>
      <button @click="close">关闭弹窗</button>
    </div>
  </div>
</template>

<script>
  export default {
    props: {
      showModal: {
        type: Boolean,
        default: false
      }
    },
    methods: {
      close() {
        this.$emit('update:showModal', false)
      }
    },
  }
</script>

以上就是v-model在组件中的高级用法,有何错误或拓展,望提出~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值