• 浅析Vue3基础知识(vue3笔记之入门篇)


    本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠))

    喜欢的话点个赞,谢谢!

    时下Vue框架都是使用Vue3版本来开发项目了,为了加深对Vue3基本知识的了解,特写了这个笔记

    1. 生命周期

    1.1. vue3生命周期

    一个组件从开始到结束,正常的生命周期流程应该是这样:

    1. //1.开始创建组件,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
    2. setup()
    3. //2.在组件挂载之前执行
    4. onBeforeMount()
    5. //3.在组件挂载之后执行
    6. onMount()
    7. //4.在组件更新之前执行
    8. onBeforeUpdate()
    9. //5.在组件更新之后执行
    10. onUpdated()
    11. //6.在组件卸载之前执行
    12. onBeforeUnmount()
    13. //7.在组件卸载之后执行
    14. onUnmounted()

    还有三个函数是特殊情况执行的:

    onErrorCaptured

    当捕获一个来自一个来自子孙组件的异常时触发的钩子函数

    : 被包含在中的组件,会多出2个生命周期钩子函数:

    onActivated

    每次进入该组件页面都会触发

    onDeactivated

    比如从A组件切换到B组件,A组件消失时执行(等于是离开组件时触发)

    1.2. vue2生命周期

    vue2生命周期对比vue3生命周期,主要是beforeCreate和created被setup取代,还有一些方法名的变化:

    1. //1.开始创建组件,在 beforeCreate 和 created 之前执行,创建的是 data 和 method
    2. beforeCreate + created = setup()
    3. //2.在组件挂载之前执行
    4. beforeMount() => onBeforeMount()
    5. //3.在组件挂载之后执行
    6. mounted() => onMount()
    7. //4.在组件更新之前执行
    8. beforUpdated() => onBeforeUpdate()
    9. //5.在组件更新之后执行
    10. Updated() => onUpdated()
    11. //6.在组件卸载之前执行
    12. beforeDestory() => onBeforeUnmount()
    13. //7.在组件卸载之后执行
    14. destoryed() => onUnmounted()
    15. //
    16. activated() => onActivated()
    17. deactivated() => onDeactivated()
    18. //当捕获一个来自一个来自子孙组件的异常时触发的钩子函数
    19. errorCaptured() => onErrorCaptured()

    2. 选项式api和组合式api

    在做React开发的时候经常听到朋友抱怨vue2历史项目难以维护,代码分层逻辑乱的一团糟,本人也有幸维护过几个vue2项目,深有感触

    2.1. 选项式api的痛点:

    一个整体的逻辑会被拆分到data、method、watch里面去,如果开发者经验不足或者不编写注释,代码维护程度简直令人抓狂(^_^)

    2.2. 组合式api

    组合式api的特点就是可以将单个功能的状态、方法、计算属性都融合在一起组成一个hook(抽离逻辑自定义hook),然后再将这个hook引入到组合api里面,这样做的好处是便于阅读和代码维护,如下图所示:

    这图是社区复制而来(^_^)

    2.2.1. setup

    Vue3新的一个配置项,所有的组合式函数都在此使用,只在初始化的时候执行一次。setup可以在选项式api里面使用,也可以在组合式api里面使用,不过官方更推荐在组合api风格里面使用,如下图所示:

    选项式api风格:

    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>
    8. style>

    组合式api风格:

    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>style>

    区别:

    此处官网介绍的比较详细,可以跳转查阅Vue3.js组合式api

    • 可以直接使用顶层变量和函数,选项式代码则还需要导出才能使用
    • 对ts支持更好
    • 打包出来的体积更小
    • 肉眼可见的代码直观性和简洁

    3. 响应式

    Vue2与Vue3响应式的区别在于,vue2的响应式是基于Object.definePropert做数据劫持,而Vue3是基于Es6的Proxy来进行数据劫持

    3.1.1. ref

    ref接收一个值,返回一个响应式对象,可以处理简单的数据类型,底层还是基于Object.definePropert做数据劫持,如果在处理对象类型的时候会求助reactive。如下图所示:

    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>style>
    3.1.2. reactive

    reactive是用来做深层响应式代理的,如果传入的是基本数据类型如数字、字符串等它将不是响应式对象,reactive返回一个Proxy对象,Proxy对象是专门用来处理代理的,内部可以实现数据的增删改查操作,所以reactive可以实现基本的拦截和自定义。如下图所示:

    1. <template>
    2. <div>{{ count.arr }}div>
    3. <button @click="add(1)">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>style>
    3.1.3. shallowReactive 与 shallowRef

    shallowRef传入对象不会求助reactive,只会对value值响应,shallowReactive只处理第一层的对象响应,更深层次不会进行响应。这两个api所用甚少,这里就不过多介绍了
     

    4. 计算属性和监听

    4.1. computed函数

    computed函数是用来做计算的,通过监听某一个值得到一个新的值,有两种写法

    1. 只读写法: computed(()=>a + b)
    2. 可读可改写法:computed({get:()=>a + b,set:(val)=> {xxxxx}})
    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +1
    5. button>
    6. <button @click="setCount2++">
    7. +3
    8. button>
    9. template>
    10. <style lang='less' scoped>style>

    4.2. watch函数

    watch函数是用来监听一个响应式对象,或者多个(多个时第一个参数为数数组),当监听对象发生变化时返回一个回调函数

    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>style>
    4.3. watchEffect

    watchEffect函数用于监听传入的函数内部所有的响应式对象的变化,就是回调里面用了哪个对象就监听哪个对象

    1. <template>
    2. <div>{{ count }}div>
    3. <button @click="count++">
    4. +
    5. button>
    6. template>
    7. <style lang='less' scoped>style>

    5. 组件通信

    vue的组件通信与React不太一样,React因为JSX语法的原因不需要特殊处理,vue的话因为采用的模板语法,所以需要使用一些方法来处理

    5.1. 父子通信

    在vue3里面传递数据的时候,可以使用definePorps来接收父组件传入的props参数:

    在父组件使用子组件时,使用props对其传入数据:

      <Child :count="count" />

    子组件接收:

    1. <template>
    2. <div>{{ props.count }}div>
    3. template>

    注意点:props为只读属性,不可更改,如果需要更改传入的数据,可以在当前组件重新定义一个ref对象

    5.2. 子父通信

    子组件向父组件发送消息会稍微麻烦一点,毕竟框架数据流通都是基于单向数据流的理念的,所以需要采用额外的方法来处理

    5.2.1. 添加回调函数

    通过向子组件发送一个回调函数的方式,直接在子组件调用

    1. <template>
    2. <div />
    3. 父组件显示:{{ count }}
    4. <Child
    5. :count="count"
    6. :add="add"
    7. />
    8. template>
    9. <style lang='less' scoped>style>

    子组件:

    1. <template>
    2. <button :onclick="props.add">
    3. +
    4. button>
    5. template>
    6. <style lang='less' scoped>
    7. style>
    5.2.2. provide与inject

    可以实现隔代组件通信

    父组件:

    1. <template>
    2. <div />
    3. 父组件显示:{{ count }}
    4. <Child
    5. :count="count"
    6. />
    7. template>
    8. <style lang='less' scoped>style>

    子组件:

    1. <template>
    2. <button :onclick="add">
    3. +
    4. button>
    5. template>
    6. <style lang='less' scoped>
    7. style>
    5.2.3. 使用pinia通信

    安装

    yarn add pinia

    创建store

    1. import { createPinia } from 'pinia'
    2. // 创建store
    3. const store = createPinia()
    4. // 对外暴露,安装仓库
    5. export default store

    注册

    1. ...
    2. import pinia from './store/pinia'
    3. ...
    4. app.use(router)
    5. .use(Antd)
    6. .use(store)
    7. + .use(pinia)
    8. .mount('#app')

    添加models

    1. import { defineStore } from 'pinia'
    2. const Store = defineStore('test', {
    3. state: () => {
    4. return {
    5. count: 0
    6. }
    7. },
    8. actions: {
    9. add (count:number) {
    10. this.count = this.count + count
    11. }
    12. },
    13. getters: {
    14. }
    15. })
    16. export default Store

    页面显示

    1. <template>
    2. 父组件显示:{{ store.count }}
    3. <button :onclick="add">
    4. +
    5. button>
    6. 子组件显示:
    7. <Child />
    8. template>
    9. <style lang='less' scoped>style>

    子组件:

    1. <template>
    2. {{ store.count }}
    3. template>
    4. <style lang='less' scoped>
    5. style>
  • 相关阅读:
    终极篇章_springMVC_文件上传和下载
    Ultra-Fast-Lane-Detection 车道线学习资料整理
    Python邮件发送程序代码
    汽车驾驶自动化分级L1~L5
    驱动开发 platfrom总线驱动的三种方式
    Kafka 数据重复怎么办?(案例)
    ESP32 ① 编译环境
    数据结构(一)C语言版:绪论——数据结构基本概念真题
    酷克数据与华为合作更进一步 携手推出云数仓联合解决方案
    【Reinforcement Learning】策略学习
  • 原文地址:https://blog.csdn.net/qq_32453495/article/details/139455280