vue3入门知识(一)

vue3简介

性能的提升

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

源码的升级

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

新的特性

1. Composition API(组合API)

  • setup
  • ref与reactive
  • computed与watch

2. 新的内置组件

  • Fragment
  • Teleport
  • Suspense

3. 其他改变

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

创建vue3项目

基于vue-cli创建(基于webpack)

// 安装或升级@vue.cli
npm install -g @vue/cli
// 执行创建命令
vue create project_name

基于vite创建

vite是新一代前端构建工具,官网地址:Vite中文网

vite的优势:

  • 轻量快速的热重载(HMR),能实现极速的服务启动
  • 对TypeScript、JSX、CSS等支持开箱即用
  • 真正的按需编译,不再等待整个应用编译完成
  • webpack构建与vite构建对比图如下:

webpack构建:

vite构建: 

创建项目的命令 

npm create vue@latest

Tips:

  • 确保 Node.js 版本支持 Vue 3:推荐使用 Node.js 14 及以上版本

尝试使用node版本 14.21.3,创建项目时有报错,升级node版本为 16.20.2 之后就可以了

创建项目时的一些配置项设置,仅供参考

安装好的项目文件目录:

这个文件里面有报错,执行一下 npm install 就好了

并且这个文件里面的内容不能删除,他的作用是告诉 TypeScript 引入 Vite 的类型定义

可能还会有上图中这样的报错提示,在确保已经执行npm install之后,重新打开编辑器,报错提示就会消失了

选项式API的弊端

vue2(选项式API)数据、方法、计算属性等,是分散在:data、methods、computed中的,若想新增或者修改一个需求,就需要分别修改data、methods、computed,不便于维护和复用

组合式API的优势

可以用函数的方式,更加优雅的组织代码,让相关功能的代码有序的组织在一起

setup

setup中的this是undefined,vue3中已经弱化this了

setup的执行顺序在beforeCreate之前

setup的返回值可以是一个渲染函数,返回内容直接渲染在页面上

return () => '直接在页面上展示的内容'
<template><div class="person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ age }}</h2><button @click="changeName">修改姓名</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script lang="ts">
export default {// eslint-disable-next-line vue/multi-word-component-namesname: 'Person',setup() {// 这样写的name age tel不是响应式的 vue2中是写在data中的let name = '张三';let age = 18;const tel = '13800138000';function changeName() {name = '李四'; // 这样修改之后页面不会更新 值确实改了但不是响应式的 因此页面未更新};function changeAge() {age += 1;};function showTel() {alert(tel);};// 将数据、方法交出去,模板中才可以使用return {name,age,tel,changeName,changeAge,showTel,};},
};
</script><style scoped lang="less">
.person {button {display: block;margin: 10px 0;}
}
</style>

data、methods可以和setup同时存在

data中可以读取setup中的数据,通过this.xxx来获取,但是setup中是无法读取data中的数据的,因为setup是在data之前执行的

setup语法糖

<template><div class="person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ age }}</h2><button @click="changeName">修改姓名</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script lang="ts">
export default {// eslint-disable-next-line vue/multi-word-component-namesname: 'Person',
};
</script><script setup lang="ts">
// 这样写的name age tel不是响应式的 vue2中是写在data中的
let name = '张三';
let age = 18;
const tel = '13800138000';function changeName() {name = '李四'; // 这样修改之后页面不会更新 值确实改了但不是响应式的 因此页面未更新
};
function changeAge() {age += 1;
};
function showTel() {alert(tel);
};
</script><style scoped lang="less">
.person {button {display: block;margin: 10px 0;}
}
</style>

由于这样需要写两块script标签 ,第一块的主要作用是自定义组件名称,可以借助插件,省略第一块script标签

npm i vite-plugin-vue-setup-extend -D

安装之后在 vite.config.ts 中进行引入配置

<template><div class="person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ age }}</h2><button @click="changeName">修改姓名</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script setup lang="ts" name="Person"> 
// 这样写的name age tel不是响应式的 vue2中是写在data中的
let name = '张三';
let age = 18;
const tel = '13800138000';function changeName() {name = '李四'; // 这样修改之后页面不会更新 值确实改了但不是响应式的 因此页面未更新
};
function changeAge() {age += 1;
};
function showTel() {alert(tel);
};
</script><style scoped lang="less">
.person {button {display: block;margin: 10px 0;}
}
</style>

ref

用于(可以)定义基本类型的响应式数据,也可以定义对象类型的响应式数据,想让哪个数据是响应式的 就用ref包一下,在js代码中使用响应式数据需要用 .value 在模板中不需要

<template><div class="person"><h2>姓名:{{ name }}</h2><h2>年龄:{{ age }}</h2><h2>地址:{{ address }}</h2><button @click="changeName">修改姓名</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script setup lang="ts" name="Person"> 
import { ref } from 'vue';let name = ref('张三');
let age = ref(18);
const tel = '13800138000';
const address = '北京';function changeName() {name.value = '李四';
};
function changeAge() {age.value += 1;
};
function showTel() {alert(tel);
};
</script><style scoped lang="less">
.person {button {display: block;margin: 10px 0;}
}
</style>

 定义对象类型的响应式数据,表面使用的是ref,其实底层用的还是reactive

<template><div class="person"><h2>汽车信息: 一辆{{ car.brand }}车,价值{{ car.price }}</h2><button @click="changePrice">修改汽车的价格</button><br><h2>游戏列表: </h2><ul><li v-for="game in games" :key="game.id">{{ game.name }}</li></ul><button @click="changeFirstGameName">修改第一个游戏的名字</button></div>
</template><script setup lang="ts" name="Person"> 
import { ref } from 'vue';let car = ref({brand: 'BMW',price: 100,
});
let games = ref([{ name: 'LOL', id: 1 },{ name: 'CSGO', id: 2 },{ name: 'DOTA', id: 3 },
]);function changePrice() {car.value.price += 10;
};
function changeFirstGameName() {games.value[0].name = '王者荣耀';
};
</script>

reactive

用于(只能)定义对象类型的响应式数据

<template><div class="person"><h2>汽车信息: 一辆{{ car.brand }}车,价值{{ car.price }}</h2><button @click="changePrice">修改汽车的价格</button><br><h2>游戏列表: </h2><ul><li v-for="game in games" :key="game.id">{{ game.name }}</li></ul><button @click="changeFirstGameName">修改第一个游戏的名字</button><br><h2>{{ obj.a.b.c }}</h2><button @click="changeObj">修改obj</button></div>
</template><script setup lang="ts" name="Person"> 
import { reactive } from 'vue';let car = reactive({brand: 'BMW',price: 100,
});
let games = reactive([{ name: 'LOL', id: 1 },{ name: 'CSGO', id: 2 },{ name: 'DOTA', id: 3 },
]);
let obj = reactive({a: {b: {c: 666,}}
})function changePrice() {car.price += 10;
};
function changeFirstGameName() {games[0].name = '王者荣耀';
};
function changeObj() {// reactive的响应式是深层次的obj.a.b.c = 1000;
};
</script>

ref与reactive

1. ref用来定义:基本类型数据、对象类型数据

2. reactive用来定义:对象类型数据

区别:

1. ref创建的变量必须使用 .value (可以使用volar插件自动添加 .value) 

2. reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)

<template><div class="person"><h2>汽车信息: 一辆{{ car.brand }}车,价值{{ car.price }}</h2><button @click="changeCar">修改汽车</button></div>
</template><script setup lang="ts" name="Person"> 
import { reactive } from 'vue';let car = reactive({brand: 'BMW',price: 100,
});function changeCar() {// 这样会失去响应式// car = {//     brand: '奔驰',//     price: 200,// };// 这样不会失去响应式Object.assign(car, {brand: '奔驰',price: 200,});
};
</script>

 使用原则:

1. 若需要一个基本类型的响应式数据,必须使用ref

2. 若需要一个响应式对象,层级不深,ref、reactive都可以

3. 若需要一个响应式对象,且层级较深,推荐使用reactive

toRefs

把一个响应式对象中的内容拿出来,依然具备响应式的能力

<template><div class="person"><h2>{{ person.name }}</h2><h2>{{ person.age }}</h2><button @click="changeName">修改姓名</button><button @click="changeAge">修改年龄</button></div>
</template><script setup lang="ts" name="Person"> 
import { reactive, toRefs } from 'vue';const person = reactive({name: '张三',age: 18,
});// 直接从响应式对象中解构出来的变量都不是响应式的 需要toRefs包裹才会变成响应式的
let { name, age } = toRefs(person);function changeName() {// 这里修改之后 name、person.name 都会改变name.value += '~';
};
function changeAge() {age.value += 1;
};
</script><style scoped lang="less">
.person {button {margin: 10px;}
}
</style>

toRef

作用和toRefs一样,但每次只能取一个

<template><div class="person"><h2>{{ person.name }}</h2><h2>{{ person.age }}</h2><button @click="changeName">修改姓名</button></div>
</template><script setup lang="ts" name="Person"> 
import { reactive, toRef } from 'vue';const person = reactive({name: '张三',age: 18,
});let name = toRef(person, 'name');function changeName() {// 这里修改之后 name、person.name 都会改变name.value += '~';
};
</script>

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

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

相关文章

数据结构和算法入门

复杂度 大O记法 计算机怎么判断程序性能&#xff1f; 我们都知道编程基本上是在和数据打交道&#xff0c;大多数程序基本都在处理获取数据、查询数据、操作数据、返回数据相关的逻辑。 因此出现了数据结构和算法&#xff0c;这两者出现本质为了解决如何能够更快、更省进行数…

【Linux第八课-进程间通信】管道、共享内存、消息队列、信号量、信号、可重入函数、volatile

目录 进程间通信为什么&#xff1f;是什么&#xff1f;怎么办&#xff1f;一般规律具体做法 匿名管道原理代码 命名管道原理代码 system V共享内存消息队列信号量信号量的接口 信号概念为什么&#xff1f;怎么办&#xff1f;准备信号的产生信号的保存概念三张表匹配的操作和系统…

串的模式匹配

子串的定位操作通常称为串的模式匹配&#xff0c;它求的是子串(常称模式串)在主串中的位置。 子串——主串的一部分&#xff0c;一定存在 模式串——不一定能在主串中找到 朴素模式匹配 将主串中所有长度为m的子串&#xff08;共有n-m1个&#xff09;依次与模式串对比&…

继承的学习

1.继承 继承权限在类外&#xff0c;访问权限在类内部 1.1继承的概念 继承是面向对象程序设计使代码可以复用的重要手段&#xff08;解决类层次的复用问题&#xff09; 派生类&#xff1a;类特性的基础上进行扩展&#xff0c;增加方法&#xff08;成员函数&#xff09;和属性…

YOLOPv2论文翻译

YOLOPv2: Better, Faster, Stronger for Panoptic Driving Perception 摘要 在过去的十年中&#xff0c;多任务学习方法在解决全景驾驶感知问题方面取得了令人鼓舞的成果&#xff0c;既提供了高精度又具备高效能的性能。在设计用于实时实际自动驾驶系统的网络时&#xff0c;这…

跳表原理-课堂笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

贪心day04(买卖股票的最佳时机)

1.买卖股票的最佳时机 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们其实只需遍历一篇就可以解决这个问题。首先我们定义一个min为无穷大值&#xff0c;再遍历只要有数字比min跟小我们就更改min的值就好&#xff0c;此时我们只需要找出…

【Python爬虫实战】深入解锁 DrissionPage:ChromiumPage 自动化网页操作指南

&#x1f308;个人主页&#xff1a;易辰君-CSDN博客 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、ChromiumPage基础操作 &#xff08;一&#xff09;初始化Drission 和 ChromiumPage 对象 &#xff0…

VS Code 插件 MySQL Shell for VS Code

https://marketplace.visualstudio.com/items?itemNameOracle.mysql-shell-for-vs-code

稳压二极管详解

目录 1. 工作原理 2. 稳压二极管的伏安特性曲线 3. 正向特性&#xff1a; 4. 反向特性 5. 稳定电压&#xff08;Vz&#xff09; 6. 动态电阻&#xff08;rz&#xff09; 7.最大耗散功率&#xff08;PzM&#xff09; 8. 最大稳定工作电流&#xff08;IzMAX&#xff09;和…

Springboot 一个西餐主题网站-计算机设计毕业源码73020

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 2.2.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设…

JS渗透(安全)

JS逆向 基本了解 作用域&#xff1a; 相关数据值 调用堆栈&#xff1a; 由下到上就是代码的执行顺序 常见分析调试流程&#xff1a; 1、代码全局搜索 2、文件流程断点 3、代码标签断点 4、XHR提交断点 某通js逆向结合burp插件jsEncrypter 申通快递会员中心-登录 查看登录包…

世界技能竞赛大数据应用开发环境1:1还原

关注我&#xff0c;私信我获得集群环境 集群情况 模块A搭建环境&#xff0c;在容器中搭建大数据平台 Hadoop HA环境 Pc机&#xff0c;安装安装比赛需要软件 模块B中使用idea快速开发完成数据处理 模块E包含了接口数据&#xff0c;使用vs code快速搭建vue数据可视化

【c++丨STL】vector模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…

指针的运用

接下来我将会用的话&#xff0c;讲解我对指针运用仅有的印象 1.解引用 int a23; int*p&a; *p666; 而*p666&#xff1b;&#xff0c;便是解引用操作&#xff0c;跟简单地说*p便是解引用&#xff0c;它的意思是&#xff0c;对p中所储存的地址所在位置的内容进行操作&#xf…

三周精通FastAPI:38 针对不同的编程语言来生成客户端

官方文档&#xff1a;https://fastapi.tiangolo.com/zh/advanced/generate-clients/ 生成客户端 因为 FastAPI 是基于OpenAPI规范的&#xff0c;自然您可以使用许多相匹配的工具&#xff0c;包括自动生成API文档 (由 Swagger UI 提供)。 一个不太明显而又特别的优势是&#…

广告联盟有哪些

随着互联网的发展&#xff0c;越来越多的人开始投身于网站建设和运营。对于站长来说&#xff0c;如何在提供优质内容的同时获取收益是一个重要的问题。广告联盟作为一种常见的盈利模式&#xff0c;受到了广大站长的青睐。本文将介绍5个适合国内站长的广告联盟平台&#xff0c;帮…

兵马未动,粮草先行-InnoDB统计数据是如何收集的

我们前面介绍查询成本的时候经常用到一些统计数据&#xff0c;比如通过SHOW TABLE STATUS可以看到关于表的统计数据&#xff0c;通过SHOW INDEX可以看到关于索引的统计数据&#xff0c;那么这些统计数据是怎么来的呢&#xff1f;它们是以什么方式收集的呢&#xff1f;本章将聚焦…

【Promise】JS 异步之宏队列与微队列

文章目录 1 原理图2 说明3 相关面试题3.1 面试题13.2 面试题23.3 面试题33.4 面试题4 1 原理图 2 说明 JS 中用来存储待执行回调函数的队列包含 2 个不同特定的队列&#xff1a;宏队列和微队列。宏队列&#xff1a;用来保存待执行的宏任务(回调)&#xff0c;比如&#xff1a;定…

基础概念理解

一&#xff0c;数据结构分类 连续结构&#xff0c;跳转结构。 二&#xff0c;对变量的理解 在 C 语言中&#xff0c;变量是用于存储数据的抽象符号。变量本质上是一块内存区域的标识符&#xff08;即它代表内存中的某一块区域&#xff09;&#xff0c;用来存储数据&#xff…