Vue3常用知识点总结

news2024/11/26 15:47:22

一、vue3的基本介绍及项目创建

        Vue是一套用于构建用户界面的渐进式框架。Vue.js 3.0 "One Piece" 正式版在2020年9月份发布,经过了2年多开发, 100+位贡献者, 2600+次提交, 600+次PR,同时Vue3也支持Vue2的大多数特性,且,更好的支持了TypeScript,也增加了很多的新特性,如:Composition API,新组件(Fragment/Teleport/Suspense)等等

        详细介绍以及项目创建方式,可见之前发布的文章——

(2条消息) Vue3的基本介绍及创建方式_终将抵达丶的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/gkx19898993699/article/details/127656687?spm=1001.2014.3001.5501

二、常用的组合API(setup、ref、reactive)

(一)setup

  •  新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次
  • 函数如果返回对象, 对象中的属性或方法, 模板中可以直接使用
export default {
  name: "toRefs",
  setup () {
    let a = 6
    return {
        a
    },
  }
}

(二)ref

        ● 作用: 定义一个数据的响应式

        ●语法: const xxx = ref(initValue):

        ○创建一个包含响应式数据的引用(reference)对象

        ○js中操作数据: xxx.value

        ○模板中操作数据: 不需要.value

        ●一般用来定义一个基本类型的响应式数据

<template>
  <h2>{{count}}</h2>
  <hr>
  <button @click="update">更新</button>
</template>

<script>
import {
  ref
} from 'vue'
export default {

  /* 在Vue3中依然可以使用data和methods配置, 但建议使用其新语法实现 */
  // data () {
  //   return {
  //     count: 0
  //   }
  // },
  // methods: {
  //   update () {
  //     this.count++
  //   }
  // }

  /* 使用vue3的composition API */
  setup () {

    // 定义响应式数据 ref对象
    const count = ref(1)
    console.log(count)

    // 更新响应式数据的函数
    function update () {
      // alert('update')
      count.value = count.value + 1
    }

    return {
      count,
      update
    }
  }
}
</script>

(三)reactive

  •  作用: 定义多个数据的响应式
  • const proxy = reactive(obj): 接收一个普通对象然后返回该普通对象的响应式代理器对象
  • 响应式转换是“深层的”:会影响对象内部所有嵌套的属性
  • 内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的
<template>
  <h2>name: {{state.name}}</h2>
  <h2>age: {{state.age}}</h2>
  <h2>wife: {{state.wife}}</h2>
  <hr>
  <button @click="update">更新</button>
</template>

<script>
/* 
reactive: 
    作用: 定义多个数据的响应式
    const proxy = reactive(obj): 接收一个普通对象然后返回该普通对象的响应式代理器对象
    响应式转换是“深层的”:会影响对象内部所有嵌套的属性
    内部基于 ES6 的 Proxy 实现,通过代理对象操作源对象内部数据都是响应式的
*/
import {
  reactive,
} from 'vue'
export default {
  setup () {
    /* 
    定义响应式数据对象
    */
    const state = reactive({
      name: 'tom',
      age: 25,
      wife: {
        name: 'marry',
        age: 22
      },
    })
    console.log(state, state.wife)

    const update = () => {
      state.name += '--'
      state.age += 1
      state.wife.name += '++'
      state.wife.age += 2
    }

    return {
      state,
      update,
    }
  }
}
</script>

以上三者的细节出可跳转到之前的文章——

(2条消息) Vue3中的组合式 (Composition) API(一)_终将抵达丶的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/gkx19898993699/article/details/127656960?spm=1001.2014.3001.5501

三、比较Vue2与Vue3的响应式

(一)Vue2

  • 对象: 通过defineProperty对对象的已有属性值的读取和修改进行劫持(监视/拦截)
  • 数组: 通过重写数组更新数组一系列更新元素的方法来实现元素修改的劫持

(二)Vue3

  • 通过Proxy(代理): 拦截对data任意属性的任意(13种)操作, 包括属性值的读写, 属性的添加, 属性的删除等...

        https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

  • 通过 Reflect(反射): 动态对被代理对象的相应属性进行特定的操作

        https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

1.Reflect.get(target, propertyKey)
         参数    (1)target:需要取值的目标对象
                    (2)propertyKey:需要获取的值的键值
                    (3)返回值:属性的值

2.Reflect.set(target, propertyKey, value)
         参数   (1)target:设置属性的目标对象。
                   (2)propertyKey:设置的属性的名称。
                   (3) value:设置的值
                   (4)返回值:返回一个 Boolean 值表明是否成功设置属性。

详情请跳转到之前发布的文章——

(2条消息) 比较vue2与vue3中的双向数据绑定_终将抵达丶的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/gkx19898993699/article/details/127657812?spm=1001.2014.3001.5501

四、计算属性与监视

  • computed函数:
    • 与computed配置功能一致
    • 有getter和setter
  • watch函数
    • 与watch配置功能一致
    • 只有getter
    • 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调
    • 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次
    • 通过配置deep为true, 来指定深度监视
  • watchEffect函数
    • 不用直接指定要监视的数据, 回调函数中使用的哪些响应式数据就监视哪些响应式数据
    • 默认初始时就会执行第一次, 从而可以收集需要监视的数据
    • 监视数据发生变化时回调

详情请跳转到——

(2条消息) Vue3中的组合式 (Composition) API(一)_终将抵达丶的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/gkx19898993699/article/details/127656960?spm=1001.2014.3001.5501

五、Vue3与Vue2的生命周期对比

与 2.x 版本生命周期相对应的组合式 API

  • beforeCreate -> 使用 setup()
  • created -> 使用 setup()
  • beforeMount -> onBeforeMount
  • mounted -> onMounted
  • beforeUpdate -> onBeforeUpdate
  • updated -> onUpdated
  • beforeDestroy -> onBeforeUnmount
  • destroyed -> onUnmounted
  • errorCaptured -> onErrorCaptured

新增的钩子函数

组合式 API 还提供了以下调试钩子函数:

  • onRenderTracked
  • onRenderTriggered

六、自定义hook函数

  •  使用Vue3的组合API封装的可复用的功能函数
  • 自定义hook的作用类似于vue2中的mixin(混入)技术
  • 自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂
  • 需求1: 收集用户鼠标点击的页面坐标hooks/useMousePosition.ts

1.创建一个hook函数的ts文件

import { ref, onMounted, onUnmounted } from 'vue'
/* 
收集用户鼠标点击的页面坐标
*/
export default function useMousePosition () {
  // 初始化坐标数据
  const x = ref(-1)
  const y = ref(-1)

  // 用于收集点击事件坐标的函数
  const updatePosition = (e: MouseEvent) => {
    x.value = e.pageX
    y.value = e.pageY
  }

  // 挂载后绑定点击监听
  onMounted(() => {
    document.addEventListener('click', updatePosition)
  })

  // 卸载前解绑点击监听
  onUnmounted(() => {
    document.removeEventListener('click', updatePosition)
  })

  return {x, y}
}

2.在需要的页面引入即可使用hook中的数据及方法

<template>
<div>
  <h2>x: {{x}}, y: {{y}}</h2>
</div>
</template>

<script>

import {
  ref
} from "vue"
/* 
在组件中引入并使用自定义hook
自定义hook的作用类似于vue2中的mixin技术
自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂
*/
import useMousePosition from './hooks/useMousePosition'

export default {
  setup() {

    const {x, y} = useMousePosition()

    return {
      x,
      y,
    }
  }
}
</script>

七、toRefs

 把一个响应式对象转换成普通对象,该普通对象的每个 property 都是一个 ref

        应用: 当从合成函数返回响应式对象时,toRefs 非常有用,这样消费组件就可以在不丢失响应式的情况下对返回的对象进行分解使用

        问题: reactive 对象取出的所有属性值都是非响应式的

        解决: 利用 toRefs 可以将一个响应式 reactive 对象的所有原始属性转换为响应式的 ref 属性

<template>
  <h2>App</h2>
  <h3>foo: {{foo}}</h3>
  <h3>bar: {{bar}}</h3>
  <h3>foo2: {{foo2}}</h3>
  <h3>bar2: {{bar2}}</h3>


</template>

<script lang="ts">
import { reactive, toRefs } from 'vue'
/*
toRefs:
  将响应式对象中所有属性包装为ref对象, 并返回包含这些ref对象的普通对象
  应用: 当从合成函数返回响应式对象时,toRefs 非常有用,
        这样消费组件就可以在不丢失响应式的情况下对返回的对象进行分解使用
*/
export default {

  setup () {
    const state = reactive({
      foo: 'a',
      bar: 'b',
    })

    const stateAsRefs = toRefs(state)

    setTimeout(() => {
      state.foo += '++'
      state.bar += '++'
    }, 2000);

    const {foo2, bar2} = useReatureX()

    return {
      // ...state,
      ...stateAsRefs,
      foo2, 
      bar2
    }
  },
}

function useReatureX() {
  const state = reactive({
    foo2: 'a',
    bar2: 'b',
  })

  setTimeout(() => {
    state.foo2 += '++'
    state.bar2 += '++'
  }, 2000);

  return toRefs(state)
}

</script>

八、ref获取元素

注意:在script的标签内要加入  lang="ts"

利用ref函数获取组件中的标签元素

        注意:声明一个 ref 来存放该元素的引用
                   必须和模板里的 ref 同名

功能需求: 让输入框自动获取焦点

<template>
  <h2>App</h2>
  <input type="text">---
  <input type="text" ref="inputRef">
</template>

<script lang="ts">
import { onMounted, ref } from 'vue'
/* 
ref获取元素: 利用ref函数获取组件中的标签元素
功能需求: 让输入框自动获取焦点
*/
export default {
  setup() {
    //声明一个 ref 来存放该元素的引用
		//必须和模板里的 ref 同名
    const inputRef = ref<HTMLElement|null>(null)

    onMounted(() => {
      inputRef.value && inputRef.value.focus()
    })

    return {
      inputRef
    }
  },
}
</script>

九、Vue3中是否使用<script setup>父子传参的不同(重点)

        个人认为这是Vue3中很重要的一个点,而且当你熟悉了以后会发现他真的比Vue2方便好多,其中详情请跳转到单独的文章——

(2条消息) Vue3中是否使用<script setup>父子传参的不同_终将抵达丶的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/gkx19898993699/article/details/127690322?spm=1001.2014.3001.5501

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

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

相关文章

Linux 进程信号深剖

目录传统艺能&#x1f60e;概念&#x1f914;信号发送&#x1f914;信号记录&#x1f914;信号产生&#x1f914;常见信号处理方式&#x1f914;终端按键产生信号&#x1f914;核心转储&#x1f60b;如何调试&#x1f914;系统函数发送信号&#x1f914;raise函数&#x1f914;…

单片机驱动LCD

单片机驱动LCD的方法有很多&#xff0c;网络上也有很多配套的例程&#xff0c;但是&#xff0c;网上例程千千万&#xff0c;谁是你的“no.1”。 今天给大家分享一个以面向对象的方式用单片机驱动LCD的思路。 LCD种类概述 在讨论怎么写LCD驱动之前&#xff0c;我们先大概了解…

无线传感器网络:差错控制

文章目录Power controlAutomatic repeat request (ARQ)Stop and WaitGo Back NSelective RepeatForward error correction (FEC)Hybrid ARQ (HARQ)References严格意义来说&#xff0c;文章中提到的数据包都应为数据帧更为恰当&#xff0c;这里提出&#xff0c;希望不要给大家造…

3.9 拆解小红书爆文,流量密码原来是这些【玩赚小红书】

具体如何撰写1篇爆文&#xff0c;解决这一问题前&#xff0c;我们先把爆文四要素&#xff0c;选题、首图、标题和正文进行拆解&#xff0c;真正做到选题正确&#xff0c;用户坐着封面、标题、正文滑滑梯&#xff0c;站内留下点赞评&#xff0c;站外去拔草。 ​ 一、选题&#…

了解模型开发与部署,看这里!

11月24日下午15&#xff1a;00顶象第十期业务安全系列大讲堂系列课程《Xintell 模型平台 》正式开讲。 顶象人工智能专家&研发总监无常从模型平台的现状与需求出发&#xff0c;带大家了解了模型平台的开发环境与部署环境&#xff0c;并且就顶象的Xintell 模型平台 为大家做…

[附源码]Python计算机毕业设计DjangoON-FIT

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

1988-2020年分省、城市、农村基尼系数数据集(含计算程序和算法)

1、数据来源&#xff1a;《中国统计年鉴》 2、时间跨度&#xff1a;1988-2020 3、区域范围&#xff1a;全国所有省份 4、指标说明&#xff1a; 参照田为民的文章《中国基尼系数计算及其变动趋势分析》里基尼系数的计算方法 部分数据如下 二、基尼系数计算及相关经典文献 …

win10怎么把两个盘合成一个,win10怎么把分区合并

在Windows10系统中&#xff0c;为了更加充分地利用磁盘空间&#xff0c;其中合并分区是很常见的操作之一。由于很多用户都不知道win10怎么把两个盘合成一个&#xff0c;所以&#xff0c;为了防止人为误操作而导致的磁盘数据丢失&#xff0c;在本文中&#xff0c;易我小编在本文…

1024短信盲盒 | 暖心短信陪你过节,还有更多好礼

掘友你好&#xff0c;见字如面。 一年一度的程序员节快要到了&#xff0c;我们为此准备了一个特别的短信盲盒活动。现在报名&#xff0c;活动期间每天都会定时收到一条来自掘金的短信&#xff0c;在活动最后一天10.24日&#xff0c;可能还会收到掘金团队不同成员的祝福哦&#…

给容灾找对象!数据流转更自由,拓宽云上更多场景

云计算高速发展&#xff0c;企业却有新问题&#xff1f; 1979年&#xff0c;软件和IT服务公司SunGard在美国费城建立了世界上第一个灾备中心&#xff0c;对数据和系统进行备份&#xff0c;标志着数据灾备行业的起源。20世纪80-90年代&#xff0c;计算机网络技术的迅速发展和普及…

文本表示(Representation)

文本表示&#xff08;Representation&#xff09; 这里写目录标题文本表示&#xff08;Representation&#xff09;独热编码(one-hot representation)整数编码Word2vec模型整体理解我的理解CBoW & Skip-gram Model改进方案Hierarchical SoftmaxNegative Sampling代码GloveG…

Servlet请求转发与重定向

目录 一、请求转发 1、RequestDispatcher 接口 2、请求转发的工作原理 3、request 域对象 4、示例 二、重定向 1、response.sendRedirect() 2、示例 3、转发和重定向的区别 一、请求转发 Web 应用在处理客户端请求时&#xff0c;经常需要多个 Web 资源共同协作才能生成…

工作中规范使用Java集合

目录 一、前言 二、规范使用Java集合 1.【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 2.【强制】判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size() 0 的方式。 3.【强制】在使用 java.util.str…

防火墙原理讲解——练习实验

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 一防火墙基础 二防火墙配置 三防火墙的高级应用 四.实验图纸 五.实验命令 一防火…

使用SPARK进行特征工程

文章目录特征工程预处理特征选择归一化离散化Embedding向量计算效果对比特征工程 在机器学习领域&#xff0c;有一条尽人皆知的“潜规则”&#xff1a;Garbage in&#xff0c;garbage out。它的意思是说&#xff0c;当我们喂给模型的数据是“垃圾”的时候&#xff0c;模型“吐…

1. Vue 3.0介绍

Vue3.0介绍 1.Vue.js 3.0 源码组织方式 Vue2.x与Vue3.0的区别 源码组织方式的变化 Vue3.0的源码全部采用TypeScript重写使用Monorepo方式来组织项目结构&#xff0c;把独立的功能模块都提取到不同的包中。 packages下都是独立发行的包&#xff0c;可以独立使用。 Compositi…

[U3D ShaderGraph] 全面学习ShaderGraph节点 | 第二课 | Input/Geometry

ShaderGraph是可视化的着色器编辑工具。您可以使用此工具以可视方式创建着色器。 本专栏可以让你更了解ShaderGraph中每个节点的功能&#xff0c;更自如的在做出自己想要的效果。 如果你想学习在unity中如何制作一个特效&#xff0c;如何在unity中让模型更炫酷&#xff0c;那就…

Python实现导弹自动追踪

自动追踪算法&#xff0c;在我们制作射击类游戏时经常会用到。这个听起来很高大上的东西&#xff0c;其实并不是军事学的专利&#xff0c;从数学上来说就是解微分方程。 这个没有点数学基础是很难算出来的。但是我们有了计算机就不一样了&#xff0c;依靠计算机极快速的运算速…

【Scala专栏】走进Scala

官方文档: https://www.scala-lang.org/ 一、What is Scala? Scala是一种针对JVM 将面向函数和面向对象技术组合在一起的编程语言。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言&#xff0c;而又无缝地结合了命令式和函数式的编程风格…

服务访问质量(QoS)——流量整形与拥塞管理

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.流量整形和监管配置 1.流量整形配置两种方式 ①流量整形的命…