Vue中 .sync 修饰符的作用

1,007 阅读1分钟

Vue 的组件在接受外部数据 props 时,Vue 规定,子组件在通过 props 接受外部数据后只有使用该数据的权利,但没有修改该属性的权利。

如果子组件可以随意修改外部传来的数据,可能导致在数据被修改后,
不知道数据是被谁修改的,使数据混乱

因此 Vue 规定组件只能有权使用 props 的属性,想要改变,就必须通知该数据的真正拥有者,也就是使用该组件的父文件

.sync 修饰符的作用

简化了父子组件之间数据通信的代码书写方式,对 prop 进新双向绑定。

举例

  • 父组件有 1000 元
  • 子组件每次点击按钮会花掉 10 元
  • 父组件上显示的余额与子组件显示的余额会相应发生变化

不使用 .sync 修饰符时

要实现父子组件间值的传递,通常使用 props 和自定义事件 $emit 。
其中,父组件通过 props 将值传给子组件,子组件再通过 $emit 将值传给父组件,父组件通过事件监听获取子组件传过来的值。

// 父组件
<template>
    <div class="app">
        App.vue 我现在有 {{total}}
        <hr>
        <!-- 这里的 update:money 是一个字符串 -->
        <!-- 通过 v-on: 绑定 update:money 事件 -->
        <!-- 使用 $evet 接收子组件传递的参数 -->
        <Child :money="total" v-on:update:money="total = $event"/>
    </div>
</template>

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

<style>
.app {
    border: 3px solid red;
    padding: 10px;
}
</style>
// 子组件
<template>
    <div class="child">
        {{money}}
        <!-- 通过 $emit 触发父组件上的 update:money 事件 -->
        <!-- ,第一个参数为事件名称,第二个参数为参数的返回结果 -->
        <button @click="$emit('update:money', money-10)">
            <span>花钱</span>
        </button>
    </div>
</template>

<script>
    export default {
// 接受父组件传来的 money 属性
// 子组件是不能直接修改的,需要通过 $emit 触发的方式去更改该属性
        props: ["money"]
    };
</script>

<style>
    .child {
        border: 3px solid green;
    }
</style>

点击三次按钮,结果如图: image.png

使用 .sync 修饰符

// 父组件如下,子组件不变
<template>
    <div class="app">
        App.vue 我现在有 {{total}}
        <hr>
        <!-- 简化了代码书写方式 -->
        <Child :money.sync="total"/>
    </div>
</template>

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

<style>
    .app {
        border: 3px solid red;
        padding: 10px;
    }
</style>

总结

不使用 .sync 修饰符:<Child :money="total" v-on:update:money="total = $event"/>
使用 .sync 修饰符: <Child :money.sync="total"/>

本文参考摘录了:

  1. 走近 Vue 的 .sync 修饰符---LoveVin
  2. Vue 中的 .sync 修饰符有什么用---梁壮壮
  3. Vue 中的 .sync 修饰符有什么用---李振兴