v-model 最详细解析

大总结   v-model :“searchText”就是 

:value="searchText" @input="searchText = $event.target.value" 

  或者

:model-value="searchText"
@update:model-value="searchText = $event"   

总之,v-model就是为了 监听input的值变化时,把data:searchText 修改了,再绑定:searchText然后把input的value 修改。

什么是v-model双向绑定   ?v-model本质上是一个语法糖。  :value=“aaa”  里:value用作改变input里面的值。

要注意,v-model用在input和用在组件上是不一样的。

当用在组件上时,v-model 则会这样:

<custom-input
  :model-value="searchText"
  @update:model-value="searchText = $event"
></custom-input>

 上面的代码可以简写成这样:

<custom-input v-model="searchText"></custom-input>
app.component('custom-input', {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  template: `
    <input
      :value="modelValue"
      @input="$emit('update:modelValue', $event.target.value)"
    >
  `
})

工作原理:当子组件(custom-input)里的input被修改时,触发 @input="$emit('update:modelValue', $event.target.value)",父组件监听到@update:model-value事情后,触发searchText = $event,(其中$event=$event.target.value )。父组件通过  :model-value="searchText"获取到了变量searchText再传入子组件,子组件再通过props: ['modelValue']接受,最后:value="modelValue"成功修改input。

总之:先是 input触发事件,父组件监听到事件,再修改父组件的date:searchTex,父组件再把searchTex传入子组件,子组件才获取prop,然后:v-bind:prop 修改input值。

还有一点要注意:

$emit('enlargeText', 0.1)

当在父级组件监听这个事件的时候,我们可以通过 $event 访问到被抛出的这个值:

<blog-post ... @enlarge-text=" 1 += $event"></blog-post>

或者,如果这个事件处理函数是一个方法 

<blog-post ... @enlarge-text="onEnlargeText"></blog-post>

那么这个值将会作为第一个参数传入这个方法:

methods: {
  onEnlargeText(enlargeAmount) {
    this.postFontSize += enlargeAmount
  }
}

总结 : 父组件接受子组件$emit('enlargeText', 0.1) 第二个参数时,在组件上可以通过$event拿到,也可以在触发的方法的第一个参数里拿到 method(0.1 )。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
v-model 是 Vue.js 中常用的一个指令,它可以在表单元素上创建双向数据绑定。在 Vue.js 中,指令是一种特殊的属性,用于添加特定的行为。v-model 指令实际上是一个语法糖,它将表单元素的 value 属性绑定到 Vue 实例中的数据对象的一个属性上,并且在用户输入时自动更新这个属性的值。 下面是一个简单的示例: ```html <input type="text" v-model="message"> ``` 上述代码中,v-model 指令将输入框的值与 Vue 实例中的 message 属性进行双向绑定。当用户在输入框中输入内容时,message 属性的值会自动更新,反之亦然。 接下来,我们来深入分析 v-model 的源码实现。 首先,我们需要了解 v-model 在编译阶段是如何被解析的。在 Vue.js 中,编译阶段会将模板代码解析为抽象语法树(AST)。当编译器遇到 v-model 指令时,它会将它解析为一个对象: ```javascript { name: 'model', rawName: 'v-model', value: 'message', expression: '"message"', arg: null, modifiers: {} } ``` 在这个对象中,name 属性表示指令的类型,value 属性表示指令绑定的值,expression 属性表示值的表达式,arg 属性表示指令的参数,modifiers 属性表示指令的修饰符。 接下来,编译器会根据指令的类型和绑定的值生成对应的代码,这些代码会在运行时执行,从而实现指令的功能。对于 v-model 指令,编译器会生成以下代码: ```javascript { key: "value", expression: `message`, arg: null, mode: 'twoWay', directive: 'model', modifiers: {} } ``` 这段代码中,key 属性表示绑定的属性名,expression 属性表示绑定的属性值,mode 属性表示数据绑定的模式,directive 属性表示指令的类型,modifiers 属性表示指令的修饰符。 在运行时,Vue.js 会在组件渲染过程中对这些指令进行解析和处理。对于 v-model 指令,Vue.js 会根据指令的模式(单向绑定或双向绑定)生成对应的数据绑定代码。对于单向绑定,Vue.js 会在组件初始化时将属性值赋给表单元素的 value 属性。对于双向绑定,Vue.js 会在表单元素的 input 和 change 事件中更新属性值。 下面是一段简化版的 v-model 指令处理代码: ```javascript function bindModel(el, binding, vnode) { const value = binding.value const mode = binding.mode || 'oneWay' const key = binding.key || 'value' if (mode === 'oneWay') { el.value = value } else if (mode === 'twoWay') { el.value = value el.addEventListener('input', () => { vnode.context[key] = el.value }) } } Vue.directive('model', { bind: bindModel, update: bindModel }) ``` 在这段代码中,bindModel 函数用于处理 v-model 指令。它首先获取指令的 value、mode 和 key 属性,然后根据 mode 属性判断数据绑定的模式。如果是单向绑定,直接将属性值赋给表单元素的 value 属性;如果是双向绑定,同时绑定 input 事件,当用户输入时更新属性值。最后,Vue.js 会将这个指令注册到指令系统中,以便在组件渲染时自动调用。 总的来说,v-model 指令的实现原理其实很简单,就是通过数据绑定来实现表单元素和数据对象之间的双向绑定。但是,在实际开发中,还有很多细节需要注意,比如不同表单元素的处理方式、不同数据类型的转换等等。因此,如果想要深入理解 v-model 指令的实现原理,需要对 Vue.js 的组件渲染机制有比较深入的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值