Vue3_vite

2023-09-19 01:08:47

目录

使用Vue-cli创建

使用vite创建

Composition API 组合API

setup

执行时机

setup的参数

ref函数

reactive函数

Vue3.0中的响应式原理

Vue2的响应式

实现原理 

Vue3的响应式

 实现原理

通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。

通过Reflect(反射):对被代理对象的属性进行操作。

计算属性与监视

computed函数


使用Vue-cli创建

使用vite创建

Composition API 组合API

setup

1.Vue3中的一个新的配置项,值为一个函数

2.可以将组件中所用到的数据,方法等配置在setup中.

3.setup函数的两种返回值

        3.1若返回一个对象,则对象中的属性,方法,在模板中均可以直接使用.

        3.2若返回一个渲染函数,则可以自定义渲染内容.

注意:Vue2.0配置(data,methos,computed,...)中可以访问到setup中的属性,方法.但在setup中不能访问(data,methos,computed,...).如果有重名,setup优先

执行时机

在beforeCreate生命周期前执行一次,this是undefined

setup的参数

  • props:值为对象,包含父组件传递过来,且组件内部生命接收了的属性。
    • export default {
      
          props:['name','id'],
          emits:['事件名称'],
          setup(props,context){
              // props:{name:'',id:''}
              console.log(props)
          }
      }
  • context:上下文对象
    • attrs:值为对象,包含父组件传递过来但没有在props配置中声明的属性,相当于Vue2的this.$attrs.
    • slots:收到的插槽内容,相当于Vue2的this.$slots.Vue3中的具名插槽要用v-slot:name
    • emit:分发自定义事件的函数,相当于Vue2的this.$emit.(需要再emits配置中声明)

ref函数

定义一个响应式数据

const xxx = ref(initValue)

创建一个包含响应式数据的引用对象(RefImpl)

JS中操作数据:xxx.value

模板中读取数据不需要.value

备注:

  1. 接收的数据可以是:基本数据类型,也可以是对象类型
  2. 基本数据类型:响应式依然是用Object.defineProperty()的get与set完成的.

reactive函数

  1. 定义一个对象类型的响应式数据
  2. const 对象 = reactive(对象),接收一个对象或数组,返回一个代理对象(Proxy对象)
  3. reactive定义的响应式数据是"深层次的"
  4. 基于ES6的Proxy实现,通过代理对象操作源对象内部数据都是响应式的.

reactive对比ref

从定义数据角度对比:

  • ref定义基本数据类型
  • reactive定义引用数据类型
  • ref也可以定义引用数据类型,但是内部还是通过reactive转为代理对象

从原理角度对比:

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

从使用角度对比:

  • ref定义的数据:操作数据时需要.value,在模板中不需要
  • reactive定义的数据:操作数据与读取数据均不需要.value

Vue3.0中的响应式原理

Vue2的响应式

  • 实现原理 

         对象类型:通过Object.defineProperty()对属性的读取,修改进行拦截(数据劫持).

        数组类型:通过重写更新数组的一系列方法来实现拦截.(对数组的变更方法进行了包裹).

  • 存在问题

        新增属性,删除属性,界面不会更新.(可以使用this.$set()和this.$delete())

        直接通过下标修改数组元素,界面不会更新.(通过splice修改数组元素) 

Vue3的响应式

  •  实现原理

  • 通过Proxy(代理):拦截对象中任意属性的变化,包括属性值的读写,属性的添加,属性的删除。

  • 通过Reflect(反射):对被代理对象的属性进行操作。

new Proxy(data,{
    // 拦截读取属性值
    get(target,propertyName){
        // target 源对象
        // propertyName 属性名
        return Reflect.get(target[propertyName])
    },
    set(target,propertyName,value){
        // value 修改的值
        return Reflect.set(target,propertyName,value)
    },
    deleteProperty(target,propertyName){
        return Reflect.deleteProperty(target[propertyName])
    }
})

计算属性与监视

computed函数

watch函数 

 

watchEffect函数

toRef和toRefs

  • 作用:创建一个ref对象,其value值指向另一个对象中的某个属性

  • 语法:const value = toRef(person,'属性名')

  • 应用:将响应式对象中的某个属性单独提供给外部使用时

  • 扩展: toRefs与toRef功能一致,但是可以批量创建多个ref对象。(toRefs(person)返回一个对象,对象中的所有属性都是一个RefImpl对象,其value值都指向person对象中对应的属性值)

其它Compositon Api 

shallowReactive与shallowRef

  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)。在一个对象数据,结构比较深,但变化时只是外层属性变化时使用。
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。在一个对象数据,后续功能不会修改对象的属性,而是生成新的对象来替换时使用。
    • 传入基本数据类型,跟ref功能一致。
    • 传入对象,返回的RefImpl对象的value值是一个普通的Object对象,没有响应式。

readonly与shallowReadonly 

  • readonly:让一个响应式数据变为只读的(深只读)。
  • shallowReadonly:让一个响应式数据变为只读的(浅只读)

不希望数据被修改时使用 

toRaw与markRaw

  • toRaw:将一个由reactive生成的响应式对象转换为普通对象。
    • 用于读取响应式对象对应的普通对象,对这个普通对象的所有操作不会引起页面更新。
  • markRaw:标记一个对象,使其永远不会再成为响应式对象。
    • 有些值不应该被设置为响应式的,例如复杂的第三方类库等。
    • 当渲染具有不可变数据源的列表时,跳过响应式转换可以提高性能。

customRef

  • 创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制.
setup(){
    //自定义一个myRef
    function myRef(value,delay){
        return customRef((track,trigger)=>{
            let timer
            return {
                get(){
                    track() // 通知Vue追踪value的变化,
                    return value
                },
                set(newValue){
                    clearTimeout(timer)
                    timer = setTimeout(()=>{
                        value = newValue
                        trigger() // 通知Vue重新解析模板
                    },delay)
                    
                }
            }
        })
    }
    return {
        value:myRef('初始值',500)
    }
}

provide与inject 

  • 实现祖孙组件间的通信
// 祖组件中使用provide提供数据
setup(){
    let car = reactive({name:'name',price:'price'})
    provide('car',car)
}
// 孙组件中使用inject接收数据
setup(){
    const car = inject('car')
    return {car}
}

Teleport组件

Suspense组件

Vue3的其他改变 

 

 

更多推荐

Socks5代理、IP代理与网络安全:保护你的爬虫和隐私

在数字时代,数据是黄金,网络安全成为至关重要的问题。无论是保护个人隐私还是进行爬虫数据采集,代理技术已经成为网络工程师的必备工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和爬虫应用中的重要性。1.了解Socks5代理Socks5代理是一种网络协议,允许应用程序通过中间服务器与目标服务器通信。与HTTP

分布式系统的 38 个知识点

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢?1.架构设计这一节将从一些经典的开源系统架构设计出发,来看一下,如何设计一个高质量的分布式系统;而一般的设计出发点,无外乎冗余:简单理解为找个备胎,现任挂掉之后,备胎顶

提高邮件营销效率,个性化推广利器——SerialMailer for Mac

在如今竞争激烈的市场中,个性化的营销和沟通对于吸引客户和保持关系至关重要。而SerialMailerforMac作为一款专业的邮件批量个性处理软件,能够帮助您轻松实现这一目标。SerialMailerforMac拥有强大且直观的界面,适用于任何规模的电子邮件营销活动。您可以轻松导入收件人列表,并根据收件人的个人信息、偏

【Linux】详解线程第一篇——由单线程到多线程的转变

线程详解前言正式开始啥是线程理解线程Windows和Linux下的线程Windows下的线程Linux下的线程对比重新理解进程理解曾经写的代码Linux的线程pthread库验证多线程在同一个进程中跑ps-aL线程资源线程切换成本低线程缺点线程异常线程等待pthread_create的第三个参数——回调函数的返回值终止

Flutter快速入门学习(一)

目录前言新建项目项目入口Dart的入口(项目的入口)布局视图组件Container(容器)Text(文本)Image(图片)Row(水平布局)和Column(垂直布局)ListView(列表视图)GridView(网格视图)Stack(层叠布局)Card(卡片)AppBar(应用栏)FloatingActionButt

Docker基本操作

目录Docker基本操作镜像操作拉取、查看镜像保存、导入镜像容器操作创建并运行一个容器进入容器,修改文件数据卷给nginx挂载数据卷给MySQL挂载本地目录Docker基本操作镜像操作拉取、查看镜像需求:从DockerHub中拉取一个nginx镜像并查看1)首先去镜像仓库搜索nginx镜像,比如DockerHub:2)

商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1.涉及平台平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务)2.核心架构SpringCloud、SpringBoot、Mybatis、Redis3.前端框架VUE、Uniapp、Bootstrap/H5/CSS3、IOS、Android、小程

MySQL的索引概述

目录一、索引的描述二、如何在一个数据表中创建和删除索引呢?三、索引的"两面性"四、索引的适用场景一、索引的描述索引是数据库中一种用于提高数据检索速度和加快查询操作的数据结构。它类似于书籍的目录,可以快速定位到包含特定关键字或值的记录。索引的主要作用是加速数据库的数据检索过程,特别是在大型数据集和复杂查询的情况下。二、如

【QT】day5

1.登录注册和数据库联动三个头文件#ifndefDEMO_H#defineDEMO_H#include<QWidget>#include<QSqlDatabase>//数据库管理类#include<QSqlQuery>//执行sql语句的类#include<QSqlRecord>//数据库记录的类#include<QM

Java + Selenium + Appium自动化测试

一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装)二、启动Appium(Appium环境安装可自行百度)三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk安装步骤:(基于AndroidSDK已经配置好了环境变量,可自行百

Failed to connect to bitbucket.org port 443 错误原因, 解决办法

最近使用SourceTree来访问bitbucket.org的代码托管Git,当Pull或者Push发现操作失败:Failedtoconnecttobitbucket.orgport443错误原因:无法链接到网站地址,可能是DNS解析IP地址错误,或者网站维护,大概率是被墙或者DNS解析错误.解决办法:如果您的浏览器能

热文推荐