vue-在组件中使用v-model

一、使用场景

子组件想要使用父组件的值,又想去改父组件的值

二、V-Model的本质

1.给子组件的 value 传个变量

2.监听子组件的input事件,并且把传过来的值赋给父组件的变量

三、关键步骤

1. props 的使用

在自定义的 vue 文件中,声明父组件要向子组件传递的 prop 属性,例如

 props: {// 接收string和number类型的值,myValue: [String, Number],}, 

注意: myValue 这个属性名称是可以自定义的,但 [String, Number] 不能写成字符串 ["String","Number"] ,因为此时它们是构造器,是 js 的全局 api

2. $emit 的使用

$emit 用于向上派发事件,在自定义组件中触发,例如:

methods: {changeInput ($event) {this.$emit('myInput', $event.target.value) },
} 

向上派发myInput事件,这样model监听myInput才有意义: 当输入字符时触发input事件,进而派发触发自定义的myInput事件, 然后model监听myInput,就实现了数据绑定。必须注意,这里的派发事件名myInput必须和model中的event的值相同。

PS: 通过watch监听 input标签的值,然后$emit派发事件,和通过@input派发事件具有一样的效果。只要能达到通信的效果即可,手段是多样的。

3. 关键的 model

model是允许 vue 自定义组件使用v-model的关键,虽然有时我们不显性的使用它,也不影响我们在自定义组件中使用v-model指令,这只是因为被设置默认值。而有的时候,显示的使用,并自定义modelpropevent会有益。这是官网关于model的介绍:

允许一个自定义组件在使用 v-model 时定制 prop 和 event。默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event,但是一些输入类型比如单选框和复选框按钮可能想使用 value prop 来达到不同的目的。使用 model 选项可以回避这些情况产生的冲突。

自定义 model 使用示例:

当我们使用model的默认值的时候valuepropinputevent时,可以省略不写model

model: {prop: 'myValue', // 默认是valueevent: 'myInput', // 默认是input
}, 

四、不使用 model 选项的 v-model

当前🌰 , 我们不对 model 选项进行特殊设置 示例:

1. 父组件 home
<template><home-child v-model="vModelData"></home-child>
</template>

<script>
import HomeChild from './child/HomeChild.vue'
export default {name: 'Home',components: {HomeChild},data () {return {vModelData: 'hello v-model'}}
}
</script> 
2. 子组件homeChild
<template><div class="box"><span>{{ value }}</span><button @click="testVModel">测试v-model</button></div>
</template>

<script>
export default {name: 'HomeChild',props: {value: {type: String,default: ''}},methods: {testVModel () {this.$emit('input', '我是子组件')}}
}
</script> 
3. 效果

点击前

点击后

五、用 model 选项的 组件使用 v-model

1、父组件
<template><div class="home"><h3>输入的实时内容:{{ myValue }}</h3><custom-model v-model="myValue"></custom-model></div>
</template>
<script>
import CustomModel from './CustomModel'
export default {name: 'Home',components: {CustomModel,},data () {return {myValue: ''}},
}
</script> 
2. 子组件
<template><!-- 自定义组件中使用v-mode指令 --><input type="search" @input="changeInput" data-myValue="">
</template>

<script>
export default {name: 'CustomModel',// 当我们使用model的默认值的时候value作prop,input作event时,可以省略不写model。model: {prop: 'myValue', // 默认是valueevent: 'myInput', // 默认是input},props: {// 接收string和number类型的值,// 注意不能是写成字符串["String","Number"],因为此时它们是构造器,是全局变量myValue: [String, Number],},methods: {changeInput ($event) {// 向上派发myInput事件,这样model监听myInput才有意义:当输入字符时触发input事件,// 进而派发触发自定义的myInput事件,然后model监听myInput,就实现了数据绑定this.$emit('myInput', $event.target.value)},}
}
</script> 
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue组件使用v-model指令可以实现父子组件之间的双向数据绑定。在自定义组件使用v-model指令时,可以通过设置model选项来定制prop和event。默认情况下,v-model会将value属性用作prop,将input事件用作event。但是对于某些输入类型,例如单选框和复选框按钮,可能需要使用value prop来实现不同的目的。通过设置model选项,可以避免这些冲突产生的问题。 这样做的好处是可以使自定义组件更加灵活和可配置,允许开发者根据实际需求来自定义组件的双向绑定行为。这种方式可以使组件使用更加直观和便捷,同时也提高了组件的可复用性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue-在组件使用v-model](https://blog.csdn.net/weixin_53312997/article/details/126478859)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue的v-model原理,与组件自定义v-model详解](https://download.csdn.net/download/weixin_38687199/12924408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值