vue3组合式api(一)

1.setup语法糖

1.1 定义

Vue 3 中引入了一个新的 Composition API,其中包含了 setup 函数,用于替代 Vue 2 中的 data、methods 等选项。setup 函数提供了更灵活和可组合的方式来组织组件的逻辑,并且更加符合函数式编程的思想

它的执行比created还要早,在这里打印不了this,v3的项目几乎用不到this.setup是进入页面时自动触发而定一个函数

1.2 变量

  // vue2写法
  data () {
    return {
      vue2: 'vue2'
    }
  },
  // vue3写法
  setup () {
    const vue3 = 'vue3'
    return { vue3 }
  }

1.3方法

<template>
  <div class="home">
    <button @click="func.btnClickEvent">按钮</button>
  </div>
</template>

<script>
export default {
  setup () {
  //将func对象当成vue2中的methods
    const func = {
      btnClickEvent: () => {
        console.log(6666)
      }
    }
    return { func }
  }
}
</script>

2. ref 和 reactive

Vue 3 的响应式系统是基于 ES6 的 Proxy 对象来实现对象的响应式跟踪。
Proxy 对象:当调用 reactive 函数时,会创建一个 Proxy 对象,并传入目标对象(即我们传入的对象)和一个 handler 对象,用来定义 Proxy 的行为。

Handler 对象:在 handler 对象中,会定义一系列针对目标对象的拦截器 (handler traps),用来捕捉并响应目标对象的各种操作,比如属性的获取、设置、删除等。当我们访问或修改响应式对象的属性时,Proxy 会捕捉这些操作,并通知 Vue 的响应式系统进行相应的处理。

依赖追踪:在访问响应式对象的属性时,Vue 会通过 Proxy 捕获这个操作,并将属性与当前的组件实例建立关联,从而建立属性与组件的依赖关系。当属性发生变化时,Vue 可以追踪到受影响的组件实例,并触发视图的更新。

反应性触发:当响应式对象的属性发生变化时,Proxy 会捕获这个变化,并通知相关的组件进行更新,确保视图与数据的同步。

2.1 ref

在 Vue 3 中,ref 是用来创建一个响应式数据的函数。通过 ref 函数创建的变量会自动进行数据绑定,当变量的值发生改变时,相关的视图会自动更新

<template>
  <div class="home">
    <h1>{{ name }}</h1>
    <h1>{{ obj.age }}</h1>
    <h1>{{ arr[0] }}</h1>
    <button @click="func.btnClickEvent">按钮</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const name = ref('基本类型')
    const obj = ref({
      age: '对象中的数据'
    })
    const arr = ref(['数组中的数据'])

    const func = {
      btnClickEvent: () => {
        name.value = '改变基本类型'
        obj.value.age = '改变对象中的数据'
        arr.value[0] = '改变数组中的数据'
      }
    }
    return { name, obj, func, arr }
  }
}
</script>

2.2.reactive

<template>
  <div class="home">
    <h1>{{ obj.a.b[0] }}</h1>
    <button @click="func.btnClickEvent">按钮</button>
  </div>
</template>

<script>
import { reactive } from 'vue'

export default {
  setup () {
    const obj = reactive({
      a: {
        b: ['嵌套数据']
      }
    })
    const func = {
      btnClickEvent: () => {
        obj.a.b[0] = '改变嵌套数据'
      }
    }
    return { func, obj }
  }
}
</script>

2.3ref 与 toRef

1.ref的本质是拷贝一份数据,脱离了与源数据的交互
2.ref函数将对象中的属性变成响应式数据,不会影响到源数据,但是会更新视图层
3.toRef的本质是引用,与原始数据有交互,修改响应式数据会影响到源数据,但是不会更新视图层

<template>
  <div class="home">
    <h1>{{ obj1.age}}</h1>
	<h1>{{ obj2.Age}}</h1>
	<h1>{{ obj.age}}</h1>
    <button @click="func.btnClickEvent">按钮</button>
  </div>
</template>

<script>
import { ref, toRef } from 'vue'

export default {
  setup () {
   	const obj = {
   	  age:10
   	}
   
    //因为obj中的变量直接在ref中定义的,不能称为源数据
    const obj1 = ref({
      age:10
    })
    
    const Age = 10
	const obj2 = ref({
      Age
    })
    
	const obj3 = toRef(obj ,'age')

    const func = {
      btnClickEvent: () => {
        obj1.value.age++
        //此时打印发现,视图在变化,obj1.value.age也在变化的
        console.log(obj1, 'obj1')
		
		obj2.value.Age++
		//此时打印发现,obj2.value.Age没有发生变化,但是视图发生了变化
		 console.log(obj2, 'obj2')
		 
		 obj3.value++
		//此时打印发现,obj.age发生变化,但是视图没有发生变化
		 console.log(obj , 'obj ')
      }
    }
    return { func, obj , obj1, obj2 ,obj3 }
  }
}
</script>>
  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值