vue3从入门到入土(2)

387 阅读2分钟

大家好,我是孑律,一名还在学习道路上痛苦挣扎的程序猿。
今天给大家带来的是vue3教程的组合API——setup和ref以及reactive

1.一切组合API表演的舞台——setup()

首先我们讲到了setup,就得知道setup是什么? 1.setup()是Vue3.0中一个新的配置项,它的值为一个函数
2.组件中所用到的:数据、方法等等,均要配置在setup中
3.setup函数的两种返回值:

1).若返回一个对象则对象中的属性,方法均可在模板中直接使用

2).若返回一个渲染函数,则可自定义渲染内容

例子:

setup() {
      let obj = {
        name"孑律",
        email"3544338984@qq.com",
      };
      return {
          ...obj
      }

这个时候我们就可以在代码的模板中直接使用obj.nameobj.email

2.基本类型的响应式——ref()

  1. 作用: 定义一个响应式的数据

  2. 语法: const xxx = ref(initValue)

    • 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)
    • JS中操作数据: xxx.value
    • 模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>
  3. 备注:

    • 接收的数据可以是:基本类型、也可以是对象类型。
    • 基本类型的数据:响应式依然是靠Object.defineProperty()getset完成的。
    • 对象类型的数据:内部 “ 求助 ” 了Vue3.0中的一个新函数—— reactive函数。

3.对象类型的响应式——reactive函数

  1. 作用: 定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)
  2. 语法:const 代理对象= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)
  3. reactive定义的响应式数据是“深层次的”。
  4. 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据进行操作

4.Vue3.0中的响应式原理

要想了解vue3的响应式,首先先回顾一下vue2的响应式是怎么进行的

vue2.x的响应式

  • 实现原理:

    • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

    • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

      Object.defineProperty(data, 'count', {
          get () {}, 
          set () {}
      })
      
  • 存在问题:

    • 新增属性、删除属性, 界面不会更新。
    • 直接通过下标修改数组, 界面不会自动更新。

Vue3.0的响应式

new Proxy(data, {
	// 拦截读取属性值
    get (target, prop) {
    	return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
    	return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
    	return Reflect.deleteProperty(target, prop)
    }
})

proxy.name = 'tom'