Vue .sync 修饰符

93 阅读1分钟

想一下这样的场景:数据由父组件管理,子组件可以接收父组件的数据,当子组件需要修改父组件传递过去的值时,应该怎么操作?

  • 方案一 子组件直接修改? 不可行方案,因为会触发vue的保护机制,因为并不符合数据的逻辑,因为父组件只是把值告诉了子组件。

  • 方案二 子组件通知父组件修改? 可行方案,因为数组在父组件中,当子组件需要修改值时,应该是通知父组件去修改。


//child.vue
<template>
  <div class="child">
    {{ money }}
    <!-- 我要用100 -->
    //方案一
    <button @click="money - 100">  
    
    方案二
    <button @click="$emit('update:money', money-100)"> 
      <span>花钱</span>
    </button>
  </div>
</template>

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

<style>
.child {
  border: 3px solid green;
}
</style>
//parent.vue
<template>
  <div class="app">
    App.vue 我现在有 {{ total }}
    <hr />
    //方案一
    <Child :money="total" />  
    
    //方案二
    <!-- 语法糖式写法 --> 
    <!-- <Child :money.sync="total"/> --> 
    <Child :money="total" v-on:update:money="total = $event"/> 
  </div>
</template>

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

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

子组件利用$emit('update:money', money-100)向父组件传递事件,updata:money为事件名,money-100为事件,父组件通过$event来接受事件