每日探究No.1——Vue3中v-model数据双向绑定的变化?

126 阅读5分钟

我们知道,v-model是v-bind+v-on的语法糖,

在Vue2,v-model="数据" <=>:value="数据"+@input="数据=$event"

在Vue3,v-model:属性="数据" <=> :属性="数据" + @update:属性="数据=$event"

注释:以上为直观变化,以下为变化缘由和详细解释

思想:只需要把唯一变为活性,再加一个默认值作为保障(只能绑定固有属性改为提供一个默认值,此外由开发者自定义属性名)

Vue2中组件value不能有多个是导致v-model只能绑定一个数据的原因

对的,在Vue3中,v-model的使用发生了一点变化,为了能够直接通过v-model实现多数据绑定,Vue3将Vue2中数据只有唯一属性value可绑定的规定,活性变为自定义数据绑定的属性,而规定数据默认绑定的属性为modelValue,开发者可以为数据绑定的属性自定义其它任意名字。它将唯一绑定变为可扩展,取消了:属性.sync的冗余的(Vue2)旧版多数据绑定功能。

数据的更新事件从Vue2中绑定【input事件】替换为了绑定【update:属性事件】

通过v-model:属性的语法,能够每次使用一个v-model就实现一个数据的双向绑定

思想-一句话总结:只能绑定固有属性value改为提供一个默认值modelValue,此外由开发者自定义与数据绑定的属性名。

注解:

上述总结中,数据指的是响应式数据

属性指的是自定义属性,是子组件中接到的传参的名字,为保证一般性,为数据绑定到子组件中的属性设置了默认属性名modelValue,则@update:modelValue则作为数据的默认更新事件,

于是,默认情况下使用v-model,等价于:modelValue+@update:modelValue。

@update:属性="数据 = $event":

  • $event:子组件通过update:属性事件抛出的值;
  • 数据:父组件中的响应式变量。
  • @input="数据 = $event"解释同理。

直观理清关系

1.v-model:属性="数据":2+3的语法糖,实现页面可主动修改数据,数据可主动驱动页面;

2.:属性="数据":将数据绑定到属性上;

3.@update:属性="数据=$event":处理属性对应数据的更新;

2+3实现双向绑定,而1等价于2+3。

v-model:属性 是通用语法,若不写:属性,则默认是名为modelValue的属性绑定这个数据,数据默认更新事件为@update:modelValue。

严谨注意:双向数据绑定是属性绑定响应式数据,但是更新事件是对于数据的。

v-model带来的便利

Vue3,需要实现双向绑定,不用v-model语法糖需要:

<ChildComponent 
  :modelValue="响应式数据A" 
  :自定义属性名="响应式数据B" 
  @update:modelValue="函数(参数)" 
  @update:自定义属性名="函数(参数)"
/>

使用v-model语法糖则只需要:

<ChildComponent 
  v-model="响应式数据A" 
  v-model:自定义属性名="响应式数据B" 
/>

最后,如果面试问Vue3双向数据绑定v-model的变化?

你回答:其实很简单嘛————————

通常说法就是Vue3的v-model支持多数据双向绑定,然后默认属性和事件变为modelValue和@update:modelValue,但其实这不是准确的说法,只是含糊的概括。

准确来说是,v-model的使用语法变为默认和通用两种方式:

1.默认直接使用v-model双向绑定一个响应式数据,使用组件的modelValue属性来绑定这个数据,使用update:modelValue事件作为这个数据的更新事件,

2.通用就是通过v-model:属性名="数据"的语法,自定义与响应式数据绑定的属性。通过这个语法v-model可以绑定多个响应式数据;

另外要说这个更新事件的内容就是 数据=$event,即响应式数据=组件返回值。

其中为便于理解,我用词称"两种方式",但实际上语法就是v-model:属性="数据",不写:属性则为默认。

3.允许自定义修饰符,

  • 父组件通过<Child v-model:属性.修饰符="数据" />来调用,

  • 子组件中在props{}中定义 属性Modifiers:{ default:()=>({}) }接住,

  • 注意,属性Modifiers是规定命名方式,且是小驼峰。

  • 在属性对应的处理函数中,判断是否存在这个修饰符,有则执行修饰符对应功能来处理事件拿到的新数据,无则正常处理。

  • 通过修饰符,可以给子组件属性数据添加去空格trim、toUpperCase等功能,父组件中能够通过v-model:属性.修饰符轻松使用这些功能。

注意:实际上Vue3为v-model保留了2个内置修饰符,

number:将输入值转换为数字类型

trim:自动去除值收尾的空白字符

这两个修饰符是Vue框架原生支持的,无需额外配置即可在原生表单元素上直接使用。

🥔思想层面:让唯一的value变为动态自定义,从而实现多数据双向绑定。

为什么要知道v-model是谁的语法糖?

在父子通信中,父组件使用子组件,传入一个v-model="数据",那么我们就知道,组件中要接一个modelValue参数了。

另外,大家想不想知道为什么数据绑定要使用响应式数据呢?

我想,问这个问题要不就是没进一步思考,要不就是爱思考,并想找到有新奇理解或相同想法的友友,想知道的话评论区留言,我会在后续揭晓我的理解,大家一起探讨噢~~~

另外,数据绑定和数据响应式对于初学者来说很容易弄混淆,我把它理清楚了,如果有觉得还想看,评论区中讨论吧。

如果觉得我本文讲得还不错,可以给个小小的嘛~~~ 3Q!我是LC_Happy,祝我们都会拥有一个向往的快乐生活!