Vue3全网最细介绍使用

2023-11-15

一、Vue3介绍

1.性能的提升

  • 打包大小减少41%
  • 初次渲染快55%, 更新渲染快133%
  • 内存减少54%

2.源码的升级

  • 使用Proxy代替defineProperty实现响应式
  • 重写虚拟DOM的实现和Tree-Shaking

3.拥有TypeScript

  • Vue3可以更好的支持TypeScript

4.新的特新

  • Composition API(组合API)
    – Setup配置
    – ref与reactive
    – watch与watchEffect
    – provide与inject

  • 新的内置组件
    – Fragment
    – Teleport
    – Suspense

  • 其他改变
    – 新的生命周期钩子
    – data 选项应始终被声明为一个函数
    – 移除keyCode支持作为 v-on 的修饰符

5.组合式API和配置项API

  • Options API 存在的问题
    – 使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改 。

  • Composition API的优势
    –我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。

二、Vue3项目创建

  1. Vue-cli安装Vue3
vue create 名称		// 选择需要的配置 到版本选择3.X即可	
npm run server		// 运行服务器

在这里插入图片描述

  1. Vite创建Vue3
npm init vue@latest		// 根据自己的需求选择功能
npm install				// 注意这个方式创建是没有node_modules的
npm run dev				// 运行服务器

在这里插入图片描述

  1. Vite创建Vue(方式二)
npm init vite-app 项目名称 	// 默认功能是全不选的
npm install 				// 安装 依赖
npm run dev					// 运行服务

在这里插入图片描述

三、Setup

Vue3中新增Setup配置项函数 在里面定义函数变量 必须return 才能在模版中使用

<template>
  <div>
    <h1> APP Setup</h1>
    <h3>我是{{name}}</h3>
    <h3>今年{{age}}</h3>
    <button @click="leftClick">点我看帅哥</button>
    <button @click="addAge">点我年龄+1</button>
  </div>
  <router-view/>
</template>

<script>
export default{                   // Vue3中所有的变量 函数编写 都写在Setup函数中
  setup(){
    // console.log(this.name)       // Vue3中没有This 
    let name = 'Like'
    let age = 20

    function leftClick() {
      alert('帅哥!!')
    }

    let addAge = () => {
      console.log('开始加啦!')
      age++                       // 发现问题 渲染没有问题 但是没有响应式 页面底层变了 变量没变
      console.log(age)
    }

    return {                    // 函数 变量 都需要返回 
      age, name, leftClick, addAge
    }
  }
}
</script>

四、ref与reactive


使用Ref 和 Reactive需要导入

import {ref, reactive} from "vue";

基本数据类型(数组 字符串 布尔)如果想要添加响应式 可以直接使用Ref包裹 通过变量名.Value来修改
对象 数组如果想要添加响应式需要使用Reactive包裹 通过变量.属性来修改

<template>
  <div>
    <h1> APP Setup</h1>
    <h3>我是{{name.name}}</h3>    <!-- reactive的用法 -->
    <h3>今年{{age}}</h3>      	  <!-- ref 的用法 -->
    <button @click="leftClick">点我看帅哥</button>
    <button @click="addAge">点我年龄+1</button>
  </div>
  <router-view/>
</template>

<script>

import {ref, reactive} from "vue";

export default{                  
  setup(){
    // console.log(this.name)       // Vue3中没有This
    let name = reactive({name:'like', height:180})      // 需要放在一个对象里面
    let age = ref(20)

    function leftClick() {
      name.name = name.name + '?'
      console.log(name)           // 这个时候我们可以看到name是一个Proxy对象 可以通过名称直接拿值
    }

    let addAge = () => {
      console.log('开始加啦!', age)   // 这个时候我们打印age发现是一个RefImpl对象 中有一个Value就是我们的数据值
      age.value = age.value+1                      // 发现问题 渲染没有问题 但是没有响应式 页面底层变了 变量没变
      console.log(age.value)
    }

    return {                    // 函数 变量 都需要返回
      age, name, leftClick, addAge,
    }
  }
}
</script>

在这里插入图片描述

五、setup-context

上下文的作用就是可以接收参数 context 内部函数props接受的自定义属性

组件 
	<template>
	<div>
	  <h1>我是home组件{{name}}</h1>
	</div>
	</template>
	
	<script>
	export default {
	  name: 'HomeView',
	  props:['name'],
	  setup(context){
	    console.log(context)
	  }
	}
	</script>


App.vue
	<template>
  <div>
    <h1> Context</h1>
    <HomeView name="like"></HomeView>
  </div>
</template>

<script lang="js" setup>    // 语言可以切换成 Ts


import HomeView from './views/HomeView.vue'

export default{
  components:{HomeView},
}
</script>

在这里插入图片描述

六、计算属性

与Vue2中的computed配置功能一致(案例:当姓名都发生变化的时候 其他也跟着变换)

<template>
  <p>姓:<input type="text" v-model="person.firstName"></p>
  <p>名:<input type="text" v-model="person.lastName"></p>
  <p>全名:{{ person.fullName }}</p>
  <p>全名修改:<input type="text" v-model="person.fullName"></p>

</template>

<script>

import {ref, reactive} from 'vue'
import {computed} from 'vue'

export default {
  name: 'App',
  setup() {
    const person = reactive({
      firstName: '梅',
      lastName: '星星'
    })

    // let fullName = computed(() => {
      // return person.firstName + '-' + person.lastName
    })
    // 或者,传入箭头函数
    // person.fullName=computed(() => {
      // return person.firstName + '-' + person.lastName
    })
    // 修改,传入配置项目
    person.fullName = computed({
      get() {
        return person.firstName + '-' + person.lastName
      },
      set(value) {
        const nameArr = value.split('-')
        person.firstName = nameArr[0]
        person.lastName = nameArr[1]
      }
    })
    return {person}
  },
}
</script>

在这里插入图片描述

七、监听属性

<template>
  <h2>年龄是:{{ age }}</h2>
  <button @click="age++">点我年龄增加</button>
  <hr>
  <h2>姓名是:{{ person.name }}</h2>
  <button @click="person.name+='?'">点我姓名变化</button>
  <hr>
  <h2>sum是:{{ sum }},msg是:{{ msg }}</h2>
  <button @click="sum++">点我sum变化</button>
  |
  <button @click="msg+='?'">点我msg变化</button>

</template>

<script>

import {ref, reactive} from 'vue'
import {watch} from 'vue'

export default {
  name: 'App',
  setup() {
    const age = ref(19)
    const person = reactive({
      name: 'Like',
      age: 20
    })
    //1 监听普通
    watch(age, (newValue, oldValue) => {
      console.log('sum变化了', newValue, oldValue)
    })
    // 2 监听对象
    watch(() => person.name, (newValue, oldValue) => {
      console.log('person.name变化了', newValue, oldValue)
    })
    // 3 监听多个
    const sum = ref(100)
    const msg = ref('很好')

    watch([sum, msg], (newValue, oldValue) => {
      console.log('sum或msg变化了', newValue, oldValue)
    })
    return {person, age, sum, msg}
  },
}
</script>

在这里插入图片描述

八、Vue3生命周期


Vue3.0中可以继续使用Vue2.x中的生命周期钩子,但有有两个被更名:

  • beforeDestroy改名为 beforeUnmount
  • destroyed改名为 unmounted

Vue3.0也提供了 Composition API 形式的生命周期钩子,与Vue2.x中钩子对应关系如下:

  • beforeCreate====>setup()
  • created========>setup()
  • beforeMount ====>onBeforeMount
  • mounted========>onMounted
  • beforeUpdate====>onBeforeUpdate
  • updated ========>onUpdated
  • beforeUnmount ==>onBeforeUnmount
  • unmounted =====>onUnmounted
    在这里插入图片描述

九、自定义hook函数

什么是hook?

本质是一个函数,把setup函数中使用的Composition API进行了封装,类似于vue2.x中的mixin,自定义hook的优势: 复用代码, 让setup中的逻辑更清楚易懂。

打点功能示例

<template>
  <h2>点击的x坐标:{{ point.x }},y坐标:{{ point.y }}</h2>
</template>

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

export default {
  name: 'Point',
  setup() {
    const point = reactive({
      x: 0,
      y: 0
    })

    function getPoint(event) {
      console.log('X轴是:', event.pageX)
      console.log('Y轴是:', event.pageY)
      point.x = event.pageX
      point.y = event.pageY
    }

    // 挂在完成开始执行
    onMounted(() => {
      window.addEventListener('click', getPoint)
    })
    // 接除挂载时执行
    onBeforeUnmount(() => {
      console.log('sss')
      window.removeEventListener('click', getPoint)
    })
    return {point}
  },
}
</script>
<template>
  <div>
    <button @click="isShow=!isShow">点我显示隐藏</button>
    <Point v-if="isShow"></Point>
  </div>
</template>

<script>
import {ref, reactive} from 'vue'
import Point from "./components/Point.vue";
import Demo from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {Demo, Point},
  setup() {
    const isShow = ref(true)
    return {isShow}
  },
}
</script>

在这里插入图片描述

十、toRef

  • toRef的作用:创建一个 ref 对象,其value值指向另一个对象中的某个属性。
  • 语法:const name =toRef(person,'name')
  • 应用: 要将响应式对象中的某个属性单独提供给外部使用时。
  • 扩展:toRefstoRef功能一致,但可以批量创建多个ref 对象,语法:toRefs(person)
<template>
  <div>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }}</h2>
    <button @click="age++">改年龄</button>| <button @click="name+='~'">改姓名</button>
  </div>
</template>

<script>

import {ref, reactive,toRefs} from 'vue'

export default {
  name: 'App',
  setup() {
    const person = reactive({
      name: 'like',
      age: 19
    })
    return {
      ...toRefs(person)   // ... 解压赋值
    }
  },
}
</script>

在这里插入图片描述

技术小白记录学习过程,有错误或不解的地方请指出,如果这篇文章对你有所帮助请点点赞收藏+关注谢谢支持 !!!

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

Vue3全网最细介绍使用 的相关文章

  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • 渲染货币和符号并与来自不同单元格的数据相结合

    我正在使用最新的 jQuery DataTables v1 10 7 我正在尝试将数字解析为以下格式 239 90 USD 我可以使用此命令使货币正常工作 columns data Price render fn dataTable ren
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 用于交互式图形绘制的轻量级 JavaScript 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有兴趣了解用于绘制交互式图表的最轻量级 javascript 库 我掌握的数据主要是与海洋研究相关的科学数据 我知道一些 jquery
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐

  • 记录自己激光打眼手术过程

    本人近视500度 其中300多度近视 100多度的散光 想毕业去应征入伍 所以想去做激光手术 在学校初检的医院做了激光打眼前的检查 发现角膜地形图不正常 被告知不能做 要观察半年后才能去做 我又去了JN附属医院做了检查发现还是地形图不正常
  • Ubuntu linux Androidstudio 卡死 杀死进程

    打开任务管理器 方法一 系统搜索 system monitor 如图 打开系统监视器 方法二 打开终端输入 gnome system monitor 打开系统监视器后 注意 androidstudio 对应的进程是java 在监视其中找到J
  • CTF—WEB基础篇

    01 HTML 文本标记语言 标题 h1 这是一个标题 h1 h2 这是一个标题 h2 h3 这是一个标题 h3 复制 段落 p 这是一个段落 p p 这是另外一个段落 p 复制 链接 a href URL 这是一个链接 a 复制 图像 i
  • 【Unity3D】XR: OpenVR Error! OpenVR failed initialization解决方案

    2019年12月2日 0次阅读 共213个字 0条评论 0人点赞 QueenDekimZ Console报错 XR OpenVR Error OpenVR failed initialization with error code VRIn
  • 游戏开发unity xlua框架知识系列:vscode 识别非.lua后缀的代码文件

    插眼 总结 setting json中进行配置 参考 https blog csdn net iway lch article details 91364825
  • 数据库查询语句遇到:Unknown column 'XXXX' in 'where clause'解决方法

    数据库查询语句遇到 Unknown column XXXX in where clause 解决方法 根本原因 可能是sql语句所用到的数据类型错误 int与String 弄错 我的情况 在网页其中的jsp页面接收html页面传来的cssn
  • vue3+vite3+vant搭建移动端简易模版

    前言 vue3 x相关的生态已经在不断的完善中 相应的UI 路由 pinia等都已成熟 新的项目也在考虑使用新版本开发了 开一个帖子记录一下搭建移动端简易模版的过程 方便以后回顾 vite前端构建工具 兼容性注意 Vite 需要 Node
  • 数据结构单向链表的C++实现

    本文的链表实现使用的是c 的类模板 构造节点类模板Node
  • 打卡格式

    2019 X xx Chen70
  • 还只看花书,西瓜书?一文告诉你如何正确学习深度学习,从理论到实战。

    如今春招已接近尾声 大家都知道今年就业形势整体不乐观 不仅应聘人数远远大于招聘岗位 而且面试难度加大 想拿到理想的offer更是难上加难 这段时间 很多人都在自我充电 我也经常在后台给读者解答很多深度学习相关问题 但大家问的更多的却是一些非
  • 如何查看文件的MD5值?

    MD5 什么是MD5 md5是一种信息摘要算法 是计算机广泛使用的杂凑算法之一 又译摘要算法 哈希算法 它可以从一个字符串或一个文件中按照一定的规则生成一个特殊的字符串 这个特殊的字符串就被称之为摘要 我理解就是从文件中摘一些信息片段加工而
  • R语言colorRampPalette函数-创建颜色梯度(渐变色)

    在绘热图时 需要将数值映射到不同的颜色上 这时就需要一系列的颜色梯度 colorRampPalette 函数支持自定义的创建一系列的颜色梯度 代码示例 gt colors lt colorRampPalette c blue red 5 g
  • windows加固-服务安全

    禁用TCP IP上的NetBIOS NETBIOS 在安装了TCP IP协议的同时 NetBIOS也会被作为默认设置安装到系统中 NetBIOS 协议所使用的端 是139端口 139 端 的开放意味硬盘可能会在网络中共享 网上黑客也可通Ne
  • 网络地址转换的类型及特点

    1 网络地址转换的类型及特点 NAT有三种类型 静态NAT StaticNAT 动态地址NAT PooledNAT 网络地址端口转换NAPT Port LevelNAT 静态NAT 指将内部网络的私有IP地址转换为公有IP地址 IP地址对是
  • On Distillation of Guided Diffusion Models

    本论文是解决什么问题的 无分类器引导扩散模型最近被证明在高分辨率图像生成方面非常有效 无分类器的引导扩散模型的缺点是 它们在推理时计算昂贵 原因是 因为它们需要评估两个扩散模型 一个类条件模型和一个无条件模型 数十到数百次 这篇论文提出的解
  • Linux Ubuntu安装教程

    1 创建新的虚拟机 2 选择 典型 点击 下一步 3 选择 稍后安装操作系统 点击 下一步 4 选择 Linux 版本选择 ubuntu 64位 点击 下一步 5 虚拟机名称输入 ubuntu 64位 点击 浏览 更改系统的安装位置 建议安
  • MySQL基础命令学习

    MySQL安装请看上一篇MySQL server安装记录 进入到数据库管理系统 DBMS C Windows System32 gt cd D mysql 8 0 22 winx64 bin D mysql 8 0 22 winx64 bi
  • Web自动化测试(5)-POM

    POM设计模式 目录 POM设计模式 1 简介 2 简单示例 3 UnitTest框架测试用例执行顺序 4 数据驱动 5 简单示例 1 简介 POM Page Object Model 设计模式又被称为页面对象模型 其核心思想是将web项目
  • 面向小白的最全Python可视化教程,超全的

    今天小编总结归纳了若干个常用的可视化图表 并且通过调用plotly matplotlib altair bokeh和seaborn等模块来分别绘制这些常用的可视化图表 最后无论是绘制可视化的代码 还是会指出来的结果都会通过调用streaml
  • Vue3全网最细介绍使用

    文章目录 一 Vue3介绍 二 Vue3项目创建 三 Setup 四 ref与reactive 五 setup context 六 计算属性 七 监听属性 八 Vue3生命周期 九 自定义hook函数 十 toRef 一 Vue3介绍 1