Vue修饰符sync
前言:请在 PC 浏览器下获得最佳阅读体验
预知知识:
new Vue({
data(){return {}},
components:{},
props:[]
})
@click = ""
$emit():
- data(){}:保存数据的对象
- components:保存组件的对象
- props:保存父组件传来的数据
- @click:@是指令 v-on 的缩写。click 是点击事件(在模板里使用)
- \$emit():触发当前实例上的事件(通常是第一个参数)。附加参数都会传给监听器回调(结果赋值给\$event)。
sync
sync 同步:这个同步说的是数据之间的同步。
需求:用Vue模拟 使用余额宝付款完,让余额宝更新到最新金额 1. 余额宝是一个父组件,有money一个数据 2. 付款是一个子组件,引用余额宝父组件的money数据 .sync修饰符主要目的是子组件引用父组件数据,父组件数据在子组件里产生了变化告诉父组件,让父组件数据改为 变化后的数据。由于子组件引用了父组件的数据,所引用的数据自然会更改
代码逻辑:
父组件:余额宝.vue
<template> <div> 余额宝组件 <br /> 余额:{{money}} <hr /> <Pay :payMoney.sync="money"/> </div> </template> <script> import Pay from "./Pay.vue"; export default { data() { return { money: 1000 }; }, components: { Pay } }; </script> <style> </style>
Pay 是子组件。payMoney是在子组件定义的引用父组件money。
子组件:付款框.vue
<template> <div> 付款组件 <br /> 付款金额:100元 <br /> 余额宝 可用余额:{{payMoney}} <button @click="$emit('update:payMoney',payMoney-100)"> <span>付款</span> </button> </div> </template> <script> export default { props: ["payMoney"] }; </script> <style> </style>
点击button执行$emit()函数,该函数会触发当前实例上一个事件,附加参数都会传给监听器回调。 payMoney-100产生的结果会赋值到$event。 sync执行时调用$event赋值给父组件数据,父组件数据修改后子组件所引用的数据自然会更改
sync 修饰符原理
先看$emit()做了什么 1 :$emit(事件,结果):$emit执行后触发事件把附加参数(结果)传给监听器回调 $emit会触发了第一个参数'事件',那我监听这个事件是不是就知道子组件是在什么时候想要更改数据? $emit会把第二个参数'结果'传给监听器回调使用。那我在父组件监听该事件就知道了数据变化后的结果了 2 :v-on:事件="父组件数据=$event" :v-on监听了该'事件'然后修改了父组件数据。$event是$emit第二个参数 结果的值 那.sync这个修饰符做了什么? 因为2这个步骤太常用了.sync修饰了它;.sync === v-on:事件='修改数据' 如果不用.sync的话。子组件点击触发事件,父组件监听事件即可 @click="$emit('payMoney',payMoney-100)" <Pay :payMoney="money" v-on:update:payMoney="money=$event"> 当然选择.sync修饰符 @click="$emit('update:payMoney',payMoney-100)" <Pay :payMoney.sync="money"> 注意:使用sync修饰符触发的事件要以 update:开头
总结:
- .sync 主要目的是在子组件引用父组件数据产生了修改同步到父组件上
- \$emit()函数,触发事件并且附加参数给监听器回调用
- 使用.sync 修饰符会监听\$emit 所触发的事件并且更新父组件的数据
- 使用.sync 修饰符时\$emit()所触发的事件要以’update:‘开头。