Vue 的子组件想要使用父组件的数据,就需要用 props 传递数据,但我们无法直接在子组件中修改 props ,因为这件事是不被 Vue 允许的,那如果我们就想要在子组件中修改它呢?
Vue 提供了一个名为 $emit 的 API ,通过它我们可以实现这一操作。
- 用法:
vm.$emit( eventName, […args] )
子组件上触发自定义事件。附加参数传给监听器回调。父组件监听该自定义事件,根据需要更新一个本地的数据 property。
示例:
// App.vue
<template>
<div class="app">
我是父组件: {{ num }}
<hr />
<Child :num="total" v-on:update:num="num = $event" /> // $event 可以获取 $emit 的值
</div>
</template>
<script>
import Child from "./Child.vue";
export default {
data() {
return { num: 10000 };
},
components: { Child: Child },
};
</script>
// Child.vue
<template>
<div class="child">
从父组件传来的数据:{{ num }}
<button @click="$emit('update:num', num - 100)">
<span>我要改!</span>
</button>
</div>
</template>
<script>
export default {
props: ["num"],
};
</script>
.sync修饰符就是简化父组件中监听事件,更新数据这一步骤。
//:num.sync="num" 等价于 :num="total" v-on:update:num="num = $event"