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.mzph.cn/news/885570.shtml

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

相关文章

AI与就业:技术革命下的职业转型与挑战

内容概要 在当今时代&#xff0c;人工智能的迅猛发展正在深刻影响着我们的就业市场。这一技术革命不仅让我们看到了未来的职业转型&#xff0c;还引发了对于新兴技能需求的深思。随着AI技术的普及&#xff0c;许多传统行业面临着巨大的变革压力&#xff0c;同时也为新兴领域创…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

Uubntu下的Boost库安装及使用

一、Boost库介绍 Boost库是为C语言标准库提供扩展的一些C程序库的总称。 Boost库由Boost社区组织开发、维护。其目的是为C程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C标准库共同工作&#xff0c;并且为其提供扩展功能。Boost库使用Boost License来授权使用&…

【王木头】最大似然估计、最大后验估计

目录 一、最大似然估计&#xff08;MLE&#xff09; 二、最大后验估计&#xff08;MAP&#xff09; 三、MLE 和 MAP 的本质区别 四、当先验是均匀分布时&#xff0c;MLE 和 MAP 等价 五、总结 本文理论参考王木头的视频&#xff1a; 贝叶斯解释“L1和L2正则化”&#xff…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组&#xff0c;它表示BST(即 二叉搜索树 )的 先序遍历 &#xff0c;构造树并返回其根。 保证 对于给定…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

CatLIP,加速2.7倍!采用分类损失的CLIP水准的预训练视觉编码器

CatLIP&#xff0c;加速2.7倍&#xff01;采用分类损失的CLIP水准的预训练视觉编码器 FesianXu 20241018 at Wechat Search Team 前言 传统的CLIP采用对比学习的方式进行预训练&#xff0c;通常需要汇聚多张节点的多张设备的特征向量以进行打分矩阵的计算&#xff0c;训练速度…

linux笔记(selinux)

一、概述 定义SELinux&#xff08;Security - Enhanced Linux&#xff09;是一种基于 Linux 内核的强制访问控制&#xff08;MAC&#xff09;安全机制。它为 Linux 系统提供了更细粒度的安全策略&#xff0c;增强了系统的安全性。目的主要目的是限制进程对系统资源&#xff08;…

江西省补贴性线上职业技能培训管理平台(刷课系统)

江西省补贴性线上职业技能培训管理平台(刷课系统) 目的是为了刷这个网课 此系统有两个版本一个是脚本运行&#xff0c;另外一个是可视化界面运行 可视化运行 技术栈:flask、vue3 原理: 通过分析网站接口&#xff0c;对某些接口加密的参数进行逆向破解&#xff0c;从而修改请求…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

简单介绍一下mvvm mvc mvp以及区别、历史

MVC&#xff08;Model - View - Controller&#xff09; 因MVC架构的灵活性&#xff0c;架构图形式很多&#xff0c;仅供参考 历史&#xff1a; MVC 是最早出现的软件架构模式之一&#xff0c;其历史可以追溯到 20 世纪 70 年代&#xff0c;最初被用于 Smalltalk - 80 环境。…

“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“

我的个人主页 接下来我将方享四道由易到难的编程题&#xff0c;进入我们的JavaSE复习之旅。 1&#xff1a;大小写转换------题目链接 解题思路&#xff1a; 在ASCII码表中&#xff0c;⼤写字⺟A-Z的Ascii码值为65- 90&#xff0c;⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟…

设备租借系统(源码+文档+部署+讲解)

本文将深入解析“设备租借系统”的项目&#xff0c;探究其架构、功能以及技术栈&#xff0c;并分享获取完整源码的途径。 系统概述 本项目名称为设备租借系统&#xff0c;是对企业内部设备进行信息化管理的系统&#xff0c;可以实现设备的借用、归还、状态跟踪等功能&#xff…

使用 PageHelper 在 Spring Boot 项目中实现分页查询

目录 前言1. 项目环境配置1.1 添加 PageHelper 依赖1.2 数据库和 MyBatis 配置 2. 统一的分页响应类3. 使用 PageHelper 实现分页查询3.1 Service 层分页查询实现3.2 PageHelper 分页注意事项 4. 控制层调用示例5. 常见问题与解决方案5.1 java.util.ArrayList cannot be cast t…

【C++】C++移动语义、左值右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符

二十五、C移动语义、左值和右值、左值引用右值引用、移动构造函数、std::move、移动赋值操作符 本部分讨论一些更高级的C特性&#xff1a;C移动语义。但是讲移动语义之前我们得先了解什么左值右值、左值引用和右值引用。 1、C的左值和右值、左值引用和右值引用左值是有地址的…

【国内中间件厂商排名及四大中间件对比分析】

国内中间件厂商排名 随着新兴技术的涌入&#xff0c;一批国产中间件厂商破土而出&#xff0c;并在短时间内迅速发展&#xff0c;我国中间件市场迎来洗牌&#xff0c;根据市占率&#xff0c;当前我国中间件厂商排名依次为&#xff1a;东方通、宝兰德、中创股份、金蝶天燕、普元…

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外&#xff0c;还会导致占用过多的系统CPU和内存资源&#xff0c;造成系统卡顿、发热、电池消耗过快&#xff1b;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…

C++上机实验|多态性编程练习

1.实验目的 (1)理解多态性的概念。 (2)掌握如何用虚函数实现动态联编 (3)掌握如何利用虚基类。 2.实验内容 设计一个飞机类 plane,由它派生出歼击机类fighter和轰炸机类 bomber,歼击机类fighter 和轰炸机类bomber 又共同派生出歼轰机(多用途战斗机)。利用虚函数和虚基类描述…