Vue3 Composition API(案例)

news2024/12/24 11:44:22

前言:如果你是从vue2转到vue3的一份子,那么你重点学一下核心内容Composition API 。vue3的更新使代码写起来更加清晰,而且更接近于原生开发,对TS支持友好,现在我们来学习一下API。

如果你也想学一下TS那么请看这里 带你学习语法Typescript

文章目录

    • setup api
      • reactive
      • ref
      • readonly
      • 了解:reactive判断的api
      • torefs
      • toref
      • ref其他api
      • customRef
      • computed
      • watchEffect
      • watchEffect的停止侦听
      • watchEffect清除副作用
      • setup中使用ref
      • watchEffect的执行时机
      • 调整watchEffect的执行时机
      • Watch的使用
      • 声明周期钩子

setup api

setup(props,context){
  // 不可以通过this获取所以要通过参数获取
  console.log(props.message)
  console.log(context.attrs.id + ' ' + context.attrs.class)
  console.log(context.emit)
  console.log(context.slots)

返回值return{ }可以代替 data(){}可以在模板中直接引用

setup()函数里可以写函数 可以代替methon{} 写方法

reactive

// 响应式方法一

// const state = reactive({
//   title: 'hello kun',
//   content: 100
// })

ref

// 响应式方法二 挂载后可以直接在template中引用,不需要.value,vue自动解包为你省了一步
// 但是下面方法里依然还是要.value的
//template中浅层的解包,如果嵌套了不能解包。但是reactive中嵌套可以解包,但是我们不建议这么做
const title = ref('hello kun')
const content = ref(100)

readonly

一个proxy的set方法被劫持,可以传用但是不能修改,返回只读的代理

1,普通对象

无法响应式,比如我们可以传入到子组件,子组件无法修改但是无法做到响应式

2,传入reactive对象

子组件不能改,但是是响应式的,可以在这里改state1 或者ref的state3
const state1 = reactive({
  name:'kun',
  height:1.88
})
const state2 = readonly(state1)

3, 传入ref对象

const state3 = ref("why")
const state4 = readonly(state3)

了解:reactive判断的api

isproxy

检查对象是否是由 reactive 或 readonly创建的 proxy

isReactive

检查对象是否是由 reactive创建的响应式代理:

如果该代理是 readonly 建的,但包裹了由 reactive 创建的另一个代理,它也会返回 true;

isReadonly

检查对象是否是由 readonly 创建的只读代理。

toRaw

返回 reactive 或 readonly 代理的原始对象(建议保留对原始对象的持久引用。请谨慎使用)。

shallowReactive

创建一个响应式代理,它跟踪其自身 property 的响应性,但不执行嵌套对象的深层响应式转换 (深层还是原生对象)。

shallowReadonly

创建一个 proxy,使其自身的 property 为只读,但不执行嵌套对象的深度只读转换(深层还是可读、可写的)。

torefs

对reactive返回的对象进行解构获取的值,那么无论是修改结构后的变量,还是修改reactive返回的state对象,数据都不是响应式的,

vue提供了各函数torefs,可以将reactive返回的对象中的属性都转成ref

 const state = reactive({
      name:'zlk',
      age:18
    })
    let {name,age} = toRefs(state);
    const btnclick = () => {
      // state.name = 'kun'
      name.value = 'kun'
    }

state.name和name.value建立链接,任何一个修改都会变化

toref

如果我们只希望转换一个属性为ref,而不是整个reactive对象,可以使用toref方法

const state = reactive({
  name:'zlk',
  age:18
})
const name = toRef(state,'name')
const {age} = state;

const btnclick = () => {
  // state.name = 'kun'
  name.value = 'kun'
}

ref其他api

const info = shallowRef({name:'kun'})

const btnclick = () => {
  info.value.name = 'feiji'
  triggerRef(info)
}

shallowRef浅层ref,未响应式

triggerRef手动触发后,响应式了

customRef

<template>
<div>
  <input v-model="message">
  <h3>{{message}}</h3>
</div>
</template>


const message = ref('hello');
return{
  message
}

这是普通双向绑定,

我们来自定义一个ref,做防抖

import {customRef} from "vue";

export function useref(value,delay = 1000){
    let timer;
    return customRef((track, trigger) => {
        return{
            get(){
                track(); // 收集依赖
                return value 
            },
            set(newvalue){
                clearTimeout(timer)  // 防抖
                timer = setTimeout(() => {
                    value = newvalue  //赋值
                    trigger(); //更新模板依赖
                },delay)
            }
        }
    })
}

computed

方式一:接收一个getter函数,并为 getter 函数返回的值,返回一个不变的 ref 对象

setup(){
  let first = ref("kun");
  let last = ref("ba");
  let haha = 'nihao'
  const fullName = computed(() => {
    return first.value + ' ' + last.value
  })
  return{
    first,
    last,
    fullName,
    haha
  }
}

方式二:接收一个具有 get 和 set 的对象,返回一个可变的**(可读写)ref 对象**;

setup(){
  let first = ref("kun");
  let last = ref("ba");


  let fullName = computed({
    get:() => {
      return first.value + ' ' + last.value
    },
    set:(newvalue) => {
      const names = newvalue.split(" ");
      first.value = names[0];
      last.value = names[1];
    }
  })

  const btnclick = () => {
    fullName.value = "coder kun"
  }

watchEffect

watchEffect传入的函数会被立即执行一次,并且在执行的过程中会收集依赖;

只有收集的依赖发生变化时,watchEffect传入的函数才会再次执行;

const name = ref("hello")
const age = ref("18")

watchEffect(() => {
  console.log("watcheffect",name.value,age.value)
})
const btnclick = () => {
  name.value = "hi"
  age.value = 23
}
return{
  name,
  age,
  btnclick
}

watchEffect的停止侦听

setup(){
  const name = ref("hello")
  const age = ref("18")

 const stop = watchEffect(() => {
    console.log("watcheffect",name.value,age.value)
  })
  const btnclick = () => {
    // name.value = "hi"
    // age.value = 23
    age.value++;
    if (age.value > 25){
      stop();
    }
  }

这个时候我们可以获取watchEffect的返回值函数,调用该函数即可。

watchEffect清除副作用

setup中使用ref

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkkYrxak-1669985503691)(C:\Users\jia\AppData\Roaming\Typora\typora-user-images\image-20221004012044488.png)]

watchEffect的执行时机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1XWWW8P-1669984040392)(C:\Users\jia\AppData\Roaming\Typora\typora-user-images\image-20221004012322694.png)]

setup(){
  const name = ref("zlk");
  const age = ref(18);
  const titleref = ref(null)
  const stopwatch = watchEffect(() => {
    console.log(titleref.value)
  },{
    flush:"post"
  })

调整watchEffect的执行时机

{
flush:“post”
}

Watch的使用

单个数据源监听

一个getter函数:但是该getter函数必须引用可响应式的对象(比如reactive或者ref);

直接写入一个可响应式的对象,reactive或者ref(比较常用的是ref);

ref

// const name = ref('zlk')
// const age = ref(18)

// watch(name , (newname,oldname) => {
//   console.log(newname,oldname)
// })

reactive

// const state = reactive({
//   name:'zlk',
//   age:18
// })
// watch(() => state.name, (newname,oldname) => {
//   console.log(newname,oldname)
// })

侦听器还可以使用数组同时侦听多个源

// watch([name,age], (newname,oldname) => {
//   console.log(newname,oldname)
// })

侦听一个数组或者对象 ,使用一个getter函数,并且对可响应对象进行解构

// const names = reactive(["abc","bnm","nba"])
// watch(() => [...names],(newvalue,oldvalue) => {
//   console.log(newvalue,oldvalue)
// })

侦听一个深层的侦听,那么依然需要设置 deep 为true:

p也可以传入 immediate 立即执行;

声明周期钩子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVomp9Jc-1669984040402)(C:\Users\jia\AppData\Roaming\Typora\typora-user-images\image-20221006145743691.png)]

setup(){
  const content = ref(0);
  console.log("开始创建组件")
  onMounted(() => {
    console.log("onMounted-组件挂载到页面之后")
  })
  onBeforeMount(() => {
    console.log("onBeforeMount-组件挂载到页面之前")
  })
  onUpdated(() => {
    console.log("onUpdated-组件更新之后")
  })
  onActivated(() => {
    console.log("onActivated")
  })
  onUnmounted(() => {
    console.log("onUnmounted")
  })
  onBeforeUpdate(() => {
    console.log("onBeforeUpdate-组件更新之前")
  })
  const btnclick = () => {
    content.value++;
  }
  return{
    content,
    btnclick
  }
}

created 和 beforecreate直接在setup里面写就可以了,vue3取消了,例如之前我们请求数据在created中请求,现在可以直接在setup里面写axios代码不用函数包裹调用

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

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

相关文章

力扣(LeetCode)1769. 移动所有球到每个盒子所需的最小操作数(C++)

暴力循环 直观模拟&#xff0c;对于某个固定的盒子&#xff0c;可以遍历所有盒子&#xff0c;∑\sum∑ 遍历的盒子里的球数 \times 遍历的盒子到固定的盒子的距离&#xff0c;得移动所有球到固定盒子的最小操作数。依次固定所有盒子&#xff0c;遍历&#xff0c;得到答案。 c…

嵌入式Linux 开发经验:platform_driver_register 的使用方法

前言 嵌入式Linux 设备驱动开发时&#xff0c;经常遇到平台驱动 platform_driver_register 的注册&#xff0c;最近深入了看了驱动开发为何使用平台驱动 开发一个设备驱动时&#xff0c;为了实现 设备的 打开、关闭、控制等操作&#xff0c;可以注册为 Linux misc 设备&#x…

Ra-08透传固件应用

目录1、功能介绍2、硬件接线3、固件烧录4、应用说明指令说明应用示例5、联系我们1、功能介绍 Ra-08透传固件主要功能有&#xff0c;设置发送或者接收模式&#xff0c;配置各个射频参数&#xff0c;设置本地地址与发送的目标地址&#xff0c;设置进入睡眠模式等。 2、硬件接线…

vite+ts-5-Sequelize框架优化

random recording 随心记录 What seems to us as bitter trials are often blessings in disguise. 看起来对我们痛苦的试炼&#xff0c;常常是伪装起来的好运。 此系列是一个前后端整合项目&#xff0c;跟往期关联&#xff0c;链接传送到达&#xff1a; 1.vitets-1-前期准备(尽…

FreeRtos于嵌入式环境的应用

FreeRtos操作系统 首先&#xff0c;应该介绍什么是FreeRtos&#xff0c;他于单片机而言就是一个管理器&#xff0c;作为管理者管理嵌入式芯片中的任务&#xff0c;堆栈&#xff0c;中断&#xff0c;队列等等资源&#xff0c;对于操作系统而言&#xff0c;又分为实时操作系统和…

分布式事物-全面详解(学习总结---从入门到深化)

分布式事物处理_认识本地事物 什么是事物 事务就是针对数据库的一组操作&#xff0c;它可以由一条或多条SQL语句组 成&#xff0c;同一个事务的操作具备同步的特点&#xff0c;事务中的语句要么都执 行&#xff0c;要么都不执行。 举个栗子&#xff1a; 你去小卖铺买东西&#…

kafka中partition数量与消费者对应关系以及Java实践(Spring 版本)

文章目录分区理解一、单播模式&#xff0c;只有一个消费者组1. topic只有1个partition2. topic有多个partition,该组内有多个消费者二、广播模式&#xff0c;多个消费者组2.1. 多个消费者组&#xff0c;1个partition2.2. 多个消费者组&#xff0c;多个partition三、Java实践-pr…

谈谈JS二进制:File、Blob、FileReader、ArrayBuffer、Base64

当互联网进入存量时代&#xff0c;增量正在成为行业的稀缺资源。而本地生活服务恰恰是当前互联网行业为数不多的增量。 前瞻产业研究院数据显示&#xff0c;2021年中国互联网本地生活服务行业市场规模达到2.6万亿元&#xff0c;到2025年&#xff0c;其市场规模有望达到4万亿元&…

吉林优美姿文化:抖音店铺怎么优化页面?

要知道&#xff0c;新手开始做直播间影响人气的三大要素就是在线人数&#xff0c;互动量&#xff0c;以及留存率&#xff0c;那么当这些要素都非常高的时候&#xff0c;抖音系统就会自动把你的直播间推荐给更多的观众&#xff0c;获取更多的流量&#xff0c;那么抖音新手怎么开…

简单了解Vue

1、vue概述 Vue是一套前端框架&#xff0c;可以免除原生JavaScript中的DOM操作&#xff0c;简化书写。 基于MVVM&#xff08;Model-View-View Model&#xff09;思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上 vue的官网&#xff1a;https://cn.v…

猿如意---Python3.10版本手把手教学安装和下载.

亲自为大家示范如何使用猿如意以及在猿如意当中下载&#xff0c;安装和使用python3.10版本&#xff0c;让大家喜欢上这款好用的app—猿如意。 文章目录前言一、手把手教你猿如意的安装、下载二、手把手教你Python3.10版本的安装、下载1.找到我需要的工具2.我需要的工具的安装、…

Docker容器

1.什么是Docker&#xff1f; 1.为什么会出现docker&#xff1f; 我们写的代码会接触到好几个环境&#xff1a;开发环境、测试环境以及生产环境等等。多种环境去部署同一份代码&#xff0c;由于环境原因往往会出现软件跨环境迁移的问题&#xff08;也就是“水土”不服&#xf…

Android车载应用开发——DLNA开发浅析

DNLA的建立 DLNA 成立于2003 年6 月24 日, 其前身是DHWG &#xff08;Digital Home Working Group 数字家庭工作组&#xff09;&#xff0c;由Sony、Intel、Microsoft等发起成立、旨在解决个人PC &#xff0c;消费电器&#xff0c;移动设备在内的无线网络和有线网络的互联互通…

基于x86架构的CentOS7虚拟机通过qemu安装ARM架构OpenEuler虚拟机

【原文链接】基于x86架构的CentOS7虚拟机通过qemu安装ARM架构OpenEuler虚拟机 &#xff08;1&#xff09;首先需要有一台CentOS虚拟机&#xff0c;如没有可参考 VMWare安装CentOS7操作系统的虚拟机 安装一台CentOS虚拟机 &#xff08;2&#xff09;安装基础命令 yum install…

17:00面试,17:09就出来了 ,问的实在是太...

从外包出来&#xff0c;没想到算法死在另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到8月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个兄弟内…

java基于PHP+MySQL教务选课管理系统的设计与实现

基于PHP的教务管理系统主要高校内部提供服务,系统分为管理员,教师用户和学生用户三部分。 在基于PHP的教务管理系统中分为管理员用户,教师用户和学生用户三部分,其中管理员用户主要是用来管理教师信息,学生信息,公告信息,课程信息,专业信息和班级信息等内容,教师用户主要是用来…

Cartesi 2022 年 11 月回顾

查看你不想错过的更新2022年12月1日 &#xff0c;欢迎新的建设者加入Cartesi 生态系统并认识更多的新的开发者社区。 从紧张繁忙的11月到12月&#xff0c;11月 ETH Global 因为在旧金山举办了迄今为止最盛大的黑客马拉松活动而轰动一时。有13位才华横溢的学者加入了我们的 Hack…

原生JS的拖拽属性draggable(详解)

摘要 作为h5新增的属性draggable&#xff0c;它能够给与一切的html元素拖动的效果。而在这个属性之下&#xff0c;也有着关于拖动效果的各个方法。 而这一篇文章&#xff0c;主要就是说一下关于draggable属性的使用以及工作场景。 1.了解draggable属性的使用 对我来讲&#…

【单片机基础】初始51单片机

文章目录学习单片机需要掌握的基础知识1、用一句话说透什么是单片机&#xff1a;2、单片机上集成了什么&#xff1f;3、STC89C51/52单片机过时了吗&#xff1f;4、STC89C51和STC89C52有什么区别&#xff1f;5、单片机时序的概念&#xff08;基础知识很重要&#xff09;6、单片机…

基于功能安全的车载计算平台开发:系统层面

相对于功能安全概念阶段&#xff0c;系统阶段更专注于产品的详细设计&#xff0c;涉及系统工程、安全工程和架构设计等不同技术领域。同时&#xff0c;系统阶段也经常扮演着供应链上、下游功能安全的DIA交互阶段&#xff0c;是功能安全中非常重要且考验技术水平的阶段。 01 应…