【Vue3的组合式API】超详细教程,含computed、watch、组件通信、模版引用......

简介: 【Vue3的组合式API】超详细教程,含computed、watch、组件通信、模版引用......

一、组合式API - setup选项

1. setup选项的写法和执行时机

写法

 <script>
    export default {
      setup(){
        
      },
      beforeCreate(){
        
      }
    }
  </script>

执行时机

在beforeCreate钩子之前执行

2. setup中写代码的特点

在setup函数中写的数据和方法需要在末尾以对象的方式return,才能给模版使用

  
  <script>
    export default {
      setup(){
        const message = 'this is message'
        const logMessage = ()=>{
          console.log(message)
        }
        // 必须return才可以
        return {
          message,
          logMessage
        }
      }
    }
  </script>

3. setup语法糖

script标签添加 setup标记,不需要再写导出语句,默认会添加导出语句

  <script setup>
    const message = 'this is message'
    const logMessage = ()=>{
      console.log(message)
    }
  </script>

二、组合式API - reactive和ref函数

1. reactive

接受对象类型数据的参数传入并返回一个响应式的对象

 <script setup>
   // 导入
   import { reactive } from 'vue'
   // 执行函数 传入参数 变量接收
   const state = reactive({
     msg:'this is msg'
   })
   const setSate = ()=>{
     // 修改数据更新视图
     state.msg = 'this is new msg'
   }
  </script>
  
  <template>
    {{ state.msg }}
    <button @click="setState">change msg</button>
  </template>

2. ref

接收简单类型或者对象类型的数据传入并返回一个响应式的对象

 <script setup>
   // 导入
   import { ref } from 'vue'
   // 执行函数 传入参数 变量接收
   const count = ref(0)
   const setCount = ()=>{
     // 修改数据更新视图必须加上.value
     count.value++
   }
  </script>
  
  <template>
    <button @click="setCount">{{count}}</button>
  </template>

3. reactive 对比 ref

  1. 都是用来生成响应式数据
  2. 不同点
  1. reactive不能处理简单类型的数据
  2. ref参数类型支持更好,但是必须通过.value做访问修改
  3. ref函数内部的实现依赖于reactive函数
  1. 在实际工作中的推荐
  1. 推荐使用ref函数,减少记忆负担

三、组合式API - computed

计算属性基本思想和Vue2保持一致,组合式API下的计算属性只是修改了API写法

  
  <script setup>
  // 导入
  import {ref, computed } from 'vue'
  // 原始数据
  const count = ref(0)
  // 计算属性
  const doubleCount = computed(()=>count.value * 2)
  
  // 原始数据
  const list = ref([1,2,3,4,5,6,7,8])
  // 计算属性list
  const filterList = computed(item=>item > 2)
  </script>

四、组合式API - watch

侦听一个或者多个数据的变化,数据变化时执行回调函数,俩个额外参数 immediate控制立刻执行,deep开启深度侦听

1. 侦听单个数据

 
  <script setup>
    // 1. 导入watch
    import { ref, watch } from 'vue'
    const count = ref(0)
    // 2. 调用watch 侦听变化
    watch(count, (newValue, oldValue)=>{
      console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
    })
  </script>

2. 侦听多个数据

侦听多个数据,第一个参数可以改写成数组的写法

  <script setup>
    // 1. 导入watch
    import { ref, watch } from 'vue'
    const count = ref(0)
    const name = ref('cp')
    // 2. 调用watch 侦听变化
    watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
      console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
    })
  </script>

3. immediate

在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调

 
  <script setup>
    // 1. 导入watch
    import { ref, watch } from 'vue'
    const count = ref(0)
    // 2. 调用watch 侦听变化
    watch(count, (newValue, oldValue)=>{
      console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
    },{
      immediate: true
    })
  </script>

4. deep

通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep

<script setup>
    // 1. 导入watch
    import { ref, watch } from 'vue'
    const state = ref({ count: 0 })
    // 2. 监听对象state
    watch(state, ()=>{
      console.log('数据变化了')
    })
    const changeStateByCount = ()=>{
      // 直接修改不会引发回调执行
      state.value.count++
    }
  </script>
  
  <script setup>
    // 1. 导入watch
    import { ref, watch } from 'vue'
    const state = ref({ count: 0 })
    // 2. 监听对象state 并开启deep
    watch(state, ()=>{
      console.log('数据变化了')
    },{deep:true})
    const changeStateByCount = ()=>{
      // 此时修改可以触发回调
      state.value.count++
    }
  </script>

五、组合式API - 生命周期函数

1. 选项式对比组合式

2. 生命周期函数基本使用

  1. 导入生命周期函数
  2. 执行生命周期函数,传入回调
  
  <scirpt setup>
  import { onMounted } from 'vue'
  onMounted(()=>{
    // 自定义逻辑
  })
  </script>

3. 执行多次

生命周期函数执行多次的时候,会按照顺序依次执行

  
  <scirpt setup>
  import { onMounted } from 'vue'
  onMounted(()=>{
    // 自定义逻辑
  })
  
  onMounted(()=>{
    // 自定义逻辑
  })
  </script>

六、组合式API - 模版引用

概念:通过 ref标识 获取真实的 dom对象或者组件实例对象

1. 基本使用

实现步骤:

  1. 调用ref函数生成一个ref对象
  2. 通过ref标识绑定ref对象到标签

2. defineExpose

默认情况下在 <script setup>语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpose编译宏指定哪些属性和方法容许访问

举例如下:指定testMessage属性可以被访问到

七、组合式API - 组件通信

包含父传子、子传父、兄弟传值、依赖注入、全局状态管理......,

详情可见我的这两篇文章:

👉

👉

在此就不再赘述了💕

八、Vue3.3 新特性-defineOptions

背景说明:

有 <script setup> 之前,如果要定义 props, emits 可以轻而易举地添加一个与 setup 平级的属性。

但是用了 <script setup> 后,就没法这么干了 setup 属性已经没有了,自然无法添加与其平级的属性。


为了解决这一问题,引入了 defineProps defineEmits 这两个宏。但这只解决了 props 与 emits 这两个属性。

如果我们要定义组件的 name 或其他自定义的属性,还是得回到最原始的用法——再添加一个普通的 <script> 标签。

这样就会存在两个 <script> 标签。让人无法接受。


所以在 Vue 3.3 中新引入了 defineOptions 宏。顾名思义,主要是用来定义 Options API 的选项。可以用 defineOptions 定义任意的选项, props, emits, expose, slots 除外(因为这些可以使用 defineXXX 来做到)

九、Vue3.3新特性-defineModel

在Vue3中,自定义组件上使用v-model, 相当于传递一个modelValue属性,同时触发 update:modelValue 事件

我们需要先定义 props,再定义 emits 。其中有许多重复的代码。如果需要修改此值,还需要手动调用 emit 函数。

于是乎 defineModel 诞生了。

生效需要配置 vite.config.js

 
  import { fileURLToPath, URL } from 'node:url'
 
  import { defineConfig } from 'vite'
  import vue from '@vitejs/plugin-vue'
  
  // https://vitejs.dev/config/
  export default defineConfig({
    plugins: [
      vue({
        script: {
          defineModel: true
        }
      }),
    ],
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      }
    }
  })
相关文章
|
22天前
|
网络协议 API
检测指定TCP端口开放状态免费API接口教程
此API用于检测指定TCP端口是否开放,支持POST/GET请求。需提供用户ID、KEY、目标主机,可选指定端口(默认80)和地区(默认国内)。返回状态码、信息提示、检测主机、端口及状态(开放或关闭)。示例中ID和KEY为公共测试用,建议使用个人ID和KEY以享受更高调用频率。
39 14
|
25天前
|
API 网络安全
发送UDP数据免费API接口教程
此API用于向指定主机发送UDP数据,支持POST或GET请求。需提供用户ID、密钥、接收IP及端口、数据内容等参数。返回状态码和信息提示。示例中含公共ID与KEY,建议使用个人凭证以提高调用频率。
44 13
|
25天前
|
网络协议 API 网络安全
发送TCP数据免费API接口教程
此API用于向指定主机发送TCP数据,支持POST/GET请求,需提供用户ID、KEY、接收IP、端口及数据内容。返回状态码和信息提示,示例如下:{&quot;code&quot;:200,&quot;msg&quot;:&quot;发送成功!&quot;}。详情见:https://www.apihz.cn/api/datacstcp.html
36 11
|
28天前
|
API
历史上的今天免费API接口教程
该接口用于获取历史上的今天发生的事件,支持随机获取记录,数据同步自百度历史上的今天。请求方式为POST或GET,需提供用户ID和KEY,可选指定查询的具体日期。返回数据包括事件标题、年份、月份、日、关键词及百度百科链接。示例请求和响应详见文档。
62 12
|
23天前
|
API
获取网页状态码[可指定地域]免费API接口教程
该接口用于获取指定网址的访问状态码,支持从国内、香港、美国等地域节点访问。通过POST或GET请求,需提供用户ID、KEY及目标网址等参数。返回结果包括状态码和信息提示。 示例:https://cn.apihz.cn/api/wangzhan/getcode.php?id=88888888&key=88888888&type=1&url=www.apihz.cn。
|
24天前
|
API
诸葛神签免费API接口教程
该接口用于随机获取一支诸葛神签,共100签。通过POST或GET请求至https://cn.apihz.cn/api/mingli/zhuge.php,需提供用户ID和KEY。返回结果包括状态码、消息内容、签文图片、序号、吉凶及解签。示例中ID与KEY为公共使用,建议使用个人ID与KEY以提高调用频率。
|
24天前
|
API
观音灵签免费API接口教程
该API提供观音灵签的随机获取服务,含100签,支持POST/GET请求。需用户ID和KEY认证。返回签文、解曰、典故等信息。示例请求:https://cn.apihz.cn/api/mingli/guanyin.php?id=88888888&key=88888888。详情参见官方文档。
|
23天前
|
缓存 算法 API
查询域名WHOIS信息免费API接口教程
该API用于查询顶级域名的WHOIS信息,不支持国别域名和中文域名。通过POST或GET请求,需提供用户ID、KEY及待查询域名。返回信息包括域名状态、注册商、时间等详细数据。示例与文档见官网。
|
24天前
|
API
周公解梦免费API接口教程
该接口提供数万个解梦数据,支持通过用户ID、用户KEY和关键词查询梦的解析。支持POST/GET请求,返回状态码、消息内容、结果集等信息。示例请求地址:https://cn.apihz.cn/api/mingli/zhougong.php?id=88888888&key=88888888&word=捞鱼。返回数据包括梦的标题、内容等。
|
23天前
|
API
icp备案查询免费API接口教程
该接口用于查询指定域名的ICP备案信息,支持POST或GET请求方式。请求时需提供用户ID、用户KEY及待查询的域名,可选参数为查询通道。响应中包含状态码、消息内容、备案号、备案主体、域名及审核时间等信息。示例中提供了GET和POST请求方式及返回数据样例。