Vue3 学习 (一)

目录

编码规范

一、Vue3 简介

二、创建 Vue3 工程

(一)基于 vue-cli 创建

(二)基于 vite 创建(推荐)

1.介绍

2.特点

3.过程

4.项目文件介绍

1° .vscode 文件夹

2°public 文件夹

3°src 文件夹

main.ts 文件

App.vue 文件

4°env.d.ts 文件

5°index.html 入口文件

6°package.json 文件

三、Vue3 核心语法

(一)OptionsAPI 和  CompositionsApi

(二)拉开序幕的 setup

1.setup 基本写法

2.setup 返回值

3.setup 和传统的配置项的区别

4.setup 新写法

(三) 响应式数据

1.ref 创建基本类型的响应数据

2.reactive 定义对象类型的响应数据

3.ref 定义对象类型的数据

4.ref 和 reactive 的区别

1° ref

 2° reactive


编码规范

Vue3 通常和 typescript 结合使用 

采用 TypeScript + 组合式 api + setup 语法糖 的形式 

一、Vue3 简介

和 Vue2 相比 性能得到提升 向下兼容 可以兼容 vue2 

源码升级 使用 Proxy 代替 definedProperty 实现响应式

重写虚拟 DOM 的实现和Tree-Shaking

可以更好的支持 TypeScript

新的特性:

组合式 API:setup ref与reactive computed 与 watch

新的内置组件 

新的声明周期钩子

data 选项始终被声明为一个函数

移除 keyCode 支持作为 v-on 的修饰符

二、创建 Vue3 工程

(一)基于 vue-cli 创建

基于 webpack 大哥级别的工具

(二)基于 vite 创建(推荐)

1.介绍

新的构建工具 和 webpack 等价

官网:https://vitejs.cn

2.特点

轻量快速的热重载 能急速实现服务器的启动 启动比较快

使用 webpack 和 vite 的启动流程 对比 有点像懒加载

看啥准备啥

typescript  jsx(是js 和 结构混着写的语法) css 等开箱即用 不用配置其它东西

3.过程

在桌面上安装环境

设置 项目基本的配置

 然后就创建成功了

把项目放到 vscode 中 

安装 vue - offical 默认安装好的

这俩合并了

4.项目文件介绍

1° .vscode 文件夹

里面是一个json 文件 里面记录了我们使用的 Vue 插件 如果我们没安装插件 就会弹出是否安装官方的插件的选项 直接下载即可

2°public 文件夹

就是网页的图标 页签图标

3°src 文件夹

前端工程师所有的工作成果 .js .vue .css

main.ts 文件

createApp 是盆创建了 App

以后的所有的组件都要安装 到根 App 上 

tips:我们 使用 import 引入东西时 不用花括号时 是默认导出 没有规定导出模块的名字 而带花括号时不是默认导出 是引入被命名的模块 花括号里面的内容必须是 文件中被命名的模块名

最后一句好就是 弄好花和花盆 然后 把花盆放到指定的位置(挂载)

App.vue 文件

和 vue2 组件内容类似 区别是 使用 ts 而不是 js 所以得标注上 lang=“ts” 以防报错

运行能正常显示

4°env.d.ts 文件

引入的内容 我觉得这句话说的挺好

刚打开会飘红 因为我们的项目文件夹中缺少依赖

我们使用 npm i 下载我们所需要的依赖

然后就不会报错了

这个文件的作用是 本来 ts类型的文件不认识 .jpg .txt 类型的文件 有了这个 ts 文件能让 ts文件认识这些文件

5°index.html 入口文件

和 vue2 不同不再是 main.js 文件了,我们会发现里面引入了 src 中的 main.ts 文件 

看 script 标签 是 src 中 的 main.ts 支撑着文件跑起来了

上面那个 div 是放置 app 组件的容器(放花盆的位置)

6°package.json 文件

包的管理文件

里面是我们安装的包  一些常用的命令也在里面

npm run dev 把最后面的单词进行替换就能 使用其它命令

7° ts的管理文件 

别删就行

8° vite.config.ts 文件

是整个工程的配置文件,后面要用到 配置代理 

总结

三、Vue3 核心语法

vue2 中的 data methods 即是选项也是配置项(选项式API)

(一)OptionsAPI 和  CompositionsApi

vue2 的 api 是 选项式的 API

name 选项 methods 选项 data 选项都是 选项式的 api

缺点:功能很分散 可能 methods 里面的方法 用到了data 选项中的数据 数据和方法在不同的地方有一个改了 别的也得改

vue3 的 api 是 组合式的 API

组合式的 API 解决了这个问题 使用函数的方式把相关的功更加有序的组合在一起

一个函数里面又有 数据又有 方法又名字 比较集中

(二)拉开序幕的 setup

setup 中根本没有 this 不能使用 this 

tips:vue2 中不能出现多个根标签 vue3 能出现

1.setup 基本写法

原本的 vue2 的配置 选项式 api(配置式 api)

原本的选项式 api 变成了 组合式的 api

setup 里面可以写 vue2 中的很多选项 并且得 return 我们的数据和方法 才能在模板中使用

而且不是响应式的(响应式:如果数据变化了 页面渲染会自动更新)

setup() {
    // setup 中使用不了 this this 是 undefined,vue3 已经在弱化 this 了
    // 数据
    let name = '张三' //此时的 name 不是响应式的
    let age = 18 //此时的 age 不是响应式的
    let tel = '13888888888' //此时的 tel 不是响应式的
    // 方法
    function changeName() {
      // 不用this 数据就在上面 直接改就行
      name = 'zhang-san' //页面现在不会变化
    }
    function changeAge() {
      age += 1//页面现在不会变化
    }
    function showTel() {
      alert(tel)
    }


    return { name, age, changeName, changeAge, showTel }
  }

2.setup 返回值

不一定非得返回一个对象 也能返回一个函数 

    // 将数据方法交出去模板才能使用
    return { name, age, changeName, changeAge, showTel }
    // setup 的返回值也可以是一个渲染函数
    // return () => '哈哈'

返回这个渲染函数时 就不会显示模板中的内容了 而是直接显示 渲染函数中的内容 

 

3.setup 和传统的配置项的区别

如果我们再写一个 data 配置项

新旧的写法能共存 都能正常使用

data 能读取到 setup 中的信息

setup 读取不到 data 中的数据信息

data() {
    return {
      a: 100,
      //data 能读取到 setup 中的数据
      c:this.age
    }
  },

4.setup 新写法(setup 语法糖)

通俗来说就是简单的写法

因为我们如果要使用 setup 中的数据要进行频繁的 return 数据太多我们返回的就更多

直接写在一个 script 标签中 相当于我们 使用了setup 语法

还必须是同一种类型的 script 所以我们 把 lang=”ts“ 加上

<script lang="ts" setup>
let a = 666
</script>

因为我们单独用了一个 script 标签来写 setup 文件 但是之前的 script 标签我们也不能删除 因为我们的 组件的名字只能定义在之前的 script 标签中 ,但是这样又会很麻烦 ,我们可以安装一个插件来把名字写在我们后面的那个 script 标签中 来简化代码

如下安装

下载完毕后,然后在 vite.config.ts 文件中引入 然后使用插件

名字成功改变了

(三) 响应式数据

前提:数据为尊

开发者工具中 数据是放在第一位的 而方法等其它东西都被放在 other 中了

vue 2 中 只要把 数据写到 data 中数据就是响应式的

vue 3 中 有两个东西来定义响应式数据 一个是 ref 一个是 reactive

1.ref 创建基本类型的响应数据

ref 不是 vue 2 中的那个标签

我们先引入 ref

import {ref} from 'vue'

然后哪个数据是响应式的就用 ref 把哪个数据包裹上 

import {ref} from 'vue'
let name = ref('张三') 
let age = ref(18) 

相当于调用了 ref 函数 里面传入了参数 

里面的数据就变成一个对象了

我们用其中不带下划线的 value 使用这个value属性时我们就得 name.value

但是模板不需要 写 name.value  因为模板给我们默认 加上了 .value  

正常写即可

<template>
  <div class="person">
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }}</h2>
    <button @click="showTel">展示联系方式</button>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">增加年龄</button>
  </div>
</template>

但是我们  script 中必须用 name.value 的形式

动态的数据就实现了 响应式成功

<script lang="ts" setup name="Person">
import {ref} from 'vue'
let name = ref('张三') //此时的 name 不是响应式的
let age = ref(18) //此时的 age 不是响应式的
let tel = '13888888888' //此时的 tel 不是响应式的
console.log(1,name)
// 方法
function changeName() {
  // 不用this 数据就在上面 直接改就行
  name.value = 'zhang-san' //页面现在不会变化
}
function changeAge() {
  age.value += 1//页面现在不会变化
}
function showTel() {
  alert(tel)
}
</script>

2.reactive 定义对象类型的响应数据

我们对象想变成响应式的对象 就得用 reactive 进行包裹对象 而且不用 .value

而且只能定义对象类型的响应式数据

数组同理

查看一下 发现变成代理对象了 说明数据变成响应式的了

 

<template>
  <div class="person">
    <h2>一辆{{ car.brand }}车,价值{{ car.price }}</h2>
    <button @click="changePrice">修改汽车的价格</button>
  <br>
  <h1>游戏列表:</h1>
  <ul>
    <li v-for="g in games" :key="g.id">{{g.name}}</li>
  </ul>
  <button @click="changeFirstGame"></button>
  </div>
</template>


<script lang="ts" setup name="Person">
import { reactive } from 'vue'
// 数据
let car = reactive({ brand: '奔驰', price: 100 })
let games =reactive([
  { id: '01', name: '王者荣耀' },
  { id: '02', name: '原神' },
  { id: '03', name: '三国杀' }
])
// 现在car 是一个代理对象 proxy 原生就有的函数
console.log(car)
// 方法
function changePrice() {
  car.price += 10
}
function changeFirstGame(){
  games[0].name = '流星蝴蝶剑'
}
</script>

<style scoped>
.person {
  background-color: skyblue;
  box-shadow: 0 0 10px;
  border-radius: 10px;
  padding: 20px;
}
</style>

不管数据的层级有多深 只要用 reactive 包裹就是响应式的数据

 

在控制台打印 发现有对象类型的数据是 用 Proxy 包裹的 就是响应式的对象

3.ref 定义对象类型的数据

使用 ref 定义对象型的数据 我们要注意数据不能直接进行使用 不然会出现以下报错

真正的数据在 .value 中 所以改成如下就能正常运行了

注意在games 的后面加上.value 不是在 [ ] 后面加  

4.ref 和 reactive 的区别

其实 ref 定义的响应式对象在底层还是用 reactive 定义的

1° ref

ref 既能定义基本类型的数据 也能定义对象类型的数据

数据在 value 中 

在处理对象类型的数据 时也借用了 reacitve 来完成任务,在 value 中 进行数据代理

 给扩展设置上自动 填充 value

更改数据

没有局限性 直接 就能改对象型的数据

ref 定义的数据是响应式的 只要动了 .value 数据就是响应式的

ref 能直接进行更改

不能越过 value 再利用 ref 重新赋值

 2° reactive

reactive 只能定义 对象类型的数据

数据能直接使用

更改数据

有局限性 不能重新分配一个对象 要不然就会变成非响应式数据

本来是响应式数据 rective 包裹

重新分配了个普通对象就变成非响应式的对象了

解决办法:实在想改我们能采用如下的办法

使用如下的 api 来进行更改数据

小总结

ss

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值