前言:

从今天开始来和大家一起学习 vue3 相信大家都不陌生,已经火了一段时间了,但是还是有不少人没有学习,那就跟着六扇老师来简单的入个门

废话不多说,来开始今天的学习

Vue3 简介:

2020年,9月,18日,Vue.js发布3.0版本,耗时两年多,2600+次提交,99位贡献值

github 上的 tags 地址 :https://github.com/vuejs/core/releases/tag/v3.0.0

Vue3 带来了什么:

  1. 性能的提升,更快,更小,打包大小减少,初次渲染,更新渲染更快,内存减小
  2. 源码的升级,使用 Proxy 代替 defineProperty 实现响应式,重新写了虚拟 DOM 的实现 - 让虚拟DO M 更快了 和 Tree-Shaking - 术语 干掉了没有使用的代码,让打包体积更小
  3. 拥抱了 TS ,vue3 更好的支持 TypeScript
  4. 增加了新特性

Composltlon API (组合 API)

  • setup 配置
  • ref 、 reactive
  • watch 、watchEffect
  • provide 、 inject

新的内置组件

  • Fragment
  • Teleport
  • Suspense

其他

新的生命周期钩子

data 不再是对象,始终是一个函数

......

上边的东西只是一个了解,混一个脸熟,不会,看不懂也没有关系,后边我们会一个个讲,看一遍就会的,尤其是有 vue2 基础的

说了怎么,不如上手写写一遍,下面我们就开始创建我们的 vue3

vue3 的创建:

创建 vue3 项目有两种方式,一种是 vue 传统的创建方式 一种是 vite 创建

  • 使用 vue-cli 创建
vue create vue3项目的name
  • 使用 vite 创建

当然这里插一个题外话,什么是 vite ----- 下一代前端构建工具差不多也是新一代了,现一代是webpack

vite 官网 :https://cn.vitejs.dev/

vite 有什么优势呢?

  • 开发环境中,无需打包操作,快速的冷启动
  • 热重载(HMR) 更轻量,快 (局部刷新)
  • 按需编译,不用再等待整个应用的编译

vite 优势也差不多就是特点

传统的构建相信用过 webpack 都知道,他是通过入口文件然后分析路由,再去分析模块,都分析完了进行打包,然后告诉你服务器准备好了

vite 构建的工作模式,一上来就给用户准备好服务器,然后等待用户请求,假如你发起了一个请求,然后 vite 会根据你的路径 进入 入口文件然后找到 你的路由,分析该路由的模块,然后给你 (动态的引入和代码分割)

用 vite 创建 vue3

npm init vite-app vue3项目的name

当然 vite 创建是没有依赖的,需要进入项目自己在 npm i

而且 vite 自配置的启动 是 npm run dev

vite 会更快,不信你就都下载然后对比一下,实践出真理

分析工程结构图:

接下来让我们分析一下 vue3 的工程结构 看看和 vue2 到底有什么区别,我们以 vue-cli 下载好的 vue3 项目为例

打开文件,我们发现 vue3 的目录结构和摆放位置都和 vue2 一样没什么区别

只不过 vue3 文件里面的一些语法和 vue2 不同

接下来我们来分析吧,如何分析?

main.js

首先我们打开项目的入口文件 main.js,一共写了三行代码,和 vue2 不同了吧

import { createApp } from 'vue'

import App from './App.vue'

createApp(App).mount('#app')

其中 import App from './App.vue' 我们见过在 vue2 中也有 意思是 引入所有组件的外壳组件,也就是所有组件的父亲

import { createApp } from 'vue'  引入的不再是 Vue 构造函数了 是有一个 createApp 应用的实例对象,工厂函数

vue2 里面 我们是 new 一个 vue 是一个构造函数

vue3  createApp 直接是 一个工厂函数 ,可以直接调用

有什么不同呢?

来我们先回忆一下 vue2 中的写法,

new Vue({

render:(h)=>{

return h(app)

}

}).$mount('#app')

我们拆解一下

const vm = new vue({render:h => h(app)})

vm.$mount('#app')

这是之前的写法,接下来我们再把 createApp(App).mount('#app') 拆解

const app = createApp(App)

app.mount('#app')

这样一对比是不是明白了

const app = createApp(App) 其实就是 创建实例应用对象  (和 vue2 里面的 vm 类似 但 app 更轻)

app本质就是一个对象,里面好多东西,vm里面很多需要的不需要的都放在里面,但 app 更精,减少了不需要的东西,所以“轻”了

App.vue

入口文件分析完了,我们按照代码执行的方式,接下来分析 App.vue

进入 App.vue 和 vue2 一样 template script style 没区别

但是有一个地方发生变化了,那就是 template 里边没有 div 了

vue3 组件中的模板结构可以没有根标签了(可以有,可以没有)写不写都行了

Composition Api 初识:

composition 组合式 API 这概念有点长,有点多,不太好理解,先不讲,暂时知道 composition 是组合式 AIP 就行

setup:

想玩 vue3 最好就是先学 setup,因为 setup 是 所有组合式API(comosition)的大舞台

setup是什么?

是 vue3 中一个新的配置项,一个函数,新增

页面中需要的数据,也就是组件中所应用的数据,方法,生命周期,计算属性等等等,都要配置写在 setup 中

那怎么配置呢,直接上手,写代码

export default {

name: 'App',

setup(){

let name = '六扇老师'

let age = '18'

// 方法

function sayHello(){ alert(`你们好,我是${name},今年${age}`) }

},

}

和 vue2 不一样了,我们 vue3 需要数据不用 data 了 直接写就行了

setup 的返回值

写完问题也就来了,诶六扇老师,我光写完数据和方法了,我在组件中怎么使用呢?

这里就要说 setup 的返回值了,它有两种一种是返回对象,一种是渲染函数

  • 若 setup 返回的是一个对象,则对象中的属性,方法,直接就可以在模板中使用,和 vue2  一样 (主要的内容)

setup(){

let name = '六扇老师'

let age = '18'

function sayHello(){ alert(`你们好,我是${name},今年${age}`) }

return { name, age, sayHello, }

},

我们直接在 setup 最后加一个 return 返回我们的 数据

然后再模板中和 vue2 一样去引用,启动项目

接下来我们再看 setup 的另一种返回值

  • 返回一个渲染函数,可以自定义渲染内容(了解就行,不常用)

可以看到我们上边写的也不生效了,setup 返回的渲染函数为主了

当然返回的渲染函数前提需要引入 h ,渲染函数

题外话:vue3 是向下兼容的,你可以在 vue3 中写 vue2 语法的代码,如果都写一起得话,在 vue2 的方法中能获取到 vue3 里面 setup 的值

但是 在 vue3 中 不能获取到 vue2 中 data 的值,而且如果有同名的,setup 优先

不建议与 vue2 配置混用,因为不知道什么时候就不兼容了,要不还学 vue3 干嘛

setup 不能是一个 async 函数,因为返回值不再是 return 的对象,而是 promise, 模板看不到 retuen 里面的数据对象

ref 函数

ref初识

我们在 vue2 的时候学过 ref ,是一个标签属性,给一个元素打标识,方便我们拿到,然后使用

但 vue3 里面多了一个名为 ref 的函数

在学习 ref 函数之前我们先思考一个问题,上边我们已经写了数据,那如何修改呢?

老师我知道,直接写一个函数,然后调用,让 name 等于别的就修改了

我们可以看到,这样写了之后,数据是修改了,但是页面却没有修改,也就是 vue 没有发现

vue 不认识,也就是说你这样定义的数据它只是普通的数据,根本不是响应式数据

那如何把普通的数据变成 vue 可以监测到的响应式数据呢,这就用到了 ref 函数

首先我们要先引入我们的 ref 函数

import {ref} from 'vue'

export default {

setup(){

let name = ref('六扇老师')

let age = ref('18')

function changeInfo(){

console.log(name,age)

}

return {
name,
age,
changeInfo,
}

}

我们看用 ref 函数更改完的数据,它是一个 RefImpl 的实例对象,那什么是 RefImpl 对象?

我们拆开来看,Ref ---> reference 引用,Impl implement 实现

那 RefImpl 标准的称呼就是"引用实现的实例对象",简称引用对象

然后我们看里面,其他的值我们不看,就看一个 value 和 原型对象里面的 set 和 get

熟悉吧,和 vue2 一样,拿到你的数据,然后通过 set 和 get 修改,然后页面等等等

那怎么修改呢,直接在你要修改的值后边加上 .value 就修改完成了

小知识:template 组件里面的发现 ref 对象会自动获取到 value 值,所以直接写就能获取到值

ref 复杂对象

弄完基本类型数据,我们用 ref 写一个对象类型

数据有了,那我们怎么更改呢,其实也简单,看图我也经把 job.value 打印出来了

直接 job.value.type = 什么值,就可以更改了

那问题来了 ref 加工之后不是都 RefImpl 对象吗,为什么 job.value 变成 Proxy 对象了呢,带着这个问题,往下看 reactive 函数

总结:

ref 的作用,定义了一个响应式数据。创建了一个包含响应式数据的引用对象(reference对象,简称 ref 对象)

接受的数据可以是:基本类型,也可以是:对象类型

基本类型的数据:和 vue2 一样响应式依然是靠 Object.defineProperty() 的 get 与 set 完成的

对象类型的数据:内部 求助 了 vue3 中的一个新函数 reactive 函数

题外话:vue3 接受到 对象类型的数据,底层就是 用 ES6 新语法 Proxy 来处理的,但是在 vue3 中并没有直接使用,而是被封装到 reactive 函数里面

reactive 函数

reactive 只能定义对象类型和数组的响应式数据 (基本类型用 ref ),之所以 ref 可以是因为 ref 内部求助了 reactive

用完 reactive 之后就和正常使用一样了,直接点就行

当然数组也是同理,直接放在里面写就行了,对象怎么用他怎么用,而且还能直接通过索引去改,这是 vue2 办不到的

let arr = reactive(["学习","喝酒","烫头"])

function changeInfo(){

arr[0] = "抽烟"

}

reactive 的语法:

const 代理对象 = reactive(原对象),接受到一个对象或数组,返回一个代理对象(Proxy的实例对象)

reactive 定义的响应式数据是更深层次的,不管有多深都能点出来

内部是通过 ES6 的 Proxy 实现,通过代理对象操作原对内部数据进行操作,并且这种操作是可以被 vue 所捕获到的,也就是我们说的数据劫持

题外话:

学到这里有同学该问了,那老师这样写太墨迹了,一会 ref . vaule 一会 reactive 不点咋解决呢

还是那句话,代码是死的人是活的,就像我们这几个数据,你可以直接这样去写

这样是不是语法语义都正确了,而且还省事了,但是我还是觉得有点麻烦,不想点来点去的,别急留一个问题,我们下章再讲

学习 vue3 第一天 vue3简介,创建vue3项目 Composition Api 初识的更多相关文章

  1. 快乐学习 Ionic Framework+PhoneGap 手册1-1{创建APP项目}

    快乐学习 Ionic Framework+PhoneGap 手册1-1 * 前提必须安装 Node.js,安装PhoneGap,搭建Android开发环境,建议使用真机调试 {1.1}= 创建APP项 ...

  2. 学习笔记-使用cmd命令行创建nodejs项目

    使用cmd命令行创建nodejs项目 1)在DOS下cd 进入到你想要创建项目的路径. 2)mkdir sing (创建一个sing文件夹) 3)cd sing  4) npm init (初始化工程 ...

  3. Maven学习(二)使用命令创建maven项目

    创建maven项目 手动 严格参照约定目录结构,我们开始手动新增文件夹 命令方式 project项目 我们也可以使用maven自动生成目录: mvn archetype:generate -Dgrou ...

  4. maven学习(八)——使用maven创建javaweb项目

    构建JavaWeb项目 1.创建JavaWeb项目 1.使用mvn archetype:generate命令,如下所示: mvn archetype:generate -DgroupId=com.my ...

  5. Java知识系统回顾整理01基础01第一个程序04创建Eclipse项目

    一.为Eclipse设置桌面快捷方式图标 二.双击桌面快捷方式打开Eclipse 三.选择工作区 使用在命令行Hello World中的项目目录e:\project 除了第一次启动eclipse的时候 ...

  6. 《跟我学Shiro》学习笔记 第一章:Shiro简介

    前言 现在在学习Shiro,参照着张开涛老师的博客进行学习,然后自己写博客记录一下学习中的知识点,一来可以加深理解,二来以后遗忘了可以查阅.没有学习过Shiro的小伙伴,也可以和我一起学习,大家共同进 ...

  7. django学习自修第一天【简介】

    1. MVC框架 MVC框架的核心思想是解耦,降低各功能之间的耦合性,方便重构代码 (1)低耦合,高内聚 (2)高可扩展性 (3)向后兼容 2. MVT框架 V(视图):核心处理,接受请求,调用模型获 ...

  8. 01-vue学习篇-以优雅的姿势创建vue项目

    前言 小白一枚,今年(2019)准备学习一下前端的技术,因为发现自己对后端(python)相对比较熟悉但是还是写不出一个优雅的系统,可见前端的重要性,于是静下心来跟大佬学习.在不断的激励自己调整自己的 ...

  9. IDEA 创建HDFS项目 JAVA api

    1.创建quickMaven 1.在properties中写hadoop 的版本号并且通过EL表达式的方式映射到dependency中 2.写一个repostory将依赖加载到本地仓库中 这是加载完成 ...

  10. 《Asp.Net Core3 + Vue3入坑教程》 - Vue 1.使用vue-cli创建vue项目

    简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...

随机推荐

  1. 01-MyBatisPlus简介

    一.简介 官网:http://mp.baomidou.com/ 参考教程:https://baomidou.com/pages/24112f/ MyBatis-Plus(简称 MP)是一个 MyBat ...

  2. 输入法词库解析(五)极点码表.mb

    详细代码:https://github.com/cxcn/dtool 前言 mb 是极点五笔的码表格式. 解析 偏移量 描述 0x00 版本信息 0x1B 码表介绍 0x11F 所用到的按键数 0x1 ...

  3. IEEE浮点数向偶数舍

    CSAPP ​ 向偶数舍入初看上去好像是个相当随意的目标--有什么理由偏向取偶数呢?为什么不始终把位于两个可表示的值中间的值都向上舍入呢?使用这种方法的一个问题就是很容易假想到这样的情景:这种方法舍入 ...

  4. kibana配置文件kibana.yml参数详解

    server.port: 默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号. server.host: 默认值: "localhost" 指定后端服务 ...

  5. 第三章:模版层 - 1:Django模板语言详解

    本节将介绍Django模版系统的语法.Django模版语言致力于在性能和简单性上取得平衡. 如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版 ...

  6. 存储类StorageClass

    存储类概述 StorageClass 存储类用于描述集群中可以提供的存储的类型.不同的存储类可能对应着不同的: 服务等级(quality-of-service level) 备份策略 集群管理员自定义 ...

  7. Beats: 使用 Filebeat 进行日志json结构化 - Python

    文章转载自:https://elasticstack.blog.csdn.net/article/details/106688240

  8. jumpserver 2222端口的使用

    可以这样理解: 通过在jumpserver的web界面添加的用户,相应的也有权限通过远程使用命令的方式登陆jumpserver,进行相应的管理,只不过使用的端口是2222端口,不是常见的22端口. 一 ...

  9. 使Squashfs可写的办法

    yiyi@yiyi-HP-Pavilion-Notebook:~/Applications/Office2016$ pwd /home/yiyi/Applications/Office2016 yiy ...

  10. Spring Boot 配置 jar 包外面的 Properties 配置文件

    一.概述 Properties 文件是我们可以用来存储项目特定信息的常用方法.理想情况下,我们应该将其保留在 jar 包之外,以便能够根据需要对配置进行更改. 在这个教程中,我们将研究在 Spring ...