vue3(一):Vue3简介、创建vue3工程、Vue3中的响应式

目录

一.Vue3简介

1.性能提升

2.源码升级

3.拥抱ts

4.新特性

(1)Composition API(组合API):

(2)新的内置组件:

(3)其他改变:

二.创建vue3工程

1.使用vue/cli创建(基于webpack)

2.使用vite创建(推荐)

优势:

3.分析工程结构

​编辑

4.编写App组件

5.OptionsAPI和CompositionAPI

6.setup

7.setup和OptionsAPI(面试题)

8.setup语法糖

三、vue3中的响应式

1.ref函数

(1)简单数据类型:

(2)复杂数据类型:

2.reactive函数

处理对象数据类型:

处理数组数据类型:

3.reactive和ref的对比

(1)定义的角度

(2)原理的角度

(3)使用的角度

4.toRefs和toRef

(1)toRefs

(2)toRef


编码规范:采用ts+组合式API+setup语法糖

一.Vue3简介

1.性能提升

打包速度快、内存小、渲染快

2.源码升级

使用proxy代替defineProperty实现响应式

重写虚拟Dom实现和Tree-Shaking

3.拥抱ts

4.新特性

(1)Composition API(组合API):

setup
ref与reactive
computed与watch

(2)新的内置组件:

Fragment
Teleport
Suspense

(3)其他改变:

新的生命周期钩子

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

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

二.创建vue3工程

1.使用vue/cli创建(基于webpack)

首先查一下vue / cli的版本:

vue -V或者vue --version

在桌面上添加工程(cd desktop)

苹果电脑需要加上sudo : sudo vue create vue3_test

2.使用vite创建(推荐)

在前端中,webpack是构建工具里的老大哥

vite:新一代的前端构建工具,跟webpack等价,后端的maven跟npm差不多

优势:

开发环境中,无需打包操作,可快速的冷启动。

轻量快速的热重载(HMR)。

真正的按需编译,不再等待整个应用编译完成。

对ts、jsx、css开箱即用

上图是webpack,下面是vite

创建工程:sudo npm create vue@latest

暂时不需要vue router,之后学到了再去配置

运行速度是大大滴快啊,但是暂时不关注这个

3.分析工程结构

extensions.json显示安装的插件

src:源代码文件,前端的所有工作

gitignore:git 的忽略文件

env.d.ts:让程序能认识jpg、txt等文件格式,如果飘红那就是因为没有安装依赖

入口文件不再是main.js,是index.html

拿到手一个前端项目怎么去启动?

找到package.json的dev   :npm run dev

依赖管理包:

ts的配置文件:

vite.config.ts:整个工程的配置文件

可以安装插件和配置代理

4.编写App组件

我们在入口文件index.html里引入了main.ts,所以接下来就去写这个

//引入createApp用于创建应用
//createApp类似花盆
import {createApp} from 'vue'

//引入App根组件
//App类似花的根
import App from './App.vue'
//createApp(App)把花插在花盆里
createApp(App).mount('#app')
//mount('#app')把花摆在app这个容器里,这个app在index里

所以index.html里面必须得引入main.ts和写一个容器(app)

Vue3中是通过createApp函数创建一个应用实例。

5.OptionsAPI和CompositionAPI

vue2采用的是OptionsAPI,选项式的,name、data、methods等等的都是配置项

vue3采用的是CompositionAPI,组合式的

在vue2中,如果你想去改一个功能,你就得去各个配置项中都去修改很麻烦

vue3中,把这些分散的配置项合并为单独的函数,每个功能就是一个独立的函数

6.setup

setup是Vue3中一个新的配置项,值是一个函数。

data和methods、computed、、、、都不要了,直接都写在setup里

如果return返回的是对象的话,可以直接在template中使用

注意:setup前面不能加async,加上之后返回值就不是一个对象了,是被promise包裹的对象

<template>
  <div class="person">
    <h2>{{ sex }}</h2>
    <button @click="showTel">点击展示号码</button>
    <button @click="changeSex">点击改变性别</button>
  </div>
</template>

<script>
export default {
name:'person',
setup(){
    //以前是写在data中的,现在这里的数据都不是响应式数据
    let sex='男'
    let tel=183
    function showTel(){
        alert(tel)
    }
    function changeSex(){
        sex='女'
        console.log(sex)//女
        //这里性别确实被改变了,但是页面没有变化
    }
    return {
        sex,
        tel,
        showTel,
        changeSex
    }
}
}
</script>

下面不return,上面是不能用的

注意:(1)vue3中的this是不奏效的

(2)这里的let中写的数据不能实现响应式,函数更改性别之后页面没有变化但是sex已经更改

(3)setup的返回值也可以是一个渲染函数

返回的是函数,最终渲染到页面上,不管你写的什么函数和变量最终返回的都是‘哈哈’

(4)setup要发生在beforeCreated之前的

7.setup和OptionsAPI(面试题)

也就是说setup可不可以和传统的配置项同时写,同时写了要以谁为主?

<template>
  <div class="person">
    <h2>{{ sex }}</h2>
    <h2>{{ name }}</h2>
    <h2>{{ c }}</h2>
    <button @click="showTel">点击展示号码</button>
    <button @click="changeSex">点击改变性别</button>
  </div>
</template>

<script>
export default {
name:'person',
data(){
    return {
        sex:'nv',
        tel:183,
        c:this.name
    }
},
methods:{
showTel(){
alert(this.tel+'hhh')
}
},
setup(){
    //以前是写在data中的,现在这里的数据都不是响应式数据
    let sex='男'
    let tel=183
    let name='aa'
    function showTel(){
        alert(tel)
    }
    function changeSex(){
        sex='女'
        console.log(sex)//女
        //这里性别确实被改变了,但是页面没有变化
    }
    return {
```

(1)首先看data中this调用setup中的name,发现name和c都可以显示在页面上,说明data可以通过this调用setup中的数据,虽然vue3的this不奏效。(setup在beforeCreated之后,所以this 的时候可以取到setup中的了)

反过来的话,在setup中是不能调用到data中的数据的。

(2)然后我尝试用data、methods和setup中的数据与方法重命名,发现data中的不管放在setup前后都不奏效,但是函数是谁在后面谁奏效

8.setup语法糖

每次写setup()还要return把数据交出去很费事,一个简单方式:

在script标签里加上setup,这样它自动给你return数据了,直接在script里写setup函数的东西(不用return就行)

但是这么写有一个问题,没有export和name之后我想设置名字咋办呢,再写一个script专门为他写名字多麻烦,下载插件:pm i vite-plugin-vue-setup-extend -D

然后去vite.config.ts里引用

import VueSetupExtend from 'vite-plugin-vue-setup-extend'
,,,
plugins: [
    vue(),
    VueSetupExtend(),
  ],//在插件里追加一句调用

然后就可以直接在script标签里写name了,但是使用情况不多,一般就是文件名和组件名一致

三、vue3中的响应式

vue2中写在data中的数据就是响应式的,因为默认做了数据代理和数据劫持。

vue2中实现响应式都是通过Object.defineProperty去监听getter和setter有没有被调用,调用之后去返回数据或者把新数据更新到页面上,这样来实现读或修改,但是你要是去删除一个已经存在的属性或者添加一个没有的属性都不行,都捕获不到的。

就得用this.$set/Vue.set 添加 用 this.$delete/Vue.delete删除

数组的话还可以用this.splice来修改数据

vue2里面,只赋值数组下标不能实现响应式。

vue3中有两种方式定义响应式数据:ref、reactive

通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等。
通过Reflect(反射):对源对象的属性进行操作。

1.ref函数

作用:定义一个响应式的数据

首先引入:import {ref} from 'vue'

(1)简单数据类型:

只用普通的let name=‘’ 是不能进行后续修改的,ref可以实现响应式对象,加工完之后的name变成ref引用对象,就把它变成一个响应式的了

<template>
  <h1>hhh</h1>
  <h2>{{ name }}</h2>
  <h2>{{ age }}</h2>
  <button @click="changeData">点击改数据</button>
  <!-- test2() -->
</template>

<script>
import {ref} from 'vue'
export default {
  name: "App",
  setup() {
    let name = ref('tt');
    let age = ref(18);
    function changeData() {
      name.value='h',
      age.value=48
      console.log(name,age)
    }

带下划线的(_value,_rawValue)等等都不用你管,不带下划线的value是我们应该看的。

响应式依然是靠Object.defineProperty()的get与set完成的。(js里面)修改值的话就.value,但是在template用的时候却不用.value,因为它检测到你是ref引用对象,就自动读取value。

数据响应式:ref

修改数据/Js中用:.value

模版上呈现(template):直接写

(2)复杂数据类型:

let job=ref({
      salary:'30k',
      mingzi:'前端'
    })

复杂数据的value里有type(mingzi)和salary,但是它俩不是靠ref实现的,而是变成proxy的代理对象(内部求助reactive函数),所以修改值的时候不用写成job.value.salary.value

function jiaxin(){
      // job.salary.value='40k'
       job.value.salary='40k'
    }

为什么.value要写在中间而不是后面呢,准确来说.value应该紧跟let后面的名字,因为xx.value之后才能摸到这个对象/数组,如果遇到数组的话就是a.value[0].name。

2.reactive函数

作用:定义一个对象类型的响应式数据(基本类型不要用reactive,用ref)

语法:const代理对象=reactive源对象,返回一个代理对象(proxy实例对象,简称proxy对象)

首先引入:import {reactive} from 'vue'

处理对象数据类型:

let car=reactive({
      price:100,
      brand:'奔驰'
    })

调用的时候不用再value了,直接调用car输出的是proxy对象

function add() {
      console.log(car);
      car.price +=10;
    }

而且reactive可以深层次的处理数据。

处理数组数据类型:

let hobby=reactive(['抽烟','喝酒','打麻将'])

修改:

hobby[0]='学习'

vue2中修改马冬梅的时候,不能直接用索引号赋值修改,得用push啥啥的方法来实现响应式

3.reactive和ref的对比

(1)定义的角度

ref经常定义基本数据类型,reactive定义数组、对象数据类型

注:ref也可以定义数组、对象数据类型,内部通过reactive转为代理对象

(2)原理的角度

ref通过 object.defineProperty()的get与set来实现响应式(数据劫持)。

reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据。

(3)使用的角度

ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value

reactive定义的数据:操作数据与读取数据:均不需要.value

注:(1)ref里的value可以通过插件添加,就不用自己加了:

打开设置里的vue,勾上这个就自动添加

(2)如果想整体改变reactive写好的car对象时,用Object.assign

 function changeCar(){
        Object.assign(car,{brand:'qq',price:'1'})
    }

想整体改变ref定义的car对象的话

function changeCar(){
        // Object.assign(car,{brand:'qq',price:'1'})
        car.value={brand:'qq',price:1}
    }

4.toRefs和toRef

(1)toRefs

作用:把响应式对象里的数据拿出来并且这些数据仍然是响应式的

先来看下面的代码

<template>
  <div class="person">
   <h2>{{ person.name }}</h2>
   <h2>{{ person.age }}</h2>
   <h2>{{ name }}</h2>
   <h2>{{ age }}</h2>
   <button @click="changeName">修改名字</button>
   <button @click="changeAge">修改年龄</button>
  </div>
</template>


<script setup lang="ts">
import {reactive} from 'vue'
let person=reactive({
  name:'tt',
  age:18
})
let {name,age}=person
    function changeName(){
      name+='~'
      console.log(name,person.name)
    }
    function changeAge(){
      age++
      console.log(age,person.age)
    }
</script>

name和age+都是改的你解构出来的name和age,而不是person的,所以person 的数据都不变

后台数据变化但是页面上的数据都没变,因为解构出来的不是响应式的数据

let {name,age}=toRefs(person) 
    function changeName(){
      name.value+='~'
      console.log(name.value,person.name)
    }
    function changeAge(){
      age.value++
      console.log(age.value,person.age)
    }

加上toRefs之后就是从reactive定义的person对象里拿ref定义的所有属性(name和age),现在的name和age也是person 的name和age了,而且也实现了响应式

(2)toRef

toRef就是一个一个拆出来

let ll=toRef(person,'age')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉(4)】

基于Python的OpenCV基础入门——色彩空间转换 色彩空间简介HSV色彩空间GRAY色彩空间色彩空间转换 色彩空间转换代码实现: 色彩空间简介 色彩空间是人们为了表示不同频率的光线的色彩而建立的多种色彩模型。常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV、GRAY&#xff0c;其中最…

BLE蓝牙模块在车联网中的智能开锁、数据监控应用

随着科技的不断发展&#xff0c;车联网已经成为了汽车行业的一个热门话题。在这个领域中&#xff0c;BLE蓝牙模块发挥着重要的作用&#xff0c;特别是在智能开锁和数据监控方面的应用。本文将详细介绍BLE蓝牙模块在这两个方面的应用及其优势。   一、智能开锁   1.车辆远程…

从华为云OBS到AWS云上S3:迁移及相关事项

随着云计算的快速发展&#xff0c;企业越来越倾向于将数据存储和管理移到云端。华为云的对象存储服务&#xff08;OBS&#xff09;和亚马逊云服务&#xff08;AWS&#xff09;上的简单存储服务&#xff08;S3&#xff09;是两个备受欢迎的选择。对于那些考虑从华为云OBS迁移到A…

工商银行异地卡兑换泰铢的流程

本文介绍在国内的工商银行&#xff0c;通过现金或银行卡兑换泰国铢等外国货币的纸币或硬币的方法。 最近&#xff0c;准备到泰国旅行&#xff0c;所以需要兑换一些泰铢&#xff0c;防止下飞机到当地后找不到汇率合适、兑换方便的换钱的地方。其中&#xff0c;因为对比发现工商银…

SQL试题使得每个学生 按照姓名的字⺟顺序依次排列 在对应的⼤洲下⾯

学⽣地理信息报告 学校有来⾃亚洲、欧洲和美洲的学⽣。 表countries 数据如下&#xff1a; namecontinentJaneAmericaPascalEuropeXiAsiaJackAmerica 1、编写解决⽅案实现对⼤洲&#xff08;continent&#xff09;列的 透视表 操作&#xff0c;使得每个学生 按照姓名的字⺟顺…

Django5+React18前后端分离开发实战14 React-Router6 入门教程

使用nodejs18 首先&#xff0c;将nodejs切换到18版本&#xff1a; nvm use 18创建项目 npm create vitelatest zdpreact_basic_router_dev -- --template react cd zdpreact_basic_router_dev npm install react-router-dom localforage match-sorter sort-by npm run dev此…

Python-3.12.0文档解读-内置函数ord()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 概述 语法 参数 返回值 示例 注意事项 应用场景 记忆策略 常用场景…

JD3-40/23漏电继电器 AC220V 50-500mA 0.1s 导轨安装

系列型号&#xff1a; JD3-40/13漏电继电器JD3-40/23漏电继电器JD3-40/33漏电继电器JD3-40/43漏电继电器 JD3-70/13漏电继电器JD3-70/23漏电继电器JD3-70/33漏电继电器JD3-70/43漏电继电器 JD3-100/23漏电继电器JD3-100/43漏电继电器JD3-100/33漏电继电器JD3-100/13漏电继电…

ARM架构与分类

ARM架构&#xff0c;曾称进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff09;更早称作Acorn RISC Machine&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构。 主要是根据FPGA zynq-7000的芯片编写的知识思维导图总结&#xff0c;没有会…

【NumPy】全面解析NumPy随机数生成器:使用numpy.random的实用技巧

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【软件设计师】算法

1、算法的效率 时间复杂度:程序从开始到结束所需要的时间 空间复杂度&#xff1a;算法在运行过程中临时占用存储空间大小的度量 时间渐近复杂度&#xff1a;时间复杂度由最高次幂决定(判断大小技巧&#xff1a;将n10代入&#xff09; O(log2 n):二分查找法 O(n&#xff09;:for…

720VR三维立体小程序源码系统 手机电脑端自适应 前后端分离 带完整的安装代码包以及搭建教程

系统概述 720VR 三维立体小程序源码系统是基于先进的技术和理念打造而成的综合性平台。它融合了虚拟现实技术、移动互联网技术以及计算机编程技术&#xff0c;旨在为用户提供沉浸式的 720 度全景体验。 该系统的设计充分考虑了用户的需求&#xff0c;无论是在手机端还是电脑端…

从零学爬虫:使用比如说说解析网页结构

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例&#xff1a;查看网页结构 三、使用比如说说解析网页 1.…

抖音小程序如何生成二维码

1.页面结构 <image src{{imgUrl}}></image>2.代码结构 onLoad(options) {if (options.param) {var qrCode 13246897451257 //传入生成二维码的字符串this.generateQRCode(qrCode);}},//调起第三方库qrCodegenerateQRCode(text) {//调用了qrCode里面的apiconst api…

uniapp App去除iOS底部安全区域白边

未设置的情况下&#xff0c;iOS底部安全区域白边 如图&#xff1a; 去除方法&#xff1a; 在 mainfest.json 中加入一下代码&#xff1a; "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示&#xff1a;

HTTP请求拦截器链

文章目录 HTTP请求拦截器链需求定义写一个Controller方法接口写三个http请求拦截器把拦截器加入到配置中&#xff0c;并且配置拦截规则在postman里面发送请求&#xff0c;看下测试结果是否正确 HTTP请求拦截器链 需求定义 我们写一个包含三个HTTP请求拦截器的拦截器链&#x…

盲人无障碍设施建设:科技之光照亮前行之路

在这个快速发展的时代&#xff0c;科技的每一次进步都在悄然改变着我们的生活&#xff0c;尤其在提升特殊群体生活质量方面&#xff0c;展现出前所未有的力量。今天&#xff0c;让我们聚焦于盲人无障碍设施建设这一重要话题&#xff0c;通过一款名为“蝙蝠避障”的辅助软件&…

饲料粉碎混合机组:打造精细化养殖

饲料粉碎混合机组是畜牧业和养殖业中不可或缺的设备。它集饲料粉碎和混合于一体&#xff0c;可以高效地处理各种饲料原料&#xff0c;提高饲料的均匀度和营养价值。 具体来说&#xff0c;饲料粉碎混合机组的主要功能包括将饲料原料进行粉碎&#xff0c;增加其表面积和调质粒度…

小程序唯品会Authorization sign

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

13.Redis之数据库管理redis客户端JAVA客户端

1.数据库管理 mysql 中有一个重要的概念,database 1个 mysql 服务器上可以有很多个 database1个 database 上可以有很多个 表mysql 上可以随心所欲的 创建/删除 数据库~~ Redis 提供了⼏个⾯向 Redis 数据库的操作&#xff0c;分别是 dbsize、select、flushdb、flushall 命令…