Vue3基础之组合Api

1. 简述

Composition API:组合式 API;一组低侵入式的、函数式的 API,使得我们能够更灵活地【组合】组件的逻辑。
Composition API提供了一个setup函数,我们可以将data数据、计算属性、方法等等,都放在setup函数中,这样就可以对业务进行集中处理了。

2. 常用组合api

2.1. setup

  • setup函数是Composition API 的入口点,是它的核心。
  • 由于执行 setup 时,组件实例尚未被创建,因此在 setup 中不能使用 this。
  • setup中定义的东西必须要return出去,才能被使用或绑定视图。

使用方式1
vue版本3.2以后可以在<script>标签中,没有export default

  • setup如何使用组件name属性下面使用方式2是其中一种 还有一种是引入defineComponent设置,需要写两个script标签。其他写法是配合ts使用。
<template>
  <div>
    组合api{{title}}
  </div>
</template>
<script>
    import { defineComponent } from 'vue'
    export default defineComponent({  
        name:'demoVue'
 })
</script>
<script setup>
 import {ref} from 'vue'
 const title = ref('这是组合api例子');

</script>

<style>

</style>

使用方式2
使用setup函数

<template>
  <div>
    组合api{{title}}
  </div>
</template>

<script>
import {ref} from 'vue'
export default {
    name:'demoVue',
    setup(){
       const title = ref('这是组合api例子')
       return{
        title
       }
    }
}
</script>

<style>

</style>

2.1. ref函数

推荐定义基本类型,ref声明的类型,通过value获取值
方法:引入 ref 函数,const xxx = ref(initValue) 模板中读取数据: 不需要.value,直接:<div>{{xxx}}</div>

  • const msg_ = ref() msg_ 是underfind

<script setup >
import {ref} from 'vue'
 const msg = ref("初始化")
 const msg_ = ref()
 msg.value = '初始化后赋值'
 console.log('msg--------',msg.value,msg_.value)
 // 声明对象、数组、map
const json = ref({})
const array = ref([])
const map = ref(new Map())
</script>

toRefs 是对数据的解构

  • import {name} = recitive({name:'zhangsan'})name不可以直接赋值,需要赋值则 let name = toRefs(name) 则name.value = zhangz 即可还是数据绑定
<script setup >
   const obj = reactive({
    name:'張三',
    age:18
   })
   const {name,age} = toRefs(obj)
   const btn = ()=>{ 
    name.value= '李四'
   }
</script>

2.2.reactive 函数

对象类型的响应式数据(基本类型不要用它,要用ref函数) 方法:const x= reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy 的实例对象,简称 proxy 对象) 特点:可以实现数组、深层对象的响应式数据,这是 vue2.0 中无法实现的,底层基于 Proxy

  • 注意若声明数组 const arr = reactive([1,2,3]) arr = [] 会断了响应,应arr.length = 0

<script setup >
import {reactive} from 'vue' 
 const obj1 = reactive({
    name:'zyj',
    age:18
 }) 
 obj1.age = 19
 obj1.sex = '男'
console.log('--obj1---',obj1.name);
</script>

2.3.computed函数

计算属性函数,与Vue2.x中computed配置功能一致


<script setup >
import {reactive,computed} from 'vue' 
 const obj1 = reactive({
    name:'zyj',
    age:18
 }) 
 obj1.age = 19
 obj1.sex = '男'
 const age = computed(()=>{
    return obj1.age + 1
 })
console.log('--obj1---',obj1.name);
</script>

2.4.watch函数

  • immediate:如果要加载时执行一次,需要加第三个配置对象,immediate:true
  • deep:如果监视的对象属性也是一个对象,需要手动开启
  • watchEffect:不需要明确的去监视谁,谁在回调函数里面用到了,就监视谁。注意:该回调函数一开始会执行一次
import {watch} from 'vue' 

2.4.1.watch函数 监听单个ref

  • 一秒后修改值,输入watch监听日志

日志 ---watch--- 222 111

<script setup >
import {ref,watch} from 'vue'  

const age = ref(111)

watch(age,(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
})

let timer = setTimeout(()=>{
      age.value = 222  
},1000)
</script>

2.4.2.watch函数 监听多个ref

  • 一秒后修改值,输入watch监听日志

日志 ---watch--- [1111, 3333] , [111, 333]
按数组返回对应监听值的多个ref数组,一个新值,一个旧值。

<script setup >
import {ref,watch} from 'vue'  

const age = ref(111)
const count = ref(333)

watch([age,count],(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
})

let timer = setTimeout(()=>{
      age.value = 1111
      count.value = 3333
},1000)
</script>

2.4.3.watch函数 监听单个对象

  • 一秒后修改值,输入watch监听日志

日志 ---watch--- Proxy(Object) {name: 'zyj', age: 1}, Proxy(Object) {name: 'zyj', age: 1}

<script setup >
import {reactive,watch} from 'vue' 

 const obj1 = reactive({
    name:'zyj',
    age:18
 })   

watch(obj1,(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
})

setTimeout(()=>{
      obj1.age = 1 },1000)
  
</script>

2.4.4.watch函数 监听多个对象

  • 一秒后修改值,输入watch监听日志

日志---watch--- (2) [Proxy(Object), Proxy(Object)], (2) [Proxy(Object), Proxy(Object)]
一个新值一个旧值

<script setup >
import {reactive,watch} from 'vue' 

 const obj1 = reactive({
    name:'zyj',
    age:18
 })  
  const obj2 = reactive({
    name:'zyj--',
    age:180
 })  

watch([obj1,obj2],(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
})

setTimeout(()=>{
      obj1.age = 1
      obj2.age = 2
},1000)
  
</script>

2.4.5.watch函数 监听对象和ref值

  • 一秒后修改值,输入watch监听日志

日志---watch--- (2) [Proxy(Object), 2] (2) [Proxy(Object), 222]
一个新值一个旧值

<script setup >
import {ref,reactive,watch} from 'vue' 

 const obj1 = reactive({
    name:'zyj',
    age:18
 })  
 const count= ref(222)

watch([obj1,count],(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
})

setTimeout(()=>{
      obj1.age = 1
      count.value = 2
},1000)
  
</script>

2.4.6.watch函数 监听对象属性

使用箭头函数,否则监听不到。如数据是对象需要开启深度监听

  • 一秒后修改值,输入watch监听日志

日志---watch--- (3) [1, 2, Proxy(Object)] ,(3) [18, 22222, Proxy(Object)]

下面例子监听obj1.age属性,ref的count,obj1.moudle属性

import {reactive,ref,watch} from 'vue' 

 const obj1 = reactive({
    name:'zyj',
    age:18,
    module:{
        name:'hhhhhh'
    }
 })  
 const count = ref(22222)

watch([()=>obj1.age,count,()=>obj1.module],(newValue,oldValue)=>{
     console.log('---watch---',newValue,oldValue);
},{immediate:true,deep:true})

setTimeout(()=>{
      obj1.age = 1
      count.value = 2
      obj1.module.name = 'qqqqqqq'
},1000)
  
</script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容