v-modal和.sync的区别

172 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

前言

在外面平时日常开发中,有一个指令是我们高频率使用的,就是v-modal,常用于各种input和select及其各种表单做双向数据的绑定,但是本质上它是一个语法糖,除此之外还有一个语法糖就是.sync,它也是做双向数据绑定的一个语法糖。那我们来认识有什么区别吧

认识v-modal

熟知vue框架的都知道v-modal是一个平常到不能再平常的指令来,但是取可以为我们的开发带来极大的效率。

<template>
   <div>
       <input type="text"  v-modal="val"> //重新键入会修改data中的值
   </div>
</template>

<script>
  export default{
     name:"a",
     data(){
         return{
             val:""//这里的值就会修改
         }
     }
  }

</script>

只要我们去修改input的值,data中的值自然就会修改。以前就是直接去操作dom获取的这个值,那这个是怎么做的呢? v-modal借助了输入框的原生事件input事件,只要值被修改了,就会触发input事件从而拿到最新的值:

<template>
   <div>
       <!-- <input type="text"  v-modal="val"> -->
       <input type="text" :value="val" @input="val=$event.target.value">
   </div>
</template>

<script>
  export default{
     name:"a",
     data(){
         return{
             val:""
         }
     }
  }

</script>

这种是标签自身提供了input事件或者其它能够捕获到值的改变的语法糖,但是很多是不支持的。

除吃之外还有绑定父子之间的数据,相信这也是一种高频率的开发技巧。

a.vue
<template>
   <div>
       <!-- <input type="text"  v-modal="val"> -->
       <!-- <input type="text" :value="val" @input="val=$event.target.value"> -->
       <b v-modal="val"></b>
   </div>
</template>

<script>
import b from './a.vue'
  export default{
     name:"a",
     components:{
       b
     },
     data(){
         return{
             val:""
         }
     }
  }

</script>

b.vue
<template>
   <div>
      {{value}}
   </div>
</template>

<script>
  export default{
     name:"a",
     props:['value'],
     data(){
         return{
             val:""
         }
     }
  }

</script>

将a组件作为父组件,b组件作为子组件,并在a组件定义的组件b上加v-modal,传入val值,但是在b组件中必须使用value来接收这个值,然后我们在b组件中进行展示。但是在b组件里面进行修改value会报错,这种只是单向数据流,为此vue给我们提供了一个$emit,它可以帮助我们在子组件中暴露一个方法,将至传送到父组件中,然后在父组件中使用v-on定义一个函数接收这个值,但是还有一个新的方式就是使用.sync,上面我们收到它也是一个语法糖。

.sync

.sync也是一个语法糖,原本我们需要重新定义一个$emit事件暴露给父组件,但是.sync可以帮助我们省去这步操作:

<template>
   <div>
       <!-- <input type="text"  v-modal="val"> -->
       <!-- <input type="text" :value="val" @input="val=$event.target.value"> -->
       <b v-modal.sync="val"></b>
   </div>
</template>

<script>
import b from './a.vue'
  export default{
     name:"a",
     components:{
       b
     },
     data(){
         return{
             val:""
         }
     }
  }

</script>

只需要在v-modal处加上.sync即可,它和这种写法并无二致:

<template>
   <div>
       <!-- <input type="text"  v-modal="val"> -->
       <!-- <input type="text" :value="val" @input="val=$event.target.value"> -->
       <b v-modal="val" @update:a="value=>val = value"></b>
   </div>
</template>

<script>
import b from './a.vue'
  export default{
     name:"a",
     components:{
       b
     },
     data(){
         return{
             val:""
         }
     }
  }

</script>

这两个的语法的共同点就是都是语法糖,都能够实现数据双向绑定和组件之间的数据绑定,区别点就是写法不同和所依赖的不同,一个是$emit,一个是input事件。