.sync修饰符实际上是一个语法糖。有时候,子组件想要更改一个props属性的值,但是子组件直接修改外部传入的props值会带来维护上的问题,于是可以使用this.$emit('update:propName', newValue)的方式向父组件表达赋新值的意图。
    例如下列代码中,子组件想要修改money的值,通过$emit告诉父组件

    1. <template>
    2. <div class="child">
    3. {{money}}
    4. <button @click="$emit('update:money', money-100)">
    5. <span>花钱</span>
    6. </button>
    7. </div>
    8. </template>
    9. <script>
    10. export default {
    11. props: ["money"]
    12. };
    13. </script>
    14. <style>
    15. .child {
    16. border: 3px solid green;
    17. }
    18. </style>

    父组件监听$emit里的update:propName事件,通过$event获取到子组件抛出的值,更新本地的property

    1. <template>
    2. <div class="app">
    3. App.vue 我现在有 {{total}}
    4. <hr />
    5. <Child :money="total" @update:money="total = $event" />
    6. </div>
    7. </template>
    8. <script>
    9. import Child from "./Child.vue";
    10. export default {
    11. data() {
    12. return { total: 10000 };
    13. },
    14. components: { Child: Child }
    15. };
    16. </script>
    17. <style>
    18. .app {
    19. border: 3px solid red;
    20. padding: 10px;
    21. }
    22. </style>

    为方便起见,Vue为这种模式提供了一个缩写,即.sync修饰符

    1. <Child :money.sync="total" />