为什么v-model是语法糖和vue2响应式的缺点

v-model是语法糖

简单点说语法糖就是对一个更加复杂的操作的封装

// 1. v-model 在表单元素上使用
<input v-model="num" />

// 2. v-model 在自己定义的组件上使用
<MyCom v-model="num" />
上面的写法是快捷方式,它等价于如下复杂的写法:
<MyCom :value="num" @input="新值=>num=新值" />

// v-model做两件事:
// 1. 向子组件传来一个名为value的属性
// 2. 在子组件监听input事件,这个事件的回调中修改value所绑定的值

 父组件 :

<template>
  <div>
    <h2>父组件{{ num }}</h2>
    <MyCom v-model="num" />
    <!-- <MyCom v-model="num" />是下面的简单写法 -->
    <!-- <MyCom :value="num" @input="fn" /> -->
  </div>
</template>

<script>
import MyCom from './MyCom.vue'
export default {
  data() {
    return {
      num: 100
    }
  },
  components: {
    MyCom
  },
  methods: {
    fn(a) {
      console.log(a)
      this.num = a
    }
  }
}
</script>

<style>
</style>

子组件 :

<template>
  <div>
    <h2>子组件{{ value }}</h2>
    <button @click="fn">修改值</button>
  </div>
</template>

<script>
export default {
  props: ['value'],
  methods: {
    fn() {
      this.$emit('input', 200)
    }
  }
}
</script>

<style>
</style>

优点 : v-model写法比较简单 , 一个指令实现两个功能 , 父传子(value属性) , 子传父(input事件)

是否可以不用 : 可以

vue2响应式的缺点

响应式 : 数据改变 --> 视图跟着变化

1 对象新增的属性没有响应式

2 数组的部分操作没有响应式

        拥有数据响应式的七种 : push(),pop(),shift(),unshift(),splice(),sort(),reverse()

1 对象新增的属性没有响应式 :

<template>
  <div>
    <h2>响应式的缺陷-对象</h2>
    <p>{{Math.random()}}</p>
    <p>a: {{obj.a}}, b: {{obj.b}}, c:{{obj.c}}</p>
    <button @click="fn">a++</button>
    <button @click="fn1">添加一个属性</button>
    <button @click="fn2">添加一个属性+有响应式</button>
  </div>
</template>

<script>
export default {
  data(){
    return {
      obj: {
        a: 1
      }
    }
  },
  methods:{
    fn2(){
      // 添加一个属性+有响应式
      // vue提供的API
      // $set(对象,属性名,属性值)
      this.$set(this.obj, 'c', 3)
    },
    fn1(){
      this.obj.b = 2
    },
    fn(){
      this.obj.a++
    }
  }
}
</script>

<style>

</style>

 2 数组的部分操作没有响应式

<template>
  <div>
    <h2>响应式的缺陷-数组</h2>
    <div>
      数组的操作有7个方法有响应式的效果:

      push() pop() shift() unshift() splice() sort() reverse()
      就这个7个api会修改原数组(vue2的内部它重写这7个API)

      其他的操作都不会有响应式:
      1. 通过下标给元素赋值。
      2. 修改数组的length
    </div>
    <p>{{Math.random()}}</p>
    <p v-for="item in arr" :key="item">{{item}}</p>
    <button @click="fn">数组push</button>
    <button @click="fn1">把第一个元素改成100</button>
    <button @click="fn2">length改成0</button>
  </div>
</template>

<script>
export default {
  data(){
    return {
      arr:[1,2,3]
    }
  },
  methods:{
    fn2(){
      this.arr.length = 0
    },
    fn1(){
      // 直接通过下标来修改,没有响应式
      // this.arr[0] = 100

      // 方法1: 先删除,再添加
      // this.arr.splice(0,1,100)

      // 方法2: $set
      this.$set(this.arr, "0", 100)
    },
    fn(){
      // push(),pop(),shift(),unshift(),splice(),sort(),reverse()
      // 数组push
      this.arr.push(4)
    }
  }
}
</script>

<style>

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值