vue2与vue3的比较
源码的升级
-
使用
Proxy
代替defineProperty
实现响应式。 -
重写虚拟
DOM
的实现和Tree-Shaking
。
新的特性
-
Composition API
(组合API
):-
setup
-
ref
与reactive
-
computed
与watch
......
-
-
新的内置组件:
-
Fragment
-
Teleport
-
Suspense
......
-
-
其他改变:
-
新的生命周期钩子
-
data
选项应始终被声明为一个函数 -
移除
keyCode
支持作为v-on
的修饰符......
-
基于 vue-cli 创建
点击查看官方文档
备注:目前
vue-cli
已处于维护模式,官方推荐基于Vite
创建项目。
## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version
## 安装或者升级你的@vue/cli
npm install -g @vue/cli
## 执行创建命令
vue create vue_test
## 随后选择3.x
## Choose a version of Vue.js that you want to start the project with (Use arrow keys)
## > 3.x
## 2.x
## 启动
cd vue_test
npm run serve
基于 vite 创建
vite
是新一代前端构建工具,官网地址:https://vitejs.cn,vite
的优势如下:
-
轻量快速的热重载(
HMR
),能实现极速的服务启动。 -
对
TypeScript
、JSX
、CSS
等支持开箱即用。 -
真正的按需编译,不再等待整个应用编译完成。
-
webpack
构建(下载完所有的包) 与vite
构建(点击当前页面才会下载对应的包)对比图如下:
-
具体操作如下(点击查看官方文档)
## 1.创建命令
npm create vue@latest
nodejs卸载和安装:
直接在控制面板中进行卸载即可,然后选择需要的版本安装
全网最详细的 Node.js 卸载和安装教程_卸载node.js-CSDN博客
npm配置设置默认的镜像源:
npm config set registry https://registry.npmmirror.com/
查看当前使用的镜像源:
npm config get registry
刚开始打开这些文件的时候会报错,执行 npm i 命令,安装对应的包就可解决问题,如果还报错的情况下,再次打开项目,就不会有报错信息了,如果版本不正确,卸载nodejs文件,重新安装就行,或者解对应文件,让这些文件适配当前nodejs版本也行
// vue官方把所有需要配置的文件都声明好了,加上这段代码,ts就能够识别.txt语言了
下载安装devtools插件:
极简插件官网_Chrome插件下载_Chrome浏览器应用商店
OptionsAPI 与 CompositionAPI
-
Vue2
的API
设计是Options
(配置)风格的。 -
Vue3
的API
设计是Composition
(组合)风格的。
Options API 的弊端
Options
类型的 API
,数据、方法、计算属性等,是分散在:data
、methods
、computed
中的,若想新增或者修改一个需求,就需要分别修改:data
、methods
、computed
,不便于维护和复用。
Composition API 的优势
可以用函数的方式,更加优雅的组织代码,让相关功能的代码更加有序的组织在一起。
setup介绍
setup 概述
setup
是Vue3
中一个新的配置项,值是一个函数,它是 Composition API
“表演的舞台”,组件中所用到的:数据、方法、计算属性、监视......等等,均配置在setup
中。
特点如下:
-
setup
函数返回的对象中的内容,可直接在模板中使用。 -
setup
中访问this
是undefined
。 -
setup
函数会在beforeCreate
之前调用,它是“领先”所有钩子执行的。
setup 的返回值
-
若返回一个对象:则对象中的:属性、方法等,在模板中均可以直接使用(重点关注)。
-
若返回一个函数:则可以自定义渲染内容,代码如下:
setup 与 Options API 的关系
- `Vue2` 的配置(`data`、`methos`......)中**可以访问到** `setup`中的属性、方法。
- 但在`setup`中**不能访问到**`Vue2`的配置(`data`、`methos`......)。
- 如果与`Vue2`冲突,则`setup`优先。
setup 语法糖
setup
函数有一个语法糖,这个语法糖,可以让我们把setup
独立出去,代码如下:
扩展:下面代码,还需要编写一个不写setup
的script
标签,去指定组件名字,比较麻烦,我们可以借助vite
中的插件简化
-
第一步:
npm i vite-plugin-vue-setup-extend -D
-
第二步:
vite.config.ts,配置如下:
import { defineConfig } from 'vite'
import VueSetupExtend from 'vite-plugin-vue-setup-extend'
export default defineConfig({
plugins: [ VueSetupExtend() ]
})
3.第三步:<script setup lang="ts" name="Person">
person组件:
<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>
<hr />
<hr />
<!-- <h1>测试1: {{ a }}</h1>
<h1>测试2: {{ c }}</h1>
<button @click="b">测试</button> -->
</div>
</template>
<!-- <script lang="ts"> -->
// 这是选项式API,name,data,methods都是选项,vue3zh可以写vue2的语法 // export
default { // name: "Person", // beforeCreate() { // console.log("beforeCreate");
// }, // data() { // return { // a: 100, // c: this.name, // d: 900, // }; // },
// methods: { // b() { // console.log("b"); // }, // }, // setup() { //
console.log("@@", this); // setup函数中的this是undefined,Vue3中已经弱化this //
// 数据,原来是写在data中的,此时的name,age,tel都不是响应式的数据 // let name =
"张三"; // // let name = "张三"; //
直接这样写变量,页面不会有变化,数据不是响应式的,此时的name不是响应式 // let age =
18; //此时的age不是响应式 // let tel = "13888888888"; //此时的tel不是响应式 //
let address = "北京昌平区宏福苑 宏福科技园"; // let x = this.d; // // let x = d;
// 在setup中直接写vue2当中的语法会报错 // 方法 // function changeName() { //
name = "zhang-san"; // } // function changeAge() { // age += 1; // } // function
showTel() {} // // 将数据,方法交出去,模板中才可以使用 // return { name, age,
changeName, changeAge, showTel, address }; // setup的返回值也可以是一个渲染函数
// return function () { // return "hhah"; // }; // return () => { // return
"hhah"; // }; // }, // data() { // // vue2可以写vue3的写法 // return { // name:
"张三", // age: 18, // tel: "13888888888", // }; // }, // methods: { //
changeName() { // this.name = "zhangsan"; // }, // changeAge() { // this.age +=
1; // }, // showTel() { // alert(this.tel); // }, // }, // }; // //
<!-- </script> -->
<!-- 下面的写法是setup语法糖 -->
<!-- 可以通过插件来自定义当前组件的名字,不然就需要写上两个script,其中一个用来写上组件的名称name,另外一个用来写方法,属性,数据等 -->
<script lang="ts" setup name="Person123">
console.log("@@", this); // setup函数中的this是undefined,Vue3中已经弱化this
// 数据,原来是写在data中的,此时的name,age,tel都不是响应式的数据
let name = "张三";
// let name = "张三"; // 直接这样写变量,页面不会有变化,数据不是响应式的,此时的name不是响应式
let age = 18; //此时的age不是响应式
let tel = "13888888888"; //此时的tel不是响应式
let address = "北京昌平区宏福苑 宏福科技园";
// let x = this.d; //
// let x = d; // 在setup中直接写vue2当中的语法会报错
// 方法
function changeName() {
name = "zhang-san";
}
function changeAge() {
age += 1;
}
function showTel() {}
// 将数据,方法交出去,模板中才可以使用
// return { name, age, changeName, changeAge, showTel, address };
// setup的返回值也可以是一个渲染函数
// return function () {
// return "hhah";
// };
// return () => {
// return "hhah";
// };
</script>
<style scoped>
.person {
background-color: skyblue;
box-shadow: 0 0 10px;
border-radius: 10px;
padding: 20px;
}
</style>
App.vue组件:
<template>
<!-- html结构 -->
<div class="app">
<h1>你好啊!</h1>
<Person />
</div>
</template>
<script lang="ts">
import Person from "./components/Person.vue";
// JS或TS
export default {
name: "App", //组件名
components: { Person }, // 注册组件
};
</script>
<style>
/* 样式 */
.app {
background-color: #ddd;
box-shadow: 0 0 10px;
border-radius: 10px;
padding: 20px;
}
</style>