Vue3组合式API

news2024/11/16 19:58:06

Vue3组合式API

    • composition API 和 options API
    • 体验 composition API
    • setup 函数
    • reactive 函数
    • ref 函数
    • script setup语法

composition API 和 options API

  1. vue2 采用的就是 optionsAPI

    (1) 优点:易于学习和使用, 每个代码有着明确的位置 (例如: 数据放 data 中, 方法放 methods中)

    (2) 缺点: 相似的逻辑, 不容易复用, 在大项目中尤为明显

    (3) optionsAPI 可以通过mixins 提取相同的逻辑, 但是也并不是特别好维护

  2. vue3 新增的就是 compositionAPI

    (1) compositionAPI 是基于 逻辑功能 组织代码的, 一个功能 api 相关放到一起

    (2) 即使项目大了, 功能多了, 也能快速定位功能相关的 api

    (3) 大大的提升了 代码可读性可维护性

  3. vue3 推荐使用 composition API, 也保留了options API

    即就算不用composition API, 用 vue2 的写法也完全兼容!!

体验 composition API

需求: 鼠标移动显示鼠标坐标 x, y

在这里插入图片描述
options API 版本

<template>
  <div>当前鼠标位置</div>
  <div>x: {{ mouse.x }}</div>
  <div>y: {{ mouse.y }}</div>
  <div>当前点击次数:{{ count }}</div>
  <button @click="add">点击</button>
</template>

<script>
export default {
  // vue2 中采用的是 options API
  // 常见的配置项: data created methods watch computed components
  data() {
    return {
      mouse: {
        x: 0,
        y: 0,
      },
      count: 0,
    }
  },
  mounted() {
    document.addEventListener('mousemove', this.move)
  },
  methods: {
    move(e) {
      this.mouse.x = e.pageX
      this.mouse.y = e.pageY
    },
    add() {
      this.count++
    },
  },
  destroyed() {
    document.removeEventListener('mousemove', this.move)
  },
}
</script>

composition API 版本

<template>
  <div>当前鼠标位置</div>
  <div>x: {{ mouse.x }}</div>
  <div>y: {{ mouse.y }}</div>
  <div>当前点击次数:{{ count }}</div>
  <button @click="add">点击</button>
</template>

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

export default {
  setup() {
    const count = ref(0)
    const add = () => {
      count.value++
    }

    const mouse = reactive({
      x: 0,
      y: 0,
    })

    const move = (e) => {
      mouse.x = e.pageX
      mouse.y = e.pageY
    }
    onMounted(() => {
      document.addEventListener('mousemove', move)
    })
    onUnmounted(() => {
      document.removeEventListener('mousemove', move)
    })
    return {
      count,
      add,
      mouse,
    }
  },
}
</script>

抽离逻辑

App.js
import useMouse from './mouse'
import useCount from './count'

export default {
  setup() {
    const mouse = useMouse()
    const { add, count }  = useCount()
    return {
      count,
      add,
      mouse,
    }
  },
}

mouse.js
import { onMounted, onUnmounted, reactive,  } from 'vue'
function useMouse() {
  const mouse = reactive({
    x: 0,
    y: 0,
  })
  const move = (e) => {
    mouse.x = e.pageX
    mouse.y = e.pageY
  }
  onMounted(() => {
    document.addEventListener('mousemove', move)
  })
  onUnmounted(() => {
    document.removeEventListener('mousemove', move)
  })
  return mouse
}

count.js
import { ref } from 'vue'
function useCount() {
  const count = ref(0)
  const add = () => {
    count.value++
  }
  return {
    count,
    add,
  }
}

setup 函数

composition api的使用, 需要配置一个setup 函数 ----- 现在vue 3.2以上,已经不推荐这种写法

  1. setup 函数是一个新的组件选项, 作为组件中 compositionAPI 的起点
  2. 从生命周期角度来看, setup 会在 beforeCreate 钩子函数之前执行
  3. setup 中不能使用 this, this 指向 undefined
  4. 在模版中需要使用的数据和函数,需要在 setup 返回。
<template>
  <div class="container">
    <h1 @click="say()">{{msg}}</h1>
  </div>
</template>

<script>
export default {
  setup () {
    console.log('setup执行了')
    console.log(this)
    // 定义数据和函数
    const msg = 'hi vue3'
    const say = () => {
      console.log(msg)
    }

    return { msg , say}
  },
  beforeCreate() {
    console.log('beforeCreate执行了')
    console.log(this)
  }
}
</script>

reactive 函数

前置说明:

  1. setup 需要有返回值, 只有返回的值才能在模板中使用
  2. 默认普通的数据, 不是响应式的

为什么需要用一个导入一个: 是为了让我们的项目尽可能的轻量化,在tree-shaking 摇树,打包的时候,尽可能的去掉没有使用的代码

作用: 传入一个复杂数据类型,将复杂类型数据, 转换成响应式数据 (返回该对象的响应式代理)

<template>
  <div>{{ obj.name }}</div>
  <div>{{ obj.age }}</div>
  <button @click="obj.name = 'ls'">改值</button>
</template>

<script>
import { reactive } from 'vue'

export default {
  setup () {
    // 1. setup 需要返回值, 返回的值才能在模板中使用
    // 2. 默认的普通的值不是响应式的, 需要用 reactive 函数
    const obj = reactive({
      name: 'zs',
      age: 18
    })
    
    const obj2 = { test: '测试数据' }

    return {
      obj
    }
  }
}
</script>

ref 函数

reactive 处理的数据, 必须是复杂类型, 如果是简单类型无法处理成响应式, 所以有 ref 函数!

作用: 对传入的数据(一般简单数据类型),包裹一层对象, 转换成响应式。

  1. ref 函数接收一个的值, 返回一个ref 响应式对象, 有唯一的属性 value
  2. 在 setup 函数中, 通过 ref 对象的 value 属性, 可以访问到值
  3. 在模板中, ref 属性会自动解套, 不需要额外的 .value
  4. ref函数也支持传入复杂类型,传入复杂类型,也会做响应式处理
<template>
  <div>{{ money }}</div>
  <button @click="money++">改值</button>
</template>

<script>
import { reactive, ref } from 'vue'
export default {
  setup() {
    let money = ref(100)
    money.value++
    return {
      money
    }
  }
}
</script>

ref 和 reactive 的最佳使用方式:

  • 明确的对象,明确的属性,用reactive,其他用 ref
  • 从vue3.2之后,更推荐使用ref

script setup语法

script setup是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。相比于普通的 script 语法更加简洁

要使用这个语法,需要将 setup attribute 添加到 <script> 代码块上:

<script setup>
console.log('hello script setup')
</script>

顶层的绑定会自动暴露给模板,所以定义的变量,函数和import导入的内容都可以直接在模板中直接使用

<template>
  <div>
    <h3>根组件</h3>
    <div>点击次数:{{ count }}</div>
    <button @click="add">点击修改</button>
  </div>
</template>

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

const count = ref(0)
const add = () => {
  count.value++
}
</script>

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

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

相关文章

Mac 打开JD-GUI报错:ERROR launching ‘JD-GUI‘

目录一、JD-GUI下载二、JD-GUI报错信息三、解决方案1、查找JD-GUI包内容2、修改universalJavaApplicationStub.sh文件一、JD-GUI下载 JD-GUI下载地址&#xff1a;https://github.com/java-decompiler/jd-gui/releases 二、JD-GUI报错信息 Mac系统版本&#xff1a;11.3 JD-GUI…

智能车|自主导航 ROS Navigation Stack 功能包 简介与编译

智能车|自主导航 ROS Navigation Stack 功能包 简介与编译前言功能包下载与编译前言 ros功能包&#xff1a;Navigation ros wiki&#xff1a;http://wiki.ros.org/navigation github 地址&#xff1a;https://github.com/ros-planning/navigation 功能包简介&#xff1a; ROS…

第一次创业,注册什么类型的公司?

前言 几乎每一个打工者都有一颗当老板的心&#xff0c;大喊一声&#xff1a;"大丈夫生居天地间,岂能郁郁久居人下"&#xff0c;于是一拍桌子就辞职创业&#xff0c;现实往往都是潦草收场&#xff0c;看下面一段统计数据&#xff1a; 中国小微企业平均存活周期4.13年&…

通过Bypass UAC进行权限提升

什么是UAC用户账户控制&#xff08;User Account control&#xff0c;UAC&#xff09;是windows系统采用的一种控制机制&#xff0c;可以阻止自动安装未经授权的应用 并防止意外更改系统设置&#xff0c;有助于防止恶意软件损坏计算机。用户账户控制程序使应用程序和任务始终在…

2.5.3 PCIe——物理电气子层——动态均衡

因为PCIE 3.0信号的速率可以达到8Gb/s&#xff0c;而且链路通道走线也可能会很长&#xff0c;这可能会导致高速信号衰减过大&#xff0c;为了补偿channel的衰减需要增加传输信号的高频成分&#xff0c;让高频和低频能量差不多&#xff0c;这就是equalization。因此在PCIE 3.0的…

DNS Sec

域名系统&#xff08;Domain Name System&#xff0c;DNS&#xff09;响应消息中给出域名服务器的IP地址、完全合格的域名与IP地址之间的绑定关系等&#xff0c;因此&#xff0c;DNS响应消息的真实性和完整性直接关系用户访问网络过程的安全性。为了保证DNS响应消息的真实性和完…

Python中的条件分支和循环语句

1.条件分支语句 &#xff08;1&#xff09; 第 1 种是判断一个条件&#xff0c;如果这个条件成立&#xff0c;就执行其包含的某条语句或某个代码块。 if 条件:某条语句或某个代码块&#xff08;2&#xff09;第 2 种同样是判断一个条件&#xff0c;跟第 1 种的区别是如果条件…

易控智驾:用最“接地气”的自动驾驶,写一本“矿区修炼手册”

CES2023刚刚在拉斯维加斯闭幕&#xff0c;作为行业风向标&#xff0c;本届展会上元宇宙、汽车技术等重要科技依然是大亮点。宝马、英特尔等厂商&#xff0c;依然带来了有趣的消费级产品&#xff0c;但也有更多的工业与制造业产品、方案&#xff0c;带着更多的科技智能属性脱颖而…

网络原理(TCP/IP五层协议)(一)

目录TCP/IP五层协议栈应用层传输层TCP/IP五层协议栈 应用层 在应用层最重要的事情&#xff0c;就是“设计并实现一个应用层协议”。 举个例子&#xff0c;公司在开发一个项目&#xff0c;点外卖的软件。 当前要开发一个功能&#xff0c;叫做获取用户的订单历史。(在数据库里&…

软件设计(三)

软件设计&#xff08;二&#xff09;https://blog.csdn.net/ke1ying/article/details/128794008?spm1001.2014.3001.5502 21、一颗二叉树的高度为h&#xff0c;则该二叉树 最多有2的h次方-1个节点。 22、图的遍历是指对图中所有顶点进行访问且只访问一次的过程&#xff0c;可…

《第一行代码》 第一章:第一行Android代码

1&#xff0c;Android系统架构 2&#xff0c;开发的四大组件 3&#xff0c;丰富的系统控件 Android 系统为开发者提供了丰富的系统控件&#xff0c;使得我们可以很轻松地编写出漂亮的界面。当然如果你品位比较高&#xff0c;不满足于系统自带的控件效果&#xff0c;也完全可以…

java 基于ssm的在线音乐分享平台 idea mysql

根据一般在线音乐平台的功能需求分析&#xff0c;本系统的功能模块如下&#xff1a; &#xff08;1&#xff09;在个人中心&#xff0c;管理员可以修改自己的用户名和登录密码。 &#xff08;2&#xff09;在用户管理模块中&#xff0c;可以查看用户的信息&#xff0c;和进行修…

动态规划的万能公式(三类题型)

本文主要介绍如何用Python解决动态规划的问题&#xff0c;在动态规划问题中&#xff0c;最主要的是找到问题的dp&#xff0c;即找到状态转移函数&#xff0c;当你找到了该问题的状态转移函数&#xff0c;你就成功了一半&#xff0c;下面我将介绍三类最主要的题型&#xff0c;对…

FreeRTOS事件实验

前面章节我们学习了如何使用信号量来实现同步&#xff0c;但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步&#xff0c;此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法&#xff0c;那 就是事件标志组。本…

TypeScript基础使用

TypeScript介绍&#xff1a; TypeScript 是 JavaScript 的一个超集 它的第一个版本发布于 2012 年 10 月&#xff0c;vue3和react也完全支持typescrpt 为什么选择 TypeScript&#xff1a; 类型系统实际上是最好的文档&#xff0c;大部分的函数看看类型的定义就可以知道如何使…

高性能SQL-数据库性能优化

数据库性能优化涉及各个方面,本文就总多个角度介绍一下数据库性能优化的方法 1.表设计 聚集索引 一个表只能有一个聚集索引&#xff0c;数据在磁盘上的排练顺序与聚集索引一致&#xff0c;根据业务仔细设定聚集索引&#xff0c;值递增的不可修改的字段才能设置聚集索引&…

海康摄像头Linux开发

官方sdk下载 https://open.hikvision.com 点击下载就行了 Ubuntu摄像头抓拍测试 我们使用Linux64 纯净版测试 接好海康摄像头&#xff0c;通电&#xff0c;并设置号ip和用户名、密码。如果有现成的&#xff0c;可以去查一下就知道了 先把设备下载的文件解压并放到Ubuntu下面…

redis的渐进式rehash机制

简述 在redis的字典&#xff08;dict.h&#xff09;实现中&#xff0c;当哈希表保存的键值对太多或者太少时&#xff0c;会触发扩展/收缩&#xff1b; 触发收缩&#xff1a;负载因子小于 0.1触发扩展&#xff1a;以下任一条件符合即可 服务器目前没有在执行 BGSAVE 命令或者 …

k8s核心资源

一、NameSpace对资源进行隔离&#xff0c;比如开发环境和测试环境等。命令# 查看所有命名空间的资源 kubectl get pod -A # 查看单独某个命名空间下的资源 kubectl get pod -n <空间名称> # 查看所有命名空间 kubectl get ns # 创建命名空间 kubectl create ns <空间名…

SpringAMQP

SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;Spring AMQP SpringAMQP提供了三个功能&#xff1a; 自动声明队列、交换机及其绑定关系&#xff08;RabbitAdmin&…