v-model和.sync详解和区别

一、v-model

介绍

vue中一般用于表单绑定值的时候,我们会用到一个v-model的指令,它可以在表单以及元素上面创建双向绑定数据。

原理

但是其实 v-model 是一个[语法糖],应用于组件,它真实的实现是这样的。

<input v-model="val" type="text">
//本质
<input :value="val"  @input="val=$event.target.value" />

代码理解:首先你要知道 input 元素本身有个input 事件,这是 HTML5 新增加的,类似 onchange ,每当输入框内容发生变化,就会触发 input 事件,把最新的value值传给传递给val ,完成双向数据绑定的效果 。

使用

父子组件之间数据的双向绑定

//  parent组件,也就是我们的父组件
<template>
  <div>
    <son v-model="name"/>
  </div>
</template>
<script>
import son from './son.vue'  
export default {
  components: {son},
  data() {
    return {
      name:"父组件"
    }
  }
}
// son 组件,也就是我们的子组件
<template>
  <div>
    {{ value }} 
    // 父组件绑定的v-model的值
  </div>
</template>
<script>
export default {
// 这里必须用value名称,换成其他的无效
  props: {
    value: {
      type:String,
      required: true
    }
  }
}

注意:由于vue是单向数据流的,所以我们不能在子组件中直接修改value值,根据我们的经验,一般我们会通过在子组件中使用$emit('input',值)的方法将值传入父组件。

<template>
  <div>
    <div @click="$emit('input','更改的值')"></div>
  </div>
</template>

二、.sync

介绍

.sync修饰符可以实现子组件与父组件的双向绑定,并且可以实现子组件同步修改父组件的值。

原理

.sync应用于组件,其实是 :属性名 和 @update:属性名 的简写;
如果希望子组件,可以直接通过触发事件,就更新prop值,就可以添加 sync 修饰符

<mySon :name="money" @update:name="name= $event"></mySon> 
<mySon:name.sync="money" :age.sync="age"></mySon> 
this.$emit('update:name',)
this.$emit('update:age',)
.sync 可以多次使用
// 父组件
<template>
  <div>
    <my-son :name.sync="name" /> 
  </div>
</template>
<script>
import mySon from "./components/mySon.vue"
export default {
  components: {
    mySon
  },
  data () {
    return {
      name: '父组件内容',
      age:18
    };
  },
}
</script>
// 子组件
<template>
  <div @click='changeName'>
    {{name}}
  </div>
</template>
<script>
export default {
  props: {
    name: {
      type: String,
      default: ''
    },
    age: {
      type: Number,
      default: ''
    },
  },
  methods: {
    changeName () {
      this.$emit('update:name', '更改的内容')
      this.$emit('update:age', '更改的内容') 
    }
  },
}
</template>

三、v-model与.sync区别

1.相同点:都是语法糖,都可以实现父子组件中的数据的双向通信。
​ 区别在于往回传值的时候. sync 的 $emit 所调用的事件名必须是`update:属性名。
2.格式不同:v-model=“num”, :num.sync=“num”
​ v-model: @input + value
​ :num.sync: @update:num
3.v-model只能用一次;.sync可以有多个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值