应用场景:当父组件传递数据给子组件,子组件想要修改这个数据的时候,子组件不能直接修改传递过来的数据(否则Vue会报错),而是通过$emit
触发更新数据的事件,并且把要修改的数据的最新值传递给父组件,让父组件来响应修改数据,父组件通过$event
来接受要修改的数据的最新值
一、$emit
$emit
共接收两个参数 :
{string} eventName
触发当前实例上的事件。[...args]
附加参数都会传给监听器回调。
示例
- 子组件可以通过调用
$emit
传入事件名称update:money
,第二个参数为要修改的数据的最新值:
//child.vue
<template>
<div class="child">
爸爸有{{money}}元
<button @click="$emit('update:money', money - 10)">我要花钱</button>
</div>
</template>
<script>
export default {
props: ["money"]
}
</script>
- 父组件使用
v-on
监听这个事件update:money
,通过$event
接受要修改的数据的最新值,然后响应子组件修改money
//parent.vue
<template>
<div class="parent">
<div>
爸爸现在有{{ total }}元钱
<hr/>
<Child :money="total" v-on:update:money="total = $event"/>
</div>
</div>
</template>
<script>
import Child from "./child.vue"
export default {
components: { Child },
data() {
return {
total: 10000
}
}
}
</script>
二、.sync
.sync
简化了上述代码,直接在父组件上使用
//parent.vue
<template>
<div class="parent">
<div>
爸爸现在有{{ total }}元钱
<hr/>
<Child :money.sync="total"/>
</div>
</div>
</template>
:money.sync="total"
等价于:money="total" v-on:update:money="total = $event"
三、总结
- 组件不能直接修改
props
传进来的数据,而是要通知父组件修改 $emit
可以触发事件并传参,$event
可以获取$emit
的参数