$emit、sync修饰符

816 阅读1分钟

$emit

vm.$emit( eventName, […args] ) 用来触发当前实例上的事件,附加参数都会传给监听器回调。

多用于父子组件数据的传递。

参数

  • eventName 事件名
  • [...args] 传入的参数

$emit 相当于eventBus

代码示例:

Parent.vue

<template>
    <div class=parent-border>
        <div>父亲:{{totalMoney}}</div>
        <-- undata:money事件执行将$event赋值给totalMoney -->
        <Child :money="totalMoney" v-on:update:money="totalMoney = $event" />
    </div>
</template>

<script>
import Child from "./Child";
export default {
    components:{
        Child
    },
    data(){
        return {
            totalMoney:10000
        }
    }
}
</script>

<style  scoped>
.parent-border{
padding: 10px;

    border: 2px solid blue;
}
</style>

父组件将钱的金额传入子组件并定义了update:money事件,事件执行会将传入的参数赋值给totalMoney。该事件需要由子组件来触发,以实现子组件与父组件中的金额同步变化。

Child.vue

<template>
    <div class="border">
        <div>儿子:{{money}}</div>
        <button @click="$emit('update:money', money-100)">
            <span>儿子花钱</span>
        </button>

    </div>
</template>

<script>
export default {
    props:['money'],
    methods:{
        getData(){
            return Date.parse
        }
    }
}
</script>

<style scoped>
.border{
    padding: 10px;
    border:2px solid red;
}
</style>

在子组件中使用$emit定义update:money事件,每次点击按钮就减100。以实现子组件和父组件中的通信。

难道每次子组件要修改父组件传进来的值都需要使用 :money="totalMoney" v-on:update:money="totalMoney = $event"这么长一段代码啦实现同步数据吗

sync

vue为父子组件信息同步专门提供了sync修饰符,在向子组件传递参数时,可以使用:money.sync来表示传入子组件的参数需要与父组件同步。从而达到替代:money="totalMoney" v-on:update:money="totalMoney = $event"这一大段代码的效果。

在上面的父子组件同步money的代码中只需要将

 <Child :money="totalMoney" v-on:update:money="totalMoney = $event" />

修改为

 <Child :money.sync="totalMoney" />

即可实现同步的效果。

注意带有 .sync 修饰符的 v-bind 不能和表达式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是无效的)。取而代之的是,你只能提供你想要绑定的 property 名,类似 v-model。

总结

.sync修饰符其实就是 :money="totalMoney" v-on:update:money="totalMoney = $event"的语法糖