面试必问题:Vue 中 .sync 和 v-model 的关系

218 阅读1分钟

.sync 与 v-model 的相同点和不同点

一.相同点

1. 都是语法糖,都可以实现父与子组件中的通信

v-model 实现通信方式

//父组件
<template>
  <div class="department-container">
    <div class="app-container">
        <el-card>
          <!-- 上面的是样式 不用复制 -->
         点击加一: {{ num }}
         <add-num v-model="num"></add-num>
        </el-card>

    </div>
  </div>
</template>

<script>
import AddNum from '@/views/AddNum'

export default {
    components: { AddNum },
    data() {
        return {
            num: 1,
        };
    },
}
</script>

//子组件
<template>
  <div>
      <button @click="$emit('input',value+1)">+1</button>
  </div>
</template>

<script>
export default {  
    props:{
        value:{ 
            required: true,
            type:Number
         }
    }
}
</script>

.sync 实现通信方式

//父组件
<template>
  <div class="department-container">
    <div class="app-container">
        <el-card>
          <!-- 上面的是样式 不用管 -->
         点击加一: {{ num }}
         <add-num :a.sync="num"></add-num>
         <!-- 等价于 <add-num :a="num" @update:a="val=>num=val" /> -->
        </el-card>
    </div>
  </div>
</template>

<script>
import AddNum from '@/views/AddNum'
export default {
    components: { AddNum },
    data() {
        return {
            num: 1,
        };
    },
}
</script>

//子组件
<template>
  <div>
      <button @click="$emit('update:a',a+1)">+1</button>
  </div>
</template>

<script>
export default {
    props:{
        a:{ 
            required: true,
            type:Number
         }
    }
}
</script>
 

实现效果

image.png

image.png

二、不同点

1. 格式不同

.sync        父组件  : a.sync         子组件  @update : a

v-model    父组件   v-model:   子组件  @(input , value)

2.  一个组件可以多个属性用.sync修饰符,可以同时"双向绑定多个“prop”,v-model 一个组件只能有一个。