Vue3的基本语法及使用(vue3尚硅谷学习笔记)

2023-10-29

一、Vue3的基本语法及使用

1.Vue3的基本语法

1.1 初识setup

  • setup是Vue3中一个新的配置项,值为一个函数;

  • 组件中所要用到的数据、方法等,均要配置在setup中;

  • setup的两种返回值:

    • 若返回一个对象,则对象中的属性、方法,均可以在模板中直接使用;

    • 若返回一个渲染函数:则可以自定义渲染内容;

  • setup的两个注意点:

    • setup执行时机,在beforeCreate之前执行一次,this是undefined;

    • setup的参数:

      • props:指为对象,包含组件外部传递过来,且组件内部声明接收了的属性。

      • context:上下文对象

      • attrs:值为对象,包含组件外部传递过来,但没有在props配置中声明的属性,相当于this.$attrs;

      • slots:收到的插槽内容,相当于this.$slots;

      • emit:分发自定义事件的函数,相当于this.$emit。

1.2 ref

  • ref 通常用来定义响应式基本数据类型,还可以获取页面元素

    <input type="text" ref="inputText">
    ​
    // 获取该input元素
    onMounted(()=>{
        // inputText要跟元素中的ref一样
        const inputText = ref<HTMLElement | null>()
        console.log(inputText.value)
    })

  • 语法:const xxx=ref(initValue)

  • js中操作数据:xxx.value(必须使用.value方式操作数据,否则不会生效)

1.3 reactive

  • reactive 通常用来定义多个数据的响应式,包含复杂数据类型(如对象等)

  • 语法:语法:const 代理对象=reactive(被代理对象)接收一个对象(或数组),返回一个代理对象(proxy对象)

1.4 reactive 与 ref 对比

1.4.1 从定义数据角度对比:

  • ref用来定义:基本数据类型;

  • reactive用来定义:对象(或数组)类型数据;

  • 备注:ref也可以用来定义对象或数组类型数据,它内部会自动通过reactive转为代理对象;

1.4.2 从原理角度对比:

  • ref通过Object.defineProperty()的get和set来实现响应式;

  • reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据。

1.4.3 从使用角度对比:

  • ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value;

  • reactive定义的数据:操作数据与读取数据均不需要.value;

1.5 Vue3响应式原理

  • 通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写(getter和setter)、属性的添加、属性的删除等;

  • 通过Reflect(反射):对被代理对象的属性进行操作;

1.6 Vue3中的计算属性和监视

1.6.1 computed函数

import {computed} from 'vue'
person.fullName=computed({
    get(){
        return person.firstName+'-'+person.lastName
    },
    set(value){
        const nameArr=value.split('-')
        person.firstName=nameArr[0]
        person.lastName=nameArr[1]
    }
})

1.6.2 watch函数

watch函数可以传递三个参数,第一个参数是监视的属性,第二个参数是执行的回调函数,第三个参数是配置

//情况一:监视ref所定义的一个数据
// 注意:1、immediate开启立即执行一次 2、deep开启深度监视
watch(sum,(newValue,oldValue)=>{
    console.log('sum变了',newValue,oldValue);
},{immediate:true})
​
//情况二:监视ref所定义的多个响应数据
watch([sum,msg],(newValue,oldValue)=>{
    console.log('sum变了huomsg变了',newValue,oldValue)
})
​
//情况三:监视reactive所定义的一个响应式数据 的全部属性
// 注意:1、无法正确的获取oldValue 2、强制开启了深度监视(deep配置无效)
watch(person,()=>{
    console.log('person变化了');
})
​
//情况四:监视reactive所定义的一个响应式数据中的某个属性
// 注意:所监视的属性写法要用函数返回 ()=>person.age
watch(()=>person.age,(newValue,oldValue)=>{
    console.log('age变化了',newValue,oldValue);
})
​
//情况五:监视reactive所定义的一个响应式数据中的某些属性
// 注意:可以监视多个属性,用数组表示,同时如果所监视的属性写法要用函数返回 ()=>person.age
watch([()=>person.age,()=>person.name],(newValue,oldValue)=>{
    console.log('age,name变化了',newValue,oldValue);
})

1.6.3 watchEffect函数

不需要配置immediate,本身默认会执行一次

import { watchEffect } from 'vue'
watchEffect(()=>{
    const names = fullName.value.split('_')
    user.firstName = names[0]
    user.lastName = names[1]
})

1.7 vue3生命周期

  • onBeforeMount:挂载前

  • onMounted:挂载后

  • onBeforeUpdate:更新前

  • onUpdated:更新后

  • onBeforeUnmount:卸载前

  • onUnmounted:卸载后

1.8 toRefs

toRefs可以把一个响应式对象转换成普通对象,该普通对象的每个property都是一个ref,可以帮我们批量创建ref对象主要是方便我们解构使用

import { reactive, toRefs } from 'vue'
const obj = reactive({
   foo: 1,
   bar: 1
})
 
let { foo, bar } = toRefs(obj)
 
foo.value++
console.log(foo, bar);

1.9 toRef

只对响应式对象有效果

  • 为源响应式对象上的某个属性创建一个ref对象,二者内部操作的是同一个数据值,更新时二者是同步的

  • 区别ref:拷贝了一份新的数据值单独操作,更新时相互不影响

  • 应用:当要将某个prop的ref传递给复合函数时,toRef很有用

    <template>
       <div>
          <button @click="change">按钮</button>
          {{state}}
       </div>
    </template>
     
    <script setup lang="ts">
    import { reactive, toRef } from 'vue'
     
    const obj = {
       foo: 1,
       bar: 1
    }
     
     
    const state = toRef(obj, 'bar')
    // bar 转化为响应式对象
     
    const change = () => {
       state.value++
       console.log(obj, state);
     
    }
    </script>

1.10 shallowReactive 和 shallowRef

  • shallowReactive:只处理对象内最外层属性的响应式(也就是浅响应式)

  • shallowRef:只处理value的响应式,不进行对象的reactive处理

1.11 readonly 和 shallowReadonly

  • readonly:深度只读数据,不允许任何修改

  • shallowReadonly:浅度只读数据,不允许修改外层数据,内层对象数据可以修改

1.12 toRaw 和 markRaw

  • toRaw:

    • 返回由reactive 或 readonly 方法转换成响应式代理的普通对象

    • 这是一个还原方法,可用于临时读取,访问不会被代理、跟踪,写入时也不会触发界面更新

  • markRaw:

    • 标记一个对象,使其永远不会转换成代理,返回对象本身

    • 应用场景:

      • 有些值不应被设置为响应式的,例如复杂的第三方类示例或vue组件对象

      • 当渲染具有不可变数据源的大列表时,跳过代理转换可以提高性能

1.13 customRef

  • customRef用于自定义一个ref,可以显示的控制依赖追踪和触发响应,接受一个工厂函数,两个参数分别是用于追踪的track与用于触发相应的trigger,并返回一个带有get和set属性的对象

  • 创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制

    function myRef(value){
      let timer
      return customRef((track,trigger)=>{
       return{
          get(){
            console.log('有人读取数据了');
            track()//通知vue追踪value的变化
            return value
          },
          set(newValue){
            console.log('有人修改数据了');
            clearTimeout(timer)
            timer=setTimeout(()=>{
              value=newValue
              trigger()//重新解析模板
            },2000)
          }
       }
      })
    }

1.14 provide 和 inject

作用:实现祖与后代间组件间通信;

  • 父组件有一个provide选项来提供数据,后代组件有一个inject选项来开始使用这些数据

1、祖组件:
setup(){
    let car = reactive({
      name:'car',
      price:188888
    })
    provide('car',car)//给自己的后代组件传递数据
    return {
      ...toRefs(car)
    }
}
​
2、后代组件
setup(){
    let car = inject('car')
    return{
        car
    }
}

1.15 isRef、isReactive、isReadonly、isProxy

响应式数据的判断

  • isRef:检查一个值是否为一个ref对象;

  • isReactive:检查一个对象是否由reactive创建的响应式代理;

  • isReadonly:检查一个对象是否由readonly创建的响应式代理;

  • isProxy:检查一个对象是否由reactive或readonly方法创建的代理;

1.16 新的组件

  • Fragment

    • 在vue2中,组件必须有一个根标签;

    • 在vue3中,组件可以没有根标签,内部会将多个标签包含在一个Fragment虚拟元素中;

    • 好处是减少标签层级,减小内存占用。

  • Teleport

    • Teleport是一种能够将我们的组件html结构移动到指定位置的技术。

      <teleport to='移动位置' > // 可以跟id、class等
        <div v-if="isShow" class="mask">
            <div class="dialog">
              danchuang<br>
              <button @click="isShow=false">关闭弹窗</button>
            </div>
        </div>
      </teleport>
  • Suspense

    • 等待异步组件时渲染一些额外的内容,让应用有更好的用户体验

    • 使用步骤:

      • 异步引入组件;

      • 使用suspense包裹组件,并配置好default和fallback;

      <Suspense>
          <template #default>
              // 要引入的内容
          </template>
          <template v-slot:fallback>
              // 等待时候的内容
          </template>
      </Suspense>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3的基本语法及使用(vue3尚硅谷学习笔记) 的相关文章

  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 为什么 iife 在一个简单的例子中不起作用?

    我不明白为什么函数表达式调用不起作用并抛出错误 你能给我解释一下吗 var a function x alert x function a 1 谢谢大家 任务比我想象的要容易得多 这是因为 JS 将 IIFE 解析为函数的参数调用 这样做时
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 带有淘汰赛js的隐形recaptcha

    我正在完成隐形验证码 但我在实现它时遇到问题 谷歌开发人员页面中的代码显示它应该是这样的
  • 如何针对 Node.js 中发生的每个错误发送电子邮件?

    假设我的 node js 应用程序正在运行 如果出现错误 我的意思是所有错误 不仅仅是网络错误 如果出现错误 则很重要 我如何调用函数向我发送电子邮件 基本上 在我希望它写入 err out 之前 我希望向我发送一封电子邮件 我正在使用no
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐

  • 【cdk的使用】C/C++ TCP 粘包 拆包 及解决方案

    Github地址 https github com wujin1989 cdk TCP因为没有边界 所以会有粘包的问题 看下面代码 server c include cdk h include
  • 怎样利用 python 学习爬虫?

    一文搞懂Python gt 爬虫需要学什么 附送课程 笔记 关于Python爬虫 我们需要学 1 Python基础语法学习 基础知识 首先 你需要熟悉Python的基本语法 包括变量 数据类型 条件语句 循环 函数等 2 对HTML页面的内
  • 后缀mcp用什么软件打开_如何打开MCP文件?

    下载通用文件查看器 File Magic 安装可选产品 File Magic Solvusoft EULA Privacy Policy Terms Uninstall 步骤1 尝试不同的软件程序 如果无法打开MCP文件 则可能没有在计算机
  • JS实现插入排序

    1 算法简介 插入排序的工作原理就是将未排序数据 对已排序数据序列从后向前扫描 找到对应的位置并插入 插入排序通常采用占位的形式 空间复杂度为O 1 因此 在从后向前扫描的过程中 需要反复的把已排序的元素逐步向后挪位 为新插入元素提供插入的
  • xpath案例-解析所有城市名称

    第一种方法把热门城市和所有城市分开来考虑 import requests from lxml import etree if name main headers User Agent Mozilla 5 0 Windows NT 10 0
  • MQTT协议学习:1、MQTT协议了解

    MQTT协议学习 1 MQTT协议了解 文章目录 MQTT协议学习 1 MQTT协议了解 1 前言 2 MQTT简介 1 概述 2 相关名称 3 协议应用 4 开源方案 3 适用于FreeRTOS的MQTT库 4 最后 1 前言 MQTT可
  • CNN模型之LeNet-5

    一 介绍 卷积神经网络是当前深度学习领域比较火的研究方法 其应用主要是在计算机视觉上 例如 图像分类 目标检测 人脸识别等等 并且已经在这些领域取得了相当大的成就 本文主要介绍卷积神经网络的开篇之作 LeNet 5 LeNet 5由Y Le
  • vue在线预览word、excel、PDF

    1 安装依赖 docx文档预览组件 npm install vue office docx vue demi 0 13 11 S excel文档预览组件 npm install vue office excel vue demi 0 13
  • P4 晶体管四种工作状态+静态分析【更新】

    gt 晶体管四种工作状态 放大 饱和 截止 倒置 gt 静态分析 定量分析晶体管处于何种工作状态 注意 不安全区暂时不用关注 倒置状态暂时也可以不关注 放大区 之所以称为放大区 因为在这个区域 iB 与iC满足放大beta倍的关系 这是表面
  • getopt函数(未更新完)

    2023年7月28日 周五上午 这是我目前碰到过的比较复杂的函数之一 为了彻底弄懂这个函数 我花了几个小时 为了更好的说明这个函数 之后我可能会录制讲解视频并上传到B站 如果我上传到B站 我会在文章添加视频链接的 内容太多了 没写完 有空再
  • java Logback输出日志内容到文件

    要将logger info的信息输出到文件 您可以使用Logback配置 下面是一个简单的示例 1 首先 在您的项目中添加Logback依赖 例如在Maven项目中的pom xml文件中添加以下代码
  • 基于OpenCV的交通标志识别(SVM+Hu不变矩, 部分测试源代码)

    最近跟着老师做一个交通识别的项目 总算明白了一个道理 这水啊 不去亲自蹚上一遭就不知道有多深 更根本的原因当然还是自己学的不够扎实 不够好 经过了一个寒假的折磨 终于做出了一个原型来 想到了自己当时被折磨的头疼的样子 想着将一部分源代码发上
  • 前端post请求中body和query传参的区别

    前端发送请求最常用的是get请求还有post请求 get请求只能传query参数 query参数都是拼在请求地址上的 post可以传body和query两种形式的参数 如下 编辑项目列表 export function editProjec
  • SeqGPT: 开箱即用的开放域自然语言理解大模型

    论文链接 SeqGPT An Out of the box Large Language Model for Open Domain Sequence Understanding https arxiv org abs 2308 10529
  • 【DL】血与泪的炼丹心得

    记录一些炼丹的心得 都是坑啊 以下都是经过很多实验得到的炼丹心得 希望对大家有帮助 模型很复杂 各种网络融合 尝试用更小的学习率和更多的epoch 学习率预热是个好东西 必须用上 学习率很重要 可以发掘模型的极限 但是无法改变模型的上限 模
  • DataAnalysis-Maggie-Lecture6-机器学习基础

    ML的基础框架 1定义要解决的问题 2构建数据集 3数据变换 4训练模型 5使用模型预测 example 垃圾邮件标记系统来解释术语 Dataset 一堆的邮件 Sample Instances 一封邮件 Feature Variables
  • springcloud微服务:nacos的配置说明与服务注册

    这部分我要知道两点就是nacos如何去注册服务和发现服务的 一 工程结构和版本依赖 首先要说一个我们的springcloud工程 基于半仙的springcloud工程 这个工程比较有意思 就是我很少看到pom文件一层套一层 相当于是三级po
  • 修改el-card的header的背景颜色

    修改el card的header的背景颜色 1 修改默认样式 好处是当前页面的所有的el card都会变化 页面卡片
  • linux0.00 代码阅读笔记

    汇编语言的编写 编译 运行 调试 author hjjdebug date 参考代码地址 GitHub hjjdebug linux0 00 linux0 00 code compiled under ubuntu14 04 gcc 4 8
  • Vue3的基本语法及使用(vue3尚硅谷学习笔记)

    一 Vue3的基本语法及使用 1 Vue3的基本语法 1 1 初识setup setup是Vue3中一个新的配置项 值为一个函数 组件中所要用到的数据 方法等 均要配置在setup中 setup的两种返回值 若返回一个对象 则对象中的属性