首页 > 其他分享 >vue3学习笔记

vue3学习笔记

时间:2024-03-20 11:13:51浏览次数:29  
标签:target reactive value 学习 响应 笔记 vue3 newVal ref

1.创建一个vue3项目

1.创建vue cli

npm install -g @vue/cli

2.创建项目

npm create <项目名称>

开始敲代码啦!!!

1.引用组件

只需要import就可以了,因为使用了setup之后引用了就会被自动成为子组件了。

2.声明数据

ref

用于声明基本数据类型

reactive 

用于声明对象和数组

shallowReactive

声明一个浅响应式数据,只有第一层跟属性是响应式的,其他的内部属性是非响应式的

readonly

只读(适合放非响应式数据)
shallowReadonly 只有跟属性是只读的,其他的属性是响应式的

ref和reactive

  ref reactive
内部工作原理 ref 是一个函数,它接受一个内部值并返回一个响应式且可变的引用对象。这个引用对象有一个 .value 属性,该属性指向内部值。 reactive 是一个函数,它接受一个对象并返回该对象的响应式代理,也就是 Proxy
核心 返回的是响应式且可变的引用对象 返回的是响应式代理
  由于两者的本质上的核心区别,导致ref优于reactive
声明数据的响应式状态上,底层原理 ref 采用 RefImpl对象实例 reactive采用Proxy代理对象。
代码实现
import { ref } from 'vue'

const state = ref({ count: 0 })
state.value.count++
import { reactive } from 'vue'

const state = reactive({ count: 0 })
state.count++
源码
// 深响应式
export function ref(value?: unknown) {
  return createRef(value, false)
}

// 浅响应式
export function shallowRef(value?: unknown) {
  return createRef(value, true)
}

function createRef(rawValue: unknown, shallow: boolean) {
  // 如果传入的值已经是一个 ref,则直接返回它
  if (isRef(rawValue)) {
    return rawValue
  }
  // 否则,创建一个新的 RefImpl 实例
  return new RefImpl(rawValue, shallow)
}

class RefImpl<T> {
  // 存储响应式的值。我们追踪和更新的就是_value。(这个是重点)
  private _value: T
  // 用于存储原始值,即未经任何响应式处理的值。(用于对比的,这块的内容可以不看)
  private _rawValue: T

  // 用于依赖跟踪的 Dep 类实例
  public dep?: Dep = undefined
  // 一个标记,表示这是一个 ref 实例
  public readonly __v_isRef = true

  constructor(
    value: T,
    public readonly __v_isShallow: boolean,
  ) {
    // 如果是浅响应式,直接使用原始值,否则转换为非响应式原始值
    this._rawValue = __v_isShallow ? value : toRaw(value)
    // 如果是浅响应式,直接使用原始值,否则转换为响应式值
    this._value = __v_isShallow ? value : toReactive(value)

    // toRaw 用于将响应式引用转换回原始值
    // toReactive 函数用于将传入的值转换为响应式对象。对于基本数据类型,toReactive 直接返回原始值。
    // 对于对象和数组,toReactive 内部会调用 reactive 来创建一个响应式代理。
    // 因此,对于 ref 来说,基本数据类型的值会被 RefImpl 直接包装,而对象和数组
    // 会被 reactive 转换为响应式代理,最后也会被 RefImpl 包装。
    // 这样,无论是哪种类型的数据,ref 都可以提供响应式的 value 属性,
    // 使得数据变化可以被 Vue 正确追踪和更新。
    // export const toReactive = (value) => isObject(value) ? reactive(value) : value
  }

  get value() {
    // 追踪依赖,这样当 ref 的值发生变化时,依赖这个 ref 的组件或副作用函数可以重新运行。
    trackRefValue(this)
    // 返回存储的响应式值
    return this._value
  }

  set value(newVal) {
    // 判断是否应该使用新值的直接形式(浅响应式或只读)
    const useDirectValue =
      this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
    // 如果需要,将新值转换为非响应式原始值
    newVal = useDirectValue ? newVal : toRaw(newVal)
    // 如果新值与旧值不同,更新 _rawValue 和 _value
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal
      this._value = useDirectValue ? newVal : toReactive(newVal)
      // 触发依赖更新
      triggerRefValue(this, DirtyLevels.Dirty, newVal)
    }
  }
}

 

function reactive(target) {
  if (target && target.__v_isReactive) {
    return target
  }

  return createReactiveObject(
    target,
    false,
    mutableHandlers,
    mutableCollectionHandlers,
    reactiveMap
  )
}

function createReactiveObject(
  target,
  isReadonly,
  baseHandlers,
  collectionHandlers,
  proxyMap
) {
  if (!isObject(target)) {
    return target
  }

  const existingProxy = proxyMap.get(target)
  if (existingProxy) {
    return existingProxy
  }

  const proxy = new Proxy(target, baseHandlers)
  proxyMap.set(target, proxy)
  return proxy
}

 

源码解释 在上述代码中,ref 函数通过 new RefImpl(value) 创建了一个新的 RefImpl 实例。这个实例包含 getter 和 setter,分别用于追踪依赖和触发更新。使用 ref 可以声明任何数据类型的响应式状态,包括对象和数组。 reactive 通过 new Proxy(target, baseHandlers) 创建了一个代理。这个代理会拦截对目标对象的操作,从而实现响应式。
 对比  
  •  有局限性:仅对引用数据类型有效

 



 


 7.computed:计算属性

8.watch:侦听器

import { reactive } from 'vue'

const state = reactive({ count: 0 })
state.count++

标签:target,reactive,value,学习,响应,笔记,vue3,newVal,ref
From: https://www.cnblogs.com/meiyanstar/p/18077102

相关文章

  • Android JNI学习-使用第三方SO库
    https://david1840.github.io/2018/12/03/Android-JNI学习-使用第三方SO库/CMakeList.txt在CMake中将LibTest.so导入工程cmake_minimum_required(VERSION3.4.1)add_library(#Setsthenameofthelibrary.UseSo#Setsthelibraryasasha......
  • 数据库实验课学习笔记2
    约束类型  1.主键约束    语法: 字段  数据类型  primarykey      2.外键约束   语法: foreignkey (字段) references 引用的表(引用的字段)   3.检查约束    语法: 字段  数据类型check(约束内容)  4.默认......
  • 数据库实验课学习笔记1
    数据库与数据表--数据库(文件夹)--数据表(文件)--sqlservermangerment--软件(辅助连接数据库)--navicat等用代码创建数据库   语法:createdatabase 数据库名称createdatabasetext1点击“新建查询”,选中要执行的代码,先点“分析"看你的代码是否有语法错误,......
  • vite + vue3 + typescript 搭建
    1.安装node.js 下载地址:https://nodejs.p2hp.com/,安装好后,cmd输入node-v查看版本号,出现以下图版本号内容则安装成功2.安装vite(本步骤可省略)可先切换淘宝镜像 npmconfigsetregistryhttpsregistry.npm.taobao.org确保node安装好,输入 npminstall-gcreate-vite命......
  • Vue3 Slot—插槽全家桶使用详解
    插槽是什么插槽slot就是子组件中提供给父组件使用的一个占位符,用<slot></slot>表示,父组件可以给这个占位符内填充任何模板代码,填充的内容会自动替换<slot></slot>标签。插槽被分为三种:匿名插槽、具名插槽、作用域插槽。1、匿名插槽没有名字的插槽就是匿名插槽,组件可以放......
  • 学习STM32第八天
    TIM基础1、TIM编码器接口通过定时器的编码器接口进行自动计次,之前的编码器计次是通过触发外部中断然后在中断函数中进行计次,当测量的是高速旋转的电机时,则每秒会产生成千上万个中断,程序会频繁进入中断但是中断所完成的任务又仅仅是简单的加一减一,极大地浪费软件资源。使用......
  • 学习csh有什么学习技巧
    学习csh(CShell)的学习技巧主要包括以下几点:1.理解CShell的语法和特性:CShell的语法与C语言类似,因此理解C语言的基础知识对于学习CShell会有很大的帮助。同时,需要了解CShell的特有特性,如命令历史、作业控制、别名等。2.阅读文档和教程:查阅相关的CShell文档和教程是学习的......
  • 060_深度学习
    目录神经网络深度学习各层负责内容神经网络深度学习各层负责内容......
  • 070_机器学习搭建环境
    目录机器学习基础环境安装与使用库的安装jupyternotebook使用机器学习基础环境安装与使用库的安装jupyternotebook使用......
  • C语言程序设计(第二版)学习笔记——第三章
    第三章基本数据类型及数据的输入输出3.1C语言的基本数据类型简介要在C环境下实现运算必须首先定义变量,并确定变量的数据类型,然后才能对数据进行操作。C语言的数据类型分为四大类:基本类型、构造类型、指针类型和空类型(无值类型)。3.2标识符、常量和变量3.2.1标识符1、......