【Vue3 知识第六讲】ref、 shallowRef、unref、isRef 等系列知识应用

2023-11-04

一、ref()

ref() 方法接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value

ref 对象是可更改的,也就是说你可以为 .value 赋予新的值。它也是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。

如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解包。

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
权限系统-商城
个人博客地址

若要避免这种深层次的转换,请使用 shallowRef() 来替代。

相较于reactive包裹对象完成响应式,ref更具优势,因为当改变reactive中保存的对象的内存地址时(也就是换一个全新的对象),由于vue3的响应式是通过创建代理对象,在代理对象的set方法中放入该实例的渲染函数的方法构建的,而替换整个对象,而不是修改对象内部的属性值,其并不会调用set方法,所以页面并不会响应式,但是如果使用ref包裹对象,那么此对象仅仅是ref对象的一个value属性,所以更改内存地址时,也仅仅是修改ref对象的value属性,依然会调用代理对象的set方法,完成响应式dom更新

<script setup>
	import { ref } from 'vue'
	
	// 声明基本数据类型的数据
	// 定义一个非响应式的数据,此数据只能在数据层进行修改,视图层不会同步更新
	let num = 1;
	console.log("num:", num)
	num = 100;
	console.log("num:", num)
	setTimeout(() => {
	    num = 1000
	    console.log("num:", num)
	}, 5000)
	
	// 利用 ref 定义一个响应式数据:数据层数据的修改可以相应到视图层,反之亦可
	let str = ref("Hello Ref!!")
	console.log("str:", str, str.value)
	setTimeout(() => {
	    str.value = "Hello 我是响应式数据!!!"
	    console.log(str.value)
	}, 8000);// 更新时间在非响应式数据之后,会影响后者;在非响应式数据之前更新,则不会影响后者
	// 需要注意的是:非响应式的数据更改后不会更新视图,但是如果非响应式数据更新后,去更新响应式数据,那么更新后的非响应式数据也会受响应式数据更新的影响,视图层响应会重新匹配最新的数据进行更新(响应式和非响应式数据)
	
	// 利用 ref 定义一个复杂的数据类型
	let obj = ref({
	    name: "Jack",
	    age: 23,
	    sex: "男"
	})
	console.log("obj:", obj)
	setTimeout(() => {
	    // obj.value = {}
	    obj.value.name = "Lucy"
	    obj.value.sex = "女"
	},3000)
</script>
<template>
	    <div>
	        <div>{{ num }}</div>
	        <strong>{{ str }}</strong>
	        <ul>
	            <li v-for="item,key in obj">{{ item }} ~ {{ key }}</li>
	        </ul>
	    </div>
</template>
  • ref 接受的数据类型
    基本类型,引用类型。
  • 作用
    把参数加工成一个响应式对象,全称为reference对象(简称为ref对象) 。
  • 核心原理
    如果参数是基本类型那么形成响应式依赖于Object.defineProperty( )的get( )和set( ),如果ref的参数是引用类型,底层ref会借助reactive的proxy 定义响应式变成这样:reactive({value:‘xiaxia’})。

二、shallowRef()

shallowRef() 方法是ref() 的浅层作用形式

ref() 不同,浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。

shallowRef() 常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。

<script setup>
	import { ref, shallowRef } from 'vue'
	
	// shallowRef 是 ref 的浅层作用形式,获取原始对象。和 ref() 不同,浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。
	const data = ref({
	    stu: {
	        name: "张三",
	        age: 23,
	        hobby: ['足球', '篮球', '羽毛球']
	    }
	})
	
	const data2 = shallowRef({
	    stu: {
	        name: "张三丰",
	        age: 123,
	        hobby: ['太极', '道教', '武当派']
	    }
	})
	
	// ref 响应式数据是深层次作用(如果是复杂数据类型,最终使用 reactive 处理成 proxy 代理对象)
	console.log("shallowRef.vue数据打印:", data.value)
	console.log("shallowRef.vue数据打印:", data2.value)
	// 第一层数据更新
	const change = () => {
	    data.value = {
	        name: "David",
	        age: 28,
	        sex: "男"
	    }
	    console.log("shallowRef.vue数据打印:", data.value)
	
	    data2.value = {
	        name: "史密斯",
	        age: 87,
	        sex: "男"
	    }
	    console.log("shallowRef.vue数据打印:", data2.value)
	}
	
	const change2 = () => {
	    if (data.value.stu) {
	        data.value.stu = {
	            name: "Lucy",
	            age: 18,
	            sex: "女",
	            eat: ['煎饼果子']
	        }
	    }
	
	    // shallowRef 属于 ref 浅层次的作用。只相应到 .value 层次。但是如果和 ref 一起使用,会受其影响去更新页面数据(注意的是:ref数据必须同步更新到页面上,才可以发起最新数据的扫描行为)。
	    data2.value.stu = {
	        name: "霍去病",
	        age: 887,
	        sex: "男",
	        des: "大汉第一骁将,封狼居胥第一人!!"
	    }
	    console.log("shallowRef.vue数据打印:", data2.value)
	}
	
	const change3 = () => {
	    data.value.stu.hobby.push("橄榄球")
	    data2.value.stu.hobby.push("乒乓球")
	    console.log("shallowRef.vue数据打印:", data2.value)
	}
	</script>
	<template>
	    <div>
	        <h3>TheShallowRef页面数据:</h3>
	        <ul>
	            <li v-for="item in data2.stu">{{ item }}</li>
	        </ul>
	        <div><em>{{ data }}</em></div>
	        <div><em>{{ data2 }}</em></div>
	        <button @click="change">第一层(.value)数据更新</button>
	        <br>
	        <button @click="change2">第二层(.value.stu)数据更新</button>
	        <br>
	        <button @click="change3">第三层(.value.stu.hobby)数据更新</button>
	    </div>
	</template>

需要注意得是,shallowRef 与 ref 不能一起使用,不然 ref 的变化会影响 shallowRef 造成视图的更新

三、 triggerRef()

triggerRef() 强制触发依赖于一个浅层 ref (shallowRef) 的副作用,这通常在对浅引用的内部值进行深度变更后使用。

<script setup>
import { ref, shallowRef, triggerRef } from 'vue'

const refData = ref({
    foo: {
        bar: {
            num: 10
        }
    }
})

const swRefData = shallowRef({
    stu: {
        name: {
            firstname: "弗拉基米尔",
            centername: "",
            lastname: "普京"
        }
    }
})

const change = () => {
    console.log("triggerRef...")
    swRefData.value.stu = {
        name: "张三丰",
        age: 23
    }
    // refData.value.foo.bar.num = 1000
    
    // 触发 shallowRef 数据的更新
    triggerRef(swRefData)
    console.log(swRefData)
}
</script>
<template>
    <div>
        <p>{{ refData }}</p>
        <p>{{ swRefData }}</p>
        <button @click="change">更改数据</button>
    </div>
</template>

四、customRef()

customRef() 创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式。

customRef() 预期接收一个工厂函数作为参数,这个工厂函数接受 tracktrigger 两个函数作为参数,并返回一个带有 getset 方法的对象(手动收集依赖并派发更新)。

一般来说,track() 应该在 get() 方法中调用,而 trigger() 应该在 set() 中调用。

可以用于创建一个防抖 ref,即只在最近一次 set 调用后的一段固定间隔后再调用

<script setup>
    import { customRef, ref } from 'vue'

    const refData = ref("呵呵!")

    // 可以通过自定义 ref 实现防抖操作
    const myRef = (value, delay = 500) => {
        let timer;
        return customRef((track, trigger) => {
            return {
                get() {
                    track();//收集相关依赖
                    return value;
                },
                set(newVal) {
                    clearTimeout(timer)
                    timer = setTimeout(() => {
                        console.log(newVal)
                        trigger();//触发相关的依赖
                        value = newVal;
                    }, delay)
                }
            }
        })
    }
    let result = myRef("Hello customRef!!")
    // let result = myRef({
    //     foo: {
    //         bar: {
    //             num: 1
    //         }
    //     }
    // })
    console.log("customRef中的数据result:", result)
    let count = 1;
    const change = () => {
        // customRef 防抖处理后,指定时间内连续触发,数据不会发生更改。
        result.value = "Hello 我是更新后的数据!!!" + count++
        // result.value.foo.bar.num = 1000

        // refData.value = "哈哈,我会影响customRef深层数据的更新!"
        console.log("customRef中的数据result:", result.value)
    }
</script>
<template>
    <div>
        <h3>customRef数据演示</h3>
        <div>{{ result }}</div>
        <div>{{ refData }}</div>
        <button @click="change">更新数据</button>
    </div>
</template>

五、isRef()

isRef() 方法用于检查某个值是否为 ref

import { ref, isRef, unref } from 'vue'

const str = "Hello World!"
const refStr = ref("Hello Ref Data!")

// isRef() 方法用于检查某个值是否为 ref
console.log("isRef检测:", isRef(str));//isRef检测: false
console.log("isRef检测:", isRef(refStr));//isRef检测: true

六、unref()

unref() 如果参数是 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val 计算的一个语法糖。

import { ref, isRef, unref } from 'vue'

const str = "Hello World!"
const refStr = ref("Hello Ref Data!")

// unref() 如果参数是 ref,则返回内部值,否则返回参数本身。这是 val = isRef(val) ? val.value : val 计算的一个语法糖。
const strResult = unref(str);
const refStrResult = unref(refStr);
console.log("strResult:", strResult, "refStrResult:", refStrResult);//strResult: Hello World! refStrResult: Hello Ref Data!

七、ref 用于获取 DOM 元素

在普通的 js 操作中,一般都是直接操作 dom 元素,但是对于 Vue.js 框架来说,一般是不允许直接操作 dom 元素的。

那么其实 Vue.js 框架提供了 ref 获取 dom 元素,以及组件引用。

而 vue3.0 中没有 this和 r e f s ,所以在 v u e 2 中使用 refs,所以在vue2中使用 refs,所以在vue2中使用refs 来获取 dom 元素的方法在 vue3 行不通。

在 vue3 中可以这样操作:

<script setup>
	import { ref, onMounted } from 'vue'
	
	// 页面所有的同步组件完成挂载的声明周期钩子
	onMounted(() => {
	    console.log("moutend钩子:所有的同步组件完成挂载完成...")
	})
	// mouted 生命周期钩子,在 setup 入口函数后执行
	
	// setup 模式下(钩子函数)执行时,页面还没有渲染,所以此时是拿不到元素的
	// 原生的方式获取元素:document.getXXX 系列(四个)  document.queryXXX系列(两个)
	const divELe = document.querySelector(".wrapper")
	console.log('setup钩子期间获取元素:', divELe);
	
	// Vue 提供了 ref 的方式来获取相关的元素
	let wrapper = ref()
	console.log(wrapper)
	console.log(wrapper.value)
	
	// 异步函数中获取元素:这个时候元素已经渲染完成,可以获取到
	const getEle = () => {
	    const divELe = document.querySelector(".wrapper")
	    console.log(divELe);
	
	    console.log(wrapper.value)
	}
</script>
<template>
    <div>
        <div class="wrapper" ref="wrapper">演示通过ref的方式,获取Vue模板中的元素!!</div>
        <button @click="getEle">获取wrpper</button>
    </div>
</template>

补充:ref、toRef、toRefs 异同点

  • ref、toRef、toRefs 函数都可以将某个对象中的属性变成响应式数据

  • ref 函数的本质是拷贝,修改响应式数据,不会影响到原始数据(引用数据类型会有影响),视图会更新

  • toRef、toRefs 函数和传入的数据形成引用关系,修改 toRef 会影响这些数据,但是不会更新视图

    作用:把一个响应式对象转换成普通对象,该普通对象的每个属性都是一个 ref

    • toRef 函数一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性
    • toRefs 函数接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用 toRef 执行。用于批量设置多个数据为响应式
  • ref 数据会引起监听行为,而 toRef 不会

<script setup>
    const state = reactive({
        title: '标题',
        name: 'wff'
    })
    const { title } = toRefs(state)
    const name = toRef(state, 'name')

    console.log(state.title)
    console.log(title.value)
    console.log(name.value)

    const titleState = ref('new')
    const count = ref({
        count: 0
    })
</script>

<template>
  <div>
    name:{{name}}
  </div>
</template>

注:我们使用 reactive创建的对象,如果想在模板中使用,就必须得使用 xxx.xxx的形式;如果大量用到的话还是很麻烦的,但是使用 es6解构以后,会失去响应式。那么toRefs的作用就体现在这,利用toRefs可以将一个响应式 reactive 对象的所有原始属性转换为响应式的ref属性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Vue3 知识第六讲】ref、 shallowRef、unref、isRef 等系列知识应用 的相关文章

  • Javascript“this”在 IE 中丢失上下文

    以下在 firefox safari chrome 中工作正常 在 IE 中 this 似乎在 handleEvent 函数中丢失上下文 警报的结果是 object Window 这不是我想要的 当从handleEvent 输出时 this
  • 获取 CRM 2011 中功能区按钮的 ID

    我创建了一个 JavaScript 我想在其中隐藏功能区Reactivate Lead按钮取决于某些条件 我通过在表单上按 F12 获得了按钮的 ID 即lead NoRelationship Form Mscrm Form lead Re
  • CryptoJS 使用密码加密 AES,但 PHP 解密需要密钥

    我在用CryptoJS https code google com p crypto js AES加密字符串 function doHash msg msg String msg var passphrase aggourakia var
  • 有没有办法让 jslint 在 javascript 的下一行中使用大括号?

    我改变了我的编码风格 function getParams entity use strict var accountID store getItem AccountID switch entity case Topic to functi
  • JS文件中的System.register是什么意思?

    在 Angular 2 中使用指令时 JS 文件中的 System register 是什么意思 我认为这个问题并不特定于 Angular2 中的指令 它是关于 ES6 TypeScript 和其他使用 SystemJS 的现代编译器的一般
  • 每n秒执行一次函数

    我制作了这个在 10 秒后点击链接的代码片段 function timeout window setTimeout function img left click 1000 setTimeout timeout 1000 timeout 我
  • vue-chartjs 反应数据错误

    我正在尝试使用反应式数据混合vue chartjs http vue chartjs org home id reactive data 用于设置初始数据的已安装函数正在运行 我可以使用 API 响应正确查看图表 fetchSessionT
  • JavaScript 可以检测用户的浏览器是否支持 gzip 吗?

    我可以使用 JavaScript 来检测用户的浏览器是否支持 gzip 压缩内容 客户端 而不是 Node js 或类似内容 我正在尝试支持以下边缘情况 有很多可能的文件可以加载到特定的 Web 应用程序上 最好在应用程序运行时根据需要加载
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • 个人 Tumblr 帖子上的 Javascript

    我知道您可以编辑在 tumblr 博客上呈现所有帖子博客主页的 html AngularJS 但是 有什么办法可以添加自定义到各个帖子 我想在逐个帖子的基础上做一些 javascript 的东西 但似乎无法找到可以编辑代码的位置 或者 如果
  • setTimeout范围问题

    我在控制玩家重生的函数内部定义了一个 setTimeout 我正在创建一个游戏 var player death function this alive false Console log death var timer3 setTimeo
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 使用 Javascript/Node.js 在代码内执行 mongoimport

    node js javascript 中是否有任何库可供个人使用mongoimport在代码中 据我了解 mongoimport 有点像 exe 您必须先执行它 然后才能使用其文本输入环境 是否可以在我的代码中执行 mongoimport
  • 使用 JavaScript 防止网页导航离开

    如何使用 JavaScript 防止网页导航离开 Using onunload允许您显示消息 但不会中断导航 因为为时已晚 然而 使用onbeforeunload将中断导航 window onbeforeunload function re
  • 将文本字段限制为仅包含数字的最佳方法?

    I m using the following Javascript to restrict a text field on my website to only accept numerical input and no other le
  • 在 Chrome 开发者工具中禁用调试器语句

    我正在尝试对恶意 JavaScript 进行逆向工程 当我最初加载侧面时 会注入 JS 代码 其中包括 debugger 语句并将断点注入我的 chrome 开发人员控制台 通过stackoverflow阅读 禁用所有断点does not帮
  • 在 javascript 中实现固定位置会导致 Safari 滚动时出现抖动

    固定位置不适用于我的用例 因为它固定在浏览器窗口上 您可能会处于文本在屏幕右侧之外且无法到达的状态 无论如何 我尝试使用绝对定位 然后调整javascript中的 顶部 它在 Firefox 和 Chrome 中运行良好 但在 Safari
  • ES6 静态方法引用 self? [复制]

    这个问题在这里已经有答案了 我有两节课 存储库和用户存储库 我想在 Repository 中定义一个静态方法 该方法在运行时调用 UserRepository 中的静态函数 有什么干净的方法可以做到这一点吗 class Repository
  • 什么时候可以使用Javascript,什么时候不可以?

    不使用太多 javascript jquery 是个好习惯吗 我们应该尽可能避免它 为了良好的可访问性 吗 什么时候可以使用 JavaScript 什么时候不能在网页设计和开发中使用 JavaScript 在什么场景 什么条件下 Updat
  • 在 Meteor 应用程序中实现 MongoDB 2.4 的全文搜索

    我正在考虑向 Meteor 应用程序添加全文搜索 我知道 MongoDB 现在支持此功能 但我对实现有一些疑问 启用文本搜索功能的最佳方法是什么 textSearchEnabled true 在 Meteor 应用程序中 有没有办法添加索引

随机推荐

  • CIC滤波器的matlab仿真与实现

    CIC滤波器的matlab仿真与实现 介绍 在数字信号处理中 由于后级硬件如FPGA的处理速度无法跟上前级ADC的采样速度 因此需要对ADC的采样数据进行降速处理 也就是对采样数据进行抽取 简单的抽取描述就是对其中连续几个点取一个点进行处理
  • 安卓手机玩游戏卡顿怎么解决_手机卡顿怎么办?教你3个实用解决方法,两分钟解决卡顿难题!...

    相信更多人都知道这种情况 手机越使越卡 其中最严重的就是当属安卓手机 在使用一两年之后 有的时候会卡死机 这时候相信很多人都在想改换新手机了 今天小编教大家几个小技巧 让你的手机如新机般流畅 一 更新系统不一定是好事 我们都知道在我们买过新
  • JVM 内存模型概述

    摘要 我们都知道 Java程序在执行前首先会被编译成字节码文件 然后再由Java虚拟机执行这些字节码文件从而使得Java程序得以执行 事实上 在程序执行过程中 内存的使用和管理一直是值得关注的问题 Java虚拟机在执行Java程序的过程中会
  • 【六种方案】【idea】最全解决IntelliJ IDEA控制台输出中文乱码问题

    解决方案 版本过高 idea VM 修改 配置项目编码 encodings xml 编辑配置 文件编码 修改后记得重启 版本过高 高版本引起输出乱码 已知2022年7月12日为止 Java 18输出的中文乱码不能得到有效解决 也许你试过 v
  • Android studio安装教程(2020/11/20最新版本的安装)

    一 安装前提 系统已经安装了jdk 而且版本在1 8以上 打开命令提示符界面 输入java version 切记之间有空格 就可以查看自己jdk安装版本了 二 安装准备 在官网下载最新安装包 接收协议进行下载 三 安装步骤 双击安装包 点击
  • 2021-04-06

    基于耳部PPG传感器的吞咽信号识别 1 PPG信号与吞咽 PP 信号全称是光电容积脉搏波信号 它表征的是所测组织部位内部血管中血液容积的变化量 可利用光电技术来采集 在吞咽时 由于喉部软骨的运动 影响了PP 测量的光路 即喉部PPG会有较大
  • c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例

    概念 平面内两条线段位置关系的判定在很多领域都有着广泛的应用 比如游戏 CAD 图形处理等 而两线段交点的求解又是该算法中重要的一环 本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法 外积 又称叉积 是向量代数 解析几何 中的
  • 【Docker】Docer安装MySQL 8 并且远程登录

    1 概述 参考 Docer安装MySQL 5并且远程登录 2 查找版本 查找Docker Hub上的mysql镜像 runoob runoob mysql docker search mysql NAME DESCRIPTION STARS
  • CPU监控工具(CPU使用率及CPU温度监控)

    网络由设备 服务器 路由器 交换机和其他网络组件组成 CPU是网络中所有硬件设备的组成部分 它负责一个设备的稳定性和性能 企业严重依赖网络 公司硬件的处理能力决定了网络的容量 随着CPU特性和硬件的快速发展 对于组织来说 计划它们的容量并监
  • C/C++中结构体动态内存的管理(malloc和free)

    这两天在用C 写仿真代码时 用到了大量的结构体 但是最后的结果总是出错或者编译运行时就会出现错误 经过在网上查阅大量资料和博客 发现是因为使用结构体时没有考虑内存的分配 而在定义结构体这种数据类型的时候是不会分配内存空间的 只有在定义变量的
  • 解决VMware虚拟机无法联网问题

    由于博主在日常学习生活中经常通过VMware虚拟机来使用Linux或macOS系统 所以也是接触过不少和虚拟机有关的问题 其中 在博主的虚拟机里 如Ubuntu deepin 有时候会出现主机已经联网 而虚拟机却无法联网的现象 在此 博主记
  • Python装饰器解析(2)——retrying库使用与源码分析

    retrying简介 retrying功能是为一些任务添加重试机制 只需要指定不同的参数就能便捷实现重试机制逻辑代码 retrying特点 1 通用装饰器API 2 指定停止条件 即按尝试次数限制 3 指定等待条件 即 尝试之间的指数退避休
  • iOS开发入门——简单上手体验

    iOS开发入门 简单上手体验 下面我们正式进入对iOS即swift的探索了解 我们在上一篇iOS开发入门 项目创建中已经创建了一个项目 我们将基于它继续探索 如下图所示 我们双击即可进入这个项目 1 进入项目 进入项目后如下图所示 2 添加
  • 有什么书籍被程序员奉为经典?

    01 代码大全 美 史蒂夫 迈克康奈尔 优秀的编程实践的百科全书 代码大全 注重个人技术 其中所有东西加起来 就是我们本能所说的 编写整洁的代码 这本书有50页在谈论代码布局 Joel Spolsky 它从软件质量和编程思想等方面论述了软件
  • SQL SERVER 查询未提交的事务

    USE masterGOSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT es session id es login name es host name est text cn
  • Kafka0-10版本之00 Producer生产者的简单使用,往kafka循环打入数据

    package Kafka010 Utils import java util Properties import org apache kafka clients producer KafkaProducer ProducerConfig
  • python mvc 数据库 增删改查_ASP.NET C# 连接 Oracle数据库增删改查,事务

    一 知识介绍 ASP NET 使用的是MVC模式 开发工具Visual studio 语言C Oracle是比较重型的数据库 这里主要介绍连接数据库 对数据进行具体的使用 Visual Studio连接数据库都是需要dll文件 方法相似 二
  • java 类和构造方法

    java 类和构造方法 1 给对象的赋值 public class Test public static void main String args Begin 创建Dog对象 设置Dog对象的属性 Dog a new Dog a mz 五
  • 杰理之spi_camera说明【篇】

    spi板级配置举例 SPI1 PLATFORM DATA BEGIN spi1 data clk 20000000 mode SPI STD MODE SPI 1WIRE MODE 单线模式 SPI STD MODE 双线模式 SPI DU
  • 【Vue3 知识第六讲】ref、 shallowRef、unref、isRef 等系列知识应用

    文章目录 一 ref 二 shallowRef 三 triggerRef 四 customRef 五 isRef 六 unref 七 ref 用于获取 DOM 元素 补充 ref toRef toRefs 异同点 一 ref ref 方法接