Vue3高级API的使用

news2024/12/26 21:43:04

介绍

在前面的内容中,我们已经学习到了很多 Vue 3 的基础语法与一些常用的 API。

本节我们将介绍一些高级 API,带领大家进一步深入了解 Vue 3。

主要内容

●customRef()

●markRaw()

●toRaw()

●获取 DOM 元素

customRef 方法

customRef,从字面上直接理解,“自定义的 ref”,这个 API 是用来显式控制其依赖项的跟踪和更新触发的,它接收 track() 和 trigger() 作为参数。



我们可以使用这个 API 来控制视图更新时间,以及动态控制处理设置值,大家听起来可能有点迷茫,我们来看一个具体的例子吧。

现在我们新建一个名为 customRef.html 的文件,并写入下列代码:

<!--customRef.html-->
  </head>

  <body>
    <div id="app">
      <button @click="getRef">触发 get</button>
      <button @click="setRef">触发 set</button>
      <p>ref : {{ msg }}</p>
    </div>
    <script>
      // 导入 customRef
      const { customRef, createApp } = Vue;
      const App = {
        setup() {
          // 显式控制其依赖项跟踪和更新触发
          function TestcustomRef(value) {
            return customRef((track, trigger) => {
              return {
                get() {
                  track();
                  // 触发 get 后,控制台打印信息
                  console.log('get' + value);
                  return value;
                },
                set(newValue) {
                  value = newValue + ' set';
                  // 触发 set 后,控制台打印信息
                  console.log('set' + value);
                  // 可以通过这一步控制视图更新时间
                  setTimeout(() => {
                    trigger();
                  }, 1000);
                },
              };
            });
          }
          const msg = TestcustomRef('原始值');
          const setRef = () => {
            msg.value = '更新设置值';
          };
          const getRef = () => {
            console.log(msg.value);
          };

          return {
            setRef,
            getRef,
            msg,
          };
        },
      };
      createApp(App).mount('#app');
    </script>
  </body>
</html>

我们打开页面,同时打开控制台,来直观地感受一下这个 API 的使用效果

我们看到页面打开的同时,就会触发 get(),在触发 set() 后,视图中的 msg 会在 trigger() 触发后变化,并且我们可以发现,变化后 msg 显示出来的值 set() 中重新定义的。



markRaw() 方法

markRaw() 方法标记一个对象,使其永远不会被转换为代理(Proxy),而是返回对象本身。

我们新建一个名为 markRaw.html 的文件,并在该文件中写入以下代码:

<!-- markRaw.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>markRaw</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
     <script src="https://unpkg.com/vue@3"></script>
  </head>

  <body>
    <div id="app">
      <p>{{ msg }}</p>
      <p>{{ op }}</p>
      <button @click="setmsg">set</button>
    </div>
    <script>
      // 导入 reactive
      const { isReactive, createApp, markRaw, reactive } = Vue;
      const App = {
        setup() {
          const msg = markRaw({
            value: 'markraw',
          });
          // 作为参照
          const op = reactive({
            value: 'reactive',
          });

          const setmsg = () => {
            console.log('markRaw ' + isReactive(reactive(msg))); // false
            console.log('reactive ' + isReactive(op)); // true
            msg.value = '';
            console.log(msg); // 一个普通对象
            console.log(op); // 一个经过 Proxy 加工的响应式对象
          };
          return {
            msg,
            op,
            setmsg,
          };
        },
      };
      createApp(App).mount('#app');
    </script>
  </body>
</html>

isReactive():当我们想要判断一个某个值是否为 reactive() 创建出来的对象,我们可以使用 isReative() 函数。

打开页面,效果如下:

 

toRaw() 方法

这个 API 可以使一个 proxy 只读对象或者 reactive 对象还原为普通对象,它可用于临时读取,而不会引起代理访问/跟踪开销或写入而不会触发更改。



我们来看看官网给出的代码:

toRaw() 方法
这个 API 可以使一个 proxy 只读对象或者 reactive 对象还原为普通对象,它可用于临时读取,而不会引起代理访问/跟踪开销或写入而不会触发更改。

我们来看看官网给出的代码:

但是官网也贴心的给出了提醒:不建议持有对原始对象的持久性引用,需要我们谨慎使用这个 API。

获取 DOM 元素

在 Vue 3 中我们通过提供的 ref 方法定义与页面元素上 ref 相对应的一个响应式对象,同时传入一个 null。



我们创建一个名为 dom.html 的文件。

<!-- dom.html-->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>dom</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <!-- 通过 cdn 方式引入 vue.js 的最新版本 -->
      <script src="https://unpkg.com/vue@3"></script>
  </head>
  <body>
    <div id="app">
      <p ref="p">获取DOM</p>
    </div>
    <script>
      // 导入 reactive
      const { createApp, ref, onMounted } = Vue;
      const App = {
        setup() {
          const p = ref(null);

          onMounted(() => {
            // 初始渲染后,DOM 元素将被分配给 ref
            // p.value 是原生 DOM 对象
            console.log(p.value);
          });
          return {
            p,
          };
        },
      };
      createApp(App).mount('#app');
    </script>
  </body>
</html>

我们来看看控制台的信息

总结

本节我们主要为大家介绍了一些高级 API,我们来简单的复习一下:

●customRef,这个 API 是用来显式控制其依赖项的跟踪和更新触发的,它接收 track() 和 trigger() 作为参数。

●markRaw() 方法标记一个对象,使其永远不会被转换为代理(Proxy),而是返回对象本身。

●toRaw() 方法可以使一个 proxy 只读对象或者 reactive 对象还原为普通对象,它可用于临时读取,而不会引起代理访问/跟踪开销或写入而不会触发更改。

●Vue 3 中我们通过提供的 ref 方法定义与页面元素上 ref 相对应的一个响应式对象,同时传入一个 null,以此达到获取 DOM 元素的目的。

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

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

相关文章

DNS隧道技术原理及其典型应用场景剖析

DNS隧道&#xff08;DNS Tunneling&#xff09;本质为一种网络通信技术&#xff0c;它利用DNS协议在客户端和服务器之间传输数据&#xff0c;主要用来绕过网络限制进行数据隐蔽传输&#xff0c;但在实际场景中&#xff0c;DNS隧道已经成为黑客忠爱的攻击媒介。 1. 概览 DNS是互…

Linux之HugePage的原理与使用

Linux之HugePage的原理与使用 虚拟地址与物理地址虚拟地址物理地址虚拟地址与物理地址的转换 HugePage的概念Linux使用HugePage创建HugePage在程序中使用HugePage 总结 虚拟地址与物理地址 在研究HugePage之前&#xff0c;首先需要明白虚拟地址和物理地址的概念。在计算机系统…

baby_web-CTFWeb进阶wp-攻防世界14

baby_web-CTFWeb进阶wp-攻防世界14 页面显示1.php&#xff0c;可以先访问下源码和index.php&#xff0c;发现内容一致&#xff0c;再查看下cookie和header&#xff0c;看一下有没有藏flag&#xff0c;发现没。 dirsearch一下&#xff0c;发现访问index.php会重定向到1.php。抓…

想一键获取视频文案?2024年这3款好用的视频转文字工具来帮忙

嘿&#xff0c;咱们现在活在21世纪&#xff0c;这信息多得跟啥似的。视频这东西&#xff0c;不管是学东西、娱乐还是工作&#xff0c;都挺受欢迎的&#xff0c;因为它直观、生动嘛。但是&#xff0c;有时候咱们想从视频里提取点有用的信息&#xff0c;还挺费劲的。幸好啊&#…

深圳大学-Java程序设计-选实验2 类的初级应用

实验目的与要求&#xff1a; 实验目的&#xff1a;初步掌握面向对象编程中类的编写。 实验要求&#xff1a; (1).运行第4章课件中第4页、第24页、第32页和第34页中的四个程序&#xff0c;并对每一行语句加上注释。对每一行语句加上注释。在报告中附上程序截图、运行结果截图和…

zerotier安装配置

目录 1.简介1.1.基本概念1.1.1.节点1.它可以是:2.每个节点都有以下特征:3.节点的主要功能包括: 1.1.2.根服务器1.定义&#xff1a;2.功能&#xff1a;3.特点&#xff1a;4.角色&#xff1a;5.安全性&#xff1a;6.与普通节点的区别&#xff1a;7.自托管选项&#xff1a; 1.1.3.…

51单片机的智能电饭煲【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器按键、LED等模块构成。适用于智能电饭锅等相似项目。 可实现功能: 1、LCD1602实时显示温度、运行模式、煮饭等模式的计时时间 2、首先选择电饭锅的模式&#xff0c;如煮饭、煮粥、蒸、煲汤&#…

React入门 9:React Router

1. 什么是路由 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。 以上是中文维基百科对路由的解释。通俗的来讲&#xff0c;把一个地方的信息传输到他想去的目的地的过程&#xff0c;就叫路由。 2. 用代码解释路由 需求&#xff1a…

【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())

获取 Cookie 传统获取 Cookie 这是没有 Spring 的时候&#xff0c;用 Servlet 来获取&#xff08;获取所有的 Cookie&#xff09; Spring MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;也是在 Servlet 的基础上实现的 RequestMapping("/getcookie") …

CubeMX电机驱动以及编码器计数配置

一、选型 电机MG310&#xff1a; 电机驱动板TB6612&#xff1a; STM32F407VETx&#xff1a; 二、CubeMX配置 配置外部时钟&#xff1a; GPIO口配置&#xff1a; 需要四个I/O输出口&#xff1a; PWM口配置&#xff1a; 这里使用的是定时器TIM1&#xff0c;设置预分频器71&…

使用mnist数据集和LeakyReLU高级激活函数训练神经网络示例代码

一、概述 神经网络中的激活函数是用于增加网络的非线性特性的函数&#xff0c;没有激活函数&#xff0c;神经网络将仅仅是一个线性模型&#xff0c;无法解决复杂的非线性问题。激活函数的选择对神经网络的性能有很大的影响。 基础激活函数是神经网络中使用较早、较为简单的激…

AOA定位技术在智慧停车场中的应用

‌AOA定位技术是一种基于信号到达角度的定位方法&#xff0c;通过测量无线信号到达接收器的入射角度来实现精确定位。‌ AOA定位技术的核心原理是利用接收器内的多个天线阵列来测量信号的相位差&#xff0c;从而计算出信号的到达角度&#xff0c;最终确定位置‌。 在智慧停…

SpringBoot在高校学科竞赛平台中的应用与优化

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

数据结构之旅(顺序表)

前言: Hello,各位小伙伴们我们在过去的60天里学完了C语言基本语法,由于小编在准备数学竞赛,最近没有给大家更新,并且没有及时回复大家的私信,小编在这里和大家说一声对不起!,小编这几天会及时给大家更新初阶数据结构的内容,然后我们来学习今天的内容吧! 一. 顺序表的概念和结…

鸿蒙开发案例:通过三杯猜球学习显示动画

【引言】 “三杯猜球”是一个经典的益智游戏&#xff0c;通常由一名表演者和多名参与者共同完成。表演者会将一个小球放在一个杯子下面&#xff0c;然后将三个杯子快速地交换位置&#xff0c;参与者则需要猜出最终哪个杯子下面有小球。本文将介绍如何使用HarmonyOS NEXT技术&a…

加速AI+医疗普惠:AI如何让乳腺癌筛查走进大山?

人工智能与超声技术的结合正在医疗领域引发一场新变革。 近日&#xff0c;贵州省铜仁市石阡县妇幼保健院与广州尚医网信息技术有限公司&#xff08;以下简称“尚医云”&#xff09;联合组织了一场“AI点亮女性健康未来”免费乳腺癌筛查活动&#xff0c;目前已为当地1,500名适龄…

物联网:一种有能力重塑世界的技术

物联网&#xff08;IoT&#xff09;近年来对我们的日常生活产生了如此积极的影响&#xff0c;以至于即使是不懂技术的人也开始相信它所带来的便利以及敏锐的洞察力。 物联网是一场数字技术革命&#xff0c;其意义甚至比工业革命更为重大。物联网是仍处于起步阶段的第四次工业革…

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI&#xff1f;2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装&#xff08;适…

React Query 和 React Context

React Query最佳特性之一是你可以在组件树中的任何位置使用查询&#xff1a;你的 <ProductTable> 组件可以在其需要的地方自带数据获取&#xff1a; function ProductTable() {const productQuery useProductQuery()if (productQuery.data) {return <table>...<…

AI跟踪报道第60期-新加坡内哥谈技术-本周AI新闻: Tesla展示Robotaxi和AI在企业级运用的推进

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…