【7 Vue3 – Composition API】

news2024/11/27 12:45:45

1 认识Composition API

Options API的弊端

在这里插入图片描述
在这里插入图片描述

setup函数

在这里插入图片描述

2 setup函数的参数

在这里插入图片描述

3 setup简单使用

1 注意不再有响应式数据
要做到响应式数据需要在数据定义时使用ref包装数据,并且在使用时,使用value解包

2 注意template要使用的数据或者函数,必须要return 返回才能被使用

<template>
  <div class="app">
    <!-- template中ref对象自动解包 -->
    <h2>当前计数: {{ counter }}</h2>
    <button @click="increment">+1</button>
    <button @click="decrement">-1</button>
  </div>
</template>

<script>
import { ref } from 'vue'

export default {
  setup() {
    // 1.定义counter的内容
    // 默认定义的数据都不是响应式数据
    let counter = ref(100)
    const increment = () => {
      counter.value++
      console.log(counter.value)
    }
    const decrement = () => {
      counter.value--
    }

    return {
       counter, increment, decrement 
    }
  }
}
</script>

<style>
</style>

setup函数的返回值

在这里插入图片描述

4 为数据提供响应式的特性

1 Reactive API,复杂数据类型

在这里插入图片描述

2 Ref API,简单数据类型包装

ref可以简单数据类型包装,ref也可以定义复杂的数据
在这里插入图片描述

<template>
  <div>
  //普通数据
    <h2>message: {{ message }}</h2>
    <button @click="changeMessage">修改message</button>
    <hr>
    //通过Reactive提供响应式数据
    <h2>账号: {{ account.username }}</h2>
    <h2>密码: {{ account.password }}</h2>
    <button @click="changeAccount">修改账号</button>
    <hr>
    //通过Ref提供响应式数据
    <!-- 默认情况下在template中使用ref时, vue会自动对其进行解包(取出其中value) -->
    <h2>当前计数: {{ counter }}</h2>
    <button @click="increment">+1</button>
    <button @click="counter++">+1</button>

  </div>
</template>

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

  export default {
    setup() {
      // 1.定义普通的数据: 可以正常的被使用
      // 缺点: 数据不是响应式的
      let message = "Hello World"
      function changeMessage() {
        message = "你好啊,李银河!"
        console.log(message)
      }

      // 2.定义响应式数据
      // 2.1.reactive函数: 定义复杂类型的数据
      const account = reactive({
        username: "coderwhy",
        password: "123456"
      })
      function changeAccount() {
        account.username = "kobe"
      }

      // 2.2.ref函数: 定义简单类型的数据(也可以定义复杂类型的数据)
      // counter定义响应式数据
      const counter = ref(0)
      function increment() {
        counter.value++
      }

   

      return {
        message,
        changeMessage,
        account,
        changeAccount,
        counter,
        increment,
        info
      }
    }
  }
</script>

<style scoped>
</style>



3 Reactive 和 ref 的应用场景

 setup() {
      // 定义响应式数据: reactive/ref
      // 强调: ref也可以定义复杂的数据
      const info = ref({})
      console.log(info.value)

      // 1.reactive的应用场景
      // 1.1.条件一: reactive应用于本地的数据
      // 1.2.条件二: 多个数据之间是有关系/联系(聚合的数据, 组织在一起会有特定的作用)
      const account = reactive({
        username: "coderwhy",
        password: "1234567"
      })

      const username = ref("coderwhy")
      const password = ref("123456")

      // 2.ref的应用场景: 其他的场景基本都用ref(computed)
      // 2.1.定义本地的一些简单数据
      const message = ref("Hello World")
      const counter = ref(0)
      const name = ref("why")
      const age = ref(18)

      // 2.定义从网络中获取的数据也是使用ref
      // const musics = reactive([])
      const musics = ref([])
      onMounted(() => {
        const serverMusics = ["海阔天空", "小苹果", "野狼"]
        musics.value = serverMusics
      })


      return {
        account,
        username,
        password,
        name,
        age
      }
    }
  }
</script>

5 computed

在这里插入图片描述

6 在setup中使用ref获取元素或者组件

在这里插入图片描述

7 生命周期钩子

在这里插入图片描述

8 侦听数据的变化 watch

在这里插入图片描述

<template>
  <div>AppContent</div>
  <button @click="message = '你好啊,李银河!'">修改message</button>
  <button @click="info.friend.name = 'james'">修改info</button>
</template>

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

  export default {
    setup() {
      // 1.定义数据
      const message = ref("Hello World")
      const info = reactive({
        name: "why",
        age: 18,
        friend: {
          name: "kobe"
        }
      })

      // 2.侦听数据的变化
      watch(message, (newValue, oldValue) => {
        console.log(newValue, oldValue)
      })
      watch(info, (newValue, oldValue) => {
        console.log(newValue, oldValue)
        console.log(newValue === oldValue)
      }, {
        //立即执行一次
        immediate: true
      })

      // 3.监听reactive数据变化后, 获取普通对象,而不是代理对象
      watch(() => ({ ...info }), (newValue, oldValue) => {
        console.log(newValue, oldValue)
      }, {
        immediate: true,
        deep: true
      })

      return {
        message,
        info
      }
    }
  }
</script>

<style scoped>
</style>

侦听自动捕获依赖:watchEffect

在这里插入图片描述
在这里插入图片描述

<template>
  <div>
    <h2>当前计数: {{ counter }}</h2>
    <button @click="counter++">+1</button>
    <button @click="name = 'kobe'">修改name</button>
  </div>
</template>

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

  export default {
    setup() {
      const counter = ref(0)
      const name = ref("why")

      // watch(counter, (newValue, oldValue) => {})

      // 1.watchEffect传入的函数默认会直接被执行
      // 2.在执行的过程中, 会自动的收集依赖(依赖哪些响应式的数据)
      const stopWatch = watchEffect(() => {
        console.log("-------", counter.value, name.value)

        // 判断counter.value > 10
        if (counter.value >= 10) {
        //停止监听
          stopWatch()
        }
      })

      return {
        counter,
        name
      }
    }
  }
</script>

<style scoped>
</style>

9 hook封装

Composition API的主要作用就是利用函数式编程,可以很容易的将可以复用的代码抽取出来(因为代码可以写在一起),这些被抽取的,单独功能的代码,被称为hook(钩子).不是真正的hook,而是类似hook的能力.

hook的作用和组件一样都是封装,然而组件偏向于UI的封装,而hook偏向于功能逻辑,状态管理.
也就是说Vue3可以利用Composition API将optionsAPI的内容,抽取为hook功能,给组件使用,组件的功能被抽取出来了,只剩下UI由组件实现.

1 hook封装,计数器

useCounter.js

import { ref, onMounted } from 'vue'

export default function useCounter() {
  const counter = ref(0)
  function increment() {
    counter.value++
  }
  function decrement() {
    counter.value--
  }
  //模拟网络环境,初始化值
  onMounted(() => {
    setTimeout(() => {
      counter.value = 989
    }, 1000);
  })

  return {
    counter,
    increment,
    decrement
  }
}

2 使用hook

<template>
  <h2>About计数: {{ counter }}</h2>
  <button @click="increment">+1</button>
  <button @clcik="decrement">-1</button>
</template>

<script>
  import useCounter from '../hooks/useCounter'

  export default {
    setup() {
      //使用hook函数
	  //const { counter, increment, decrement } = useCounter()
	  // return {
      //   counter,
      //   increment,
      //   decrement,
      //   }
	
	
      return {
      //使用hook函数的等价写法
        ...useCounter()
      }
    }
  }
</script>

10 script setup语法糖

在这里插入图片描述
使用这种语法糖,在需要使用组件时,不再需要使用components声明,只要import导入就可以直接使用

顶层的绑定会被暴露给模板

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/577459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拉格朗日松弛与拉格朗日分解 lagrangian relaxation

首先介绍下拉格朗日松弛的出发点&#xff0c;以及该方法所属的门类&#xff1b;再介绍下拉格朗日松弛法需要处理的难点和注意事项。 目录 1.拉格朗日松弛出发点 2.拉格朗日松弛所属分类 3.拉格朗日松弛 3.1 拉格朗日松弛&#xff08;松弛全部&#xff0c;转化为无约束问题…

【秒懂·云原生】微服务篇 —— Spring Cloud Commons:公共抽象

&#x1f50e;这里是【秒懂云原生】&#xff0c;关注我学习云原生不迷路 &#x1f44d;如果对你有帮助&#xff0c;给博主一个免费的点赞以示鼓励 欢迎各位&#x1f50e;点赞&#x1f44d;评论收藏⭐️ &#x1f440;专栏介绍 【秒懂云原生】 目前主要更新微服务&#xff0c;…

ClickHouse安装部署

—仅供学习 如有侵权 请联系删除– 一、下载 选择Tgz安装包安装 下载地址&#xff1a;Index of /clickhouse/tgz/ 选择stable目录下的安装包&#xff0c;采用21.9.4.35版本&#xff0c;分别是&#xff1a; [roothadoop08 resources]# ll 总用量 1023548 -rw-r--r--. 1 root …

JavaEE HTTP应用层协议

HTTP应用层协议 文章目录 JavaEE & HTTP应用层协议1. HTTP的报文协议格式1.1 fiddler介绍1.2 HTTP请求1.3 HTTP响应 2. HTTP请求与响应2.1 首行2.1.1 http方法2.1.2 URL2.1.3 版本号 2.2 header与空行2.2.1 Host2.2.2 Content-Type 与 Content-Length2.2.3 User-Agent&…

基于JavaWeb的事业单位公务员招考信息发布平台-考务考试报名系统

本文介绍了使用Java技术开发公务员招考信息发布平台的设计与实现过程&#xff0c;首先对实现该系统的技术进行分析&#xff0c;说明选择Java和MySQL数据库的必要性&#xff0c;然后对公务员招考信息发布平台的需求进行分析。并接着对系统进行设计&#xff0c;包括架构设计、功能…

用Python实现问卷星自动填写(超详细!!!)

用Python实现问卷星自动填写&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 前言一、配置环境1.1安装依赖1.2安装驱动 二、实战处理2.1、引入库函数2.2、程序所需函数详解&#xff08;1&#xff09;自定义单选函数&#xff08;2&#xff09;自定义多选函…

基于STM32的DHT11温湿度测量

目录 1.简介 2.主要参数 3.引脚说明 4.注意事项 5.单总线协议 6.数据格式 7.工作时序 8.分模块编写程序 1.简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术&#xff0c;确保产品具有极高的可靠…

【数据分类】PNN数据分类 概率神经网络数据分类【Matlab代码#31】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 模式识别之数据分类2. 概率神经网络&#xff08;PNN&#xff09;3. 基于PNN的数据分类步骤4. 部分代码展示5. 仿真结果展示6. 资源获取说明 【可更换其他算法&#xff0c;获取资源请见文章…

web基础与HTTP服务

web基础与HTTP服务 一、web基础1、域名1.域名概述2.域名的结构3.域名注册 2、网页与HTML1.网页概述网页分类动态网页语言编程语言如下 2.HTML概述HTML 基本标签Web概述 二、HTTP服务1、HTTP版本2、HTTP请求方法3、GET 和 POST 区别4、HTTP状态码1.HTTP常见状态码 5、HTTP 请求流…

关于安卓以及微软用户chatgpt上一篇文章如今第五点无法正常进入更新解决方法以及附加本地部署

目录 一、问题出现&#xff1a; 1、问题&#xff1a; 原因&#xff1a; 二、解决办法&#xff08;本地部署chatgpt&#xff09; 1、解决&#xff08;国内网络使用真的chatgpt并非镜像&#xff09;一次部署终生使用 第一步&#xff1a; ​编辑第二步&#xff1a; 三、实现结…

S32K144开发板

目录 一&#xff0e;S32K144开发板概述 二&#xff0e;产品技术和功能规格 三&#xff0e;开发环境 1.S32K144的开发环境主流是这么三种&#xff1a; 2.开发板Demo工程 四&#xff0e;S32K144开发板实物图 五、汽车大灯硬件架构 一&#xff0e;S32K144开发板概述 S32K14…

Linux (centos)中文乱码问题解决 及说明

首先要区别3个概 &#xff1a;编码集、字符集、字体 是完全不同的东西&#xff0c;我们要解决的是字符集问题。 当一个系统初始化完毕后&#xff0c;会生成一个 /usr/lib/locale/locale-archive 文件&#xff0c;这个是字符集二进制文件&#xff0c;是系统不同语言运行的核心&…

计算机网络四 网络层

网络层的作用 网络层是计算机网络中的一个重要层次&#xff0c;它的主要作用是实现不同网络之间的通信和数据传输。网络层通过将数据分组并添加路由信息&#xff0c;使得数据可以在不同的网络之间传输。 网络层功能 异构网络互连 异构网络互连是指将不同类型的网络连接起来…

C++ 学习 ::【基础篇:07】:C++ C11 标准中 关键字 auto 的基本介绍与使用

本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大特性等&#…

redis 五种数据类型简介

redis的五种数据类型是&#xff1a;1、string&#xff08;字符串&#xff09;&#xff1b;2、hash&#xff08;哈希&#xff09;&#xff1b;3、list&#xff08;列表&#xff09;&#xff1b;4、set&#xff08;集合&#xff09;&#xff1b;5、sort set &#xff08;有序集合…

【初识 Docker | 中级篇】 Docker 安装 MySQL

文章目录 前言一、安装 docker1、安装docker2、安装docker-compose 二、mysql 单机安装1.创建mysql配置1.1.创建目录1.2.创建docker-compose.yml 2.启动mysql容器 三、mysql 主从复制安装1.主服务器容器配置1.1.修改my.cnf配置文件1.2.重启容器实例&#xff0c;创建同步用户 2.…

【 TensorFlow】URLError: <urlopen error no host given> 错误的 有效的解决方法

URLError: 错误的 有效的解决方法&#x1f60e; 前言&#x1f64c;错误运行截图&#xff1a;解决方案流程图&#xff1a;运行成功截图 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&a…

opencv_c++学习(二十六)

一、ORB特征点 ORB特征点计算步骤: Step1:选择某个像素点作为中心点P&#xff0c;其像素值为I。 Step2:设置判定FAST角点(其方法比较两个像素之间的差值)的像素阈值&#xff0c;例如 T p 20 % ∗ I p T_p 20\%*I_p Tp​20%∗Ip​ Step3:比较中心点的像素值与半径为3的圆周上…

传统加密技术(恺撒+仿射)

1.Caesar cipher恺撒密码 是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0c;明文中的所有字母都在字母表上向后&#xff08;或向前&#xff09;按照一个固定数目进行偏移后被替换成密文。 加密对象&#xff1a;英文字母 密钥格式&#xff1a;k&#…

哈希表、unordered_map和unordered_set模拟

目录 哈希表 闭散列 开散列 unordered_map和unordered_set模拟 对开散列的哈希表改造 unordered_set模拟 unordered_map模拟 哈希表 哈希概念&#xff1a;通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系&#xff0c;那么在查找时通过该…