vue2.0/vue3.0学习笔记——2022.08.16

news2024/9/27 21:21:17

vue2(查漏补缺)

一、vue基础

内置指令(查漏补缺)

1、v-text 更新元素的textContent
2、v-html 更新元素的innerHtml
3、v-cloak 防止闪现,与css配合: [v-cloak] {dispaly: none}
4、v-once 在初次动态渲染厚,就视为静态内容了;后面数据的改变不会引起v-once所在结构的更新,可以用于优化性能
5、v-pre 跳过其所在节点的编译过程;可利用它跳过:没有指令语法、没有使用插件语法的节点,加快编译
6、还可自定义指令

生命周期

1、初始化显示

  • beforeCreate()
  • created()
  • beforeMount()
  • mounted()

2、更新状态: this.xxx = value

  • beforeUpdate()
  • updated()

3、销毁 vue 实例: vm.$destory()

  • beforeDestory()
  • destoryed()

二、vue-cli vue脚手架

说明

Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台)

三、vue-router

说明

vue 的一个插件库,专门用来实现 SPA 应用

SPA 应用的理解

  1. 单页 Web 应用(single page web application,SPA)。
  2. 整个应用只有一个完整的页面。
  3. 点击页面中的导航链接不会刷新页面,只会做页面的局部更新。
  4. 数据需要通过 ajax 请求获取。

相关 API

  1. this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
  2. this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
  3. this.$router.back(): 请求(返回)上一个记录路由
  4. this.$router.go(-1): 请求(返回)上一个记录路由
  5. this.$router.go(1): 请求下一个记录路由

四、vuex

概念

专门在 Vue 中实现集中式状态(数据)管理的一个Vue 插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。

什么时候使用 Vuex

  1. 多个组件依赖于同一状态
  2. 来自不同组件的行为需要变更同一状态

vuex 核心概念和 API

1、state vuex

管理的状态对象;是唯一的

2、actions

值为一个对象,包含多个响应用户动作的回调函数;通过 commit()来触发 mutation 中函数的调用, 间接更新state;在组件中使用: $store.dispatch('对应的 action 回调名') 触发 actions 中的回调;可以包含异步代码(定时器, ajax 等等)

3、mutations

值是一个对象,包含多个直接更新 state 的方法;在 action 中使用:commit('对应的 mutations 方法名') 触发;不能写异步代码、只能单纯的操作stat

4、getters

值为一个对象,包含多个用于返回数据的函数;. 如何使用?—— $store.getters.xxx

5、modules

包含多个 module;一个 module 是一个 store 的配置对象;与一个组件(包含有共享数据)对应

五、Vue UI 组件库

移动端常用 UI 组件库

  1. Vant https://youzan.github.io/vant
  2. Cube UI https://didi.github.io/cube-ui
  3. Mint UI http://mint-ui.github.io

PC 端常用 UI 组件库

  1. Element UI https://element.eleme.cn
  2. IView UI https://www.iviewui.com

六、vue3

常用的Composition API

1、setup

1、理解:Vue3中的一个新的配置项,值为一个函数。
2、setup是所有Composition API(组合api)“表演的舞台”。
3、组件中所用到的数据、方法等等,均要配置在setup中。
4、setup函数的两种返回值:
①若返回一个对象,则对象中的属性、方法、在模板中均可以直接使用。重要!!!
②若返回一个渲染函数:则可以自定义渲染内容。了解即可
5、注意点:
①尽量不要与vue2配置混用

  • vue2的配置(data、methods、computed…)中可以访问到setup中的属性和方法。
  • 但在setup中不能访问到vue2的配置(data、methods、computed…)。
  • 如果有重名,vue3优先。

②setup不能是一个async函数,因为返回值不再是一个return对象,而是promise,模版看不到return对象中的属性。

2、ref函数

①作用:定义一个响应式的数据
②语法: const xxx= ref(initVlaue)

  • 创建一个包含响应式数据的引用对象(reference对象)
  • JS中操作数据:xxx.value
  • 模板中读取数据:不需要.value,直接
    {{xxx}}

③备注:

  • 接收的数据可以是:基本类型、也可以是对象类型。
  • 基本类型的数据:响应式依旧是靠object.defineProperty()的get和set完成的。
  • 对象类型的数据:内部“求助”了vue3中的一个新函数——reactive函数
3、reactive函数

①作用:定义一个对象类型的响应式数据(基本类型别用,用ref函数)
②语法:const 代理对象 = reactive(被代理对象)接收一个对象(或者数组),返回一个代理对象(proxy对象)
③reactive定义的响应式数据是“深层次的”
④内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作

4、vue3中的响应式原理

①vue2的响应式
实现原理:

  • 对象类型:通过Object.defineProxy()对属性的读取、修改进行拦截(数据劫持)
  • 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)

存在问题:

  • 新增属性、删除属性,界面不会更新。
  • 直接通过下标修改数组,界面不会自动更新。

②vue3的响应式
实现原理:

  • 通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等(增删改查)。
  • 通过Reflect(反射):对被代理对象(源对象)的属性进行操作。
new Proxy(data, {
	//拦截读取属性值
	get(target, prop){
		return Reflect.get(target, porp);
	},
	//拦截设置属性值或者添加属性值
	set(target, prop, value){
		return Reflect.set(target, prop, value);
	},
	//拦截删除属性
	deletePorperty(target, prop){
		return Reflect.deleteProperty(target, prop);
	}
});

proxy.name = 'tom';
5、reactive对比ref

①从定义数据的角度对比:

  • ref用来定义:基本数据类型
  • reactive用来定义:对象或数组类型数据
  • 备注:ref也可以用来定义对象或者数组类型数据,它内部会自动通过reactive转为代理对象

②从原理角度对比:

  • ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)
  • reactive通过使用Proxy来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据

③从使用角度对比:

  • ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value
  • reactive定义的数据:操作数据与读取数据,均不需要.value
6、setup的两个注意点

①setup执行的时机

  • 在beforeCreate之前执行一次,this是undefined
    ②setup的参数
  • props:值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性
  • context:上下文对象
    attrs:值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性,相对于this.$attrs
    slots:收到的插槽内容,相对于this.$slots
    emit:分发自定义事件的函数,相对于this.$emit
7、计算属性与监视

①computed函数

  • 与vue2中computed配置功能一致
  • 写法
import { computed } form 'vue'
setup(){
	//计算属性-简写(没有考虑计算属性被修改的情况)
	let fullName = computed(() => {
		return person.firstName + person.lastName;
	})
	//计算属性-完整(考虑读和写)
	let fullName = computed({
		get(){
			return person.firstName + person.lastName;
		},
		set(value){
			const nameArr = value.split('-');
			person.firstName = nameArr[0];
			person.lastName = nameArr[1];
		}
	})
}

②watch函数

  • 与vue2中computed配置功能一致
  • 两个小“坑”
    监视reactive定义的响应式数据时:oldValue无法正确获取、强制开启了深度监视(deep配置失效)
    监视reactive定义的响应式数据中某个属性时:deep配置有效
 setup(){
        let sum = ref(0);
        let msg = ref('你好');
        let person = reactive({
            name: '张三',
            age: 18,
            job: {
                job1: {
                    salary: 20,
                }
            }
        });
        // 情况一:监视ref定义的一个响应式数据
        watch(sum, (newValue, oldValue) => {
            console.log("sum值改变了", newValue, oldValue); 
        });
        watch(msg, (newValue, oldValue) => {
            console.log("msg值改变了", newValue, oldValue); 
        });
        // 情况二:监视ref定义的多个响应式数据
        watch([sum, msg], (newValue, oldValue) => {
            console.log("sum或msg值改变了", newValue, oldValue); 
        },{ immediate: true,});
        // 情况三:监视reactive定义的一个响应式数据的全部属性
        // 1.此处无法获取正确的oldValue
        // 2.强制开启深度监视 deep配置无效
        watch(person, (newValue, oldValue) => {
            console.log("person改变了", newValue, oldValue); 
        }, { deep: true }); //此处deep配置不生效
        // 情况四:监视reactive定义的一个响应式数据的某一个属性
        watch(() => person.age, (newValue, oldValue) => {
            console.log("person的age改变了", newValue, oldValue); 
        })
        // 情况五:监视reactive定义的一个响应式数据的某些属性
        watch([() => person.age, () => person.name], (newValue, oldValue) => {
            console.log("person的age或name改变了", newValue, oldValue); 
        })
        // 特殊情况 deep配置可用
        watch(() => person.job, (newValue, oldValue) => {
            console.log("person的job改变了", newValue, oldValue); 
        }, { deep: true })
        return {
            sum,
            msg,
            person
        }
    }
}

②watchEffect函数

  • watch的套路是:既要指明监视的属性,也要指明监视的回调
  • watchEffect的套路是:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性
  • watchEffect有点像computed
    但是computed注重的是计算出来的值(回调函数的返回值),所以必须要写返回值
    而watchEffect更注重的是国产(回调函数的函数体),所以不用写返回值
// 监视 watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调
watchEffect(() => {
    const x1 = sum.value;
    const x2 = person.job.job1.salary;
    console.log('watchEffect所指定的回调执行了');
});
8、生命周期

在这里插入图片描述

  • vue3中可以继续使用vue2的生命周期钩子,有两个被更名
    beforeDestory改名为beforeUnmount
    destoryed改名为unmounted
  • vue3也提供了Composition API形式的生命周期钩子,与vue2中钩子的对应关系如下:
    beforeCreate ===> setup()
    created =======> setup()
    beforeMount ====> onBeforeMount
    mounted =======> onMounted
    beforeUpdate ===> onBeforeUpdate
    updated =======> onUpdated
    beforeUnmount ==> onBeforeUnmount
    unmounted =====> onUnmounted
9、自定义hook函数
  • 什么是hook?——本质是一个函数,把setup函数中使用的Composition API进行封装
  • 类似于vue2中的mixin
  • 自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂
10、toRef
  • 作用:创建一个ref对象,其value值指向另一个对象中的某个属性值
  • 语法:const name = toRef(person, 'name')
  • 应用:要将响应式对象中的某个属性单独提供给外部使用时
  • 扩展:toRefstoRef功能一致,但可以批量创建多个ref对象,语法toRefs(person)

其他的Composition API

1、shallowReactive与shallowRef
  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理
  • 什么时候使用
    ①如果有一个对象数据,结构比较深,但变化时只是外层属性变化——shallowReactive
    ②如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换——shallowRef
2、readonly与shallowReadonly
  • readonly:让一个响应式数据变为只读的(深只读)
  • shallowReadonly:让一个响应式数据变为只读的(浅只读)
  • 应用场景:不希望数据被修改时
3、toRaw与markRaw
  • toRaw:
    ①作用:将一个由reactive生成的响应式对象转为普通对象
    ②使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面的更新
  • markRaw:
    ①作用:标记一个对象,使其永远不会再成为响应式对象
    ②应用场景:
    有些值不应被设置为响应式的,例如复杂的第三方类库等
    当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能
4、customRef
  • 作用:创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制
  • 实现防抖效果

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

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

相关文章

1N4007S 整流二极管 1A 1000V A-405

前两天二极管生产厂家东沃电子科普过1N4007和1N4007G这两种普通塑封整流二极管,查看“STD-1N4001 Thru 1N4007 (DO-41) Datasheet”和“STD-1N4001G Thru 1N4007G (DO-41) Datasheet”产品手册可知,1N4007和1N4007G参数除了结电容和芯片尺寸不一样以外&a…

每日一练 | mongo集群如何创建分片键

文章目录 MongoDB是什么什么是分片键环境如何设置分片键 MongoDB是什么 MongoDB 是一个基于分布式文件存储的数据库 什么是分片键 分片:每个分片包含分片数据的一部分。每个分片可以部署为副本集。 而分片键的作用就是把数据按一定的条件分布到各个分片中&#…

Linux 修改信号的响应方式

修改信号的响应方式 1.signal()方法介绍: 修改信号的响应方式要用到方法signal()。需要引用头文件signal.h。signal()的原型: typedef重命名了一个函数指针的类型,这个指针的类型为指向一个参数为int返回值为void的函数的指针。这个函数指针…

学生学徒班适学人员介绍

什么是学生学徒制呢? 产业技能生态链企业与院校毕业年度学生,按照学生就业意愿,建立就业导向的学生学徒制关系,签订学徒培养协议,确定学生的就业岗位和培养计划(含岗位实习)。 泰迪-学生学…

Python中随机数的使用详解

目录标题 嗨喽~大家好呀,这里是魔王呐 ❤ ~!随机数功能1. choice(seq)2. randint(start, end)3. random()4. uniform(a, b)5. randrange(start, end, step)6. sample(seq, number)7. shuffle(lt)尾语 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python资料、源码…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax(繁琐,过时了&#xff09…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告:不赞成…

第十二课:QSsh 库编译及客户端开发

功能描述:QSsh 库编译以及如何运用 QSsh 做应用开发 一、最终演示效果 本次制作的 Demo 是通过输入主机的 IP 、端口号、用户名和密码,能够实现 SSH 自动连接,从而对远程设备进行操作。 主机(H):输入远程设备的 IP 端口(P)&…

分享twinmotion获得逼真效果的渲染技巧

正如所引用的那样,“渲染与软件无关。它关乎艺术家的眼睛、看到脑海中最终图像的能力,以及将这一愿景变为现实的技能。一些流行的渲染软件包括 V-Ray、Arnold、Unreal Engine、Blender 和 Octane Render。 其中之一是 TwinMotion,这是一款功…

自然语言处理技术:NLP句法解析树与可视化方法

自然语言处理(Natural Language Processing,NLP)句法解析树是一种表示自然语言句子结构的图形化方式。它帮助将句子中的每个词汇和短语按照语法规则连接起来,形成一个树状结构,以便更好地理解句子的语法结构和含义。句法解析树对于理解句子的句法关系、依存关系以及语义角…

自动驾驶卡车量产-第一章-用户需求

1、中国干线物流行业现状 万亿级市场,规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%,全国中重卡保有量约730 万台1,市场规模达4.6 万亿元1,体量全球第一,超过同城物流及乘用出租市场规模之和。同样&…

机器学习与模式识别3(线性回归与逻辑回归)

一、线性回归与逻辑回归简介 线性回归主要功能是拟合数据,常用平方误差函数。 逻辑回归主要功能是区分数据,找到决策边界,常用交叉熵。 二、线性回归与逻辑回归的实现 1.线性回归 利用回归方程对一个或多个特征值和目标值之间的关系进行建模…

【Unity每日一记】资源加载相关你掌握多少?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

pandas数据分析38——数据框表格拓展以及缩回对齐

案例背景 需求是这个样的: 把这个表格进行拓展。 代码实现: df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小红, 小马,小天]])) df 方法一:自定义函数: def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

AutoSAR配置与实践(基础篇)2.4 RTE对Ports的支持 – C/S介绍

AutoSAR配置与实践(基础篇)2.4 RTE对Ports的支持 – C/S介绍 传送门 点击返回 ->AUTOSAR配置与实践总目录 <C/S篇前言> C/S接口算是内容稍多的章节,特别是异步C/S。因此打算分为两篇文章介绍。第一篇基础,第二篇深入。所介绍的内容,是结合Autosar标准文档作为基…

自动驾驶,一次道阻且长的远征|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在6月的世界人工智能大会上&#xff0c;马斯克在致辞中宣称&#xff0c;到2023年底&#xff0c;特斯拉便可实现L4级或L5级的完全自动驾驶&#xff08;FSD&#xff09;。两个月之后&#xff0c;马斯克又在X社交平台上发言&am…

Qt应用开发(基础篇)——选项卡窗口 QTabWidget

一、前言 QTabWidget类继承于QWidget&#xff0c;是一个拥有选项卡的窗口部件。 QTabWidget类有一个选项卡栏QTabBar和一个页面区域&#xff0c;用来显示和选项卡相关联的界面。用户通过点击选项卡或者自定义快捷方式(ALTKey)切换页面。 二、QTabWidget类 1、count 该属…

DockerFile的入门与使用

什么是 DockerFile&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 参考Tomcat的dockerFile文件 DockerFile指令 FROM 指定父镜像: 基于哪个镜像image构建 指定基础镜像&#xff0c;必须为第一个命令MAIN…

【深入理解C语言】-- 关键字2

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、关键字 - static&…

规则的加载与管理者——KieContainer的获取与其类型的区别(虽然标题是KieContainer,其实说的还是KieServices)

之前梳理了一下有关KieServices的获取&#xff0c;与获取中的代码走向&#xff0c;详情请见&#xff1a; “万恶”之源的KieServices&#xff0c;获取代码就一行&#xff0c;表面代码越少里面东西就越多&#xff0c;本以为就是个简单的工厂方法&#xff0c;没想到里面弯弯绕绕…