《Vue中的.sync修饰符有什么作用?》

82 阅读1分钟

看一个代码示例:

父组件:App.vue

<template>
  <div class="app">
    App.vue 我现在有 {{ total }}
    <hr>
    <!-- $event 为 $emit 发射出来的参数  update:money 就是事件名,推荐命名法-->
    <Child :money="total" v-on:update:money="total = $event" />
    <!-- 上面等价于下面这句, .sync修饰符 -->
    <!-- <Child :money.sync="total" /> -->
  </div>
</template>

<script>
import Child from "./Child.vue"; //这里引入子组件
export default {
  data() {
    return { total: 10000 };
  },
  components: { Child: Child },
};
</script>

子组件:Child.vue

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

<script>
export default {
  props: ["money"]
};
</script>

从这些代码案例中可以看出: .sync修饰符只是将 <Child :money="total" v-on:update:money="total=$event" />替换为<Child :money.sync="total" /> 只是将语法简化。

注意:money.sync="total",这个绑定的属性名money一定要和子组件发送的事件名匹配,即发送的事件名为update:money

如果父组件绑定的属性是xxx.sync = 'yyy',则子组件为@click="$emit('update:xxx', money-100)" 。

为什么需要提供这种简化呢?

从vue官方文档关于.sync介绍中,提出了一个问题,那就是关于数据双向绑定会带来维护上的问题,因为子组件可以变更父组件数据,这种情况是不被允许的。

所以推荐在子组件中通过$emit('update:money', money-100) 发射出一个事件,在父组件中捕捉到该事件,然后通过父组件本身去修改数据。

为了明确区分出这类情况,vue提供了.sync修饰符,让子组件改变父组件状态的代码更容易被区分开来。

总结. sync 修饰符用处;

1、语法上的优化。

2、让子组件改变父组件状态的代码更容易被区分开来。