首页IT科技vue3中的reactive(Vue3系列4–ref和reactive响应式)

vue3中的reactive(Vue3系列4–ref和reactive响应式)

时间2025-04-27 06:16:35分类IT科技浏览3761
导读:1 ref 接受一个内部值并返回一个响应式且可变的 ref 对象。ref 对象仅有一个.valueproperty,指向该内部值。...

1 ref

接受一个内部值并返回一个响应式且可变的 ref 对象           。ref 对象仅有一个.valueproperty          ,指向该内部值                。

案例

我们这样操作是无法改变message 的值 应为message 不是响应式的无法被vue 跟踪要改成ref     。响应式就是在页面上实时显示修改的值           。

Ref TS对应的接口:

interface Ref<T> { value: T } // 对于接口问题                ,是TS语法      ,如果不清楚     ,直接看TS

但是被ref包裹后需要使用value来进行赋值                。

<template> <div> <button @click="changeMsg">change</button> <div>{{ message }}</div> </div> </template> <script setup lang="ts"> import {ref,Ref} from vue let message:Ref<string> = ref("我是message") let message= ref<string>("我是message"// 第二种方式 const changeMsg = () => { message.value = "change msg" } </script> <style> </style>

2 isref

判断是不是一个ref对象

import { ref, Ref,isRef } from vue let message: Ref<string | number> = ref("我是message") let notRef:number = 123 const changeMsg = () => { message.value = "change msg" console.log(isRef(message)); //true console.log(isRef(notRef)); //false }

3 shallowref

创建一个跟踪自身.value变化的 ref                ,但不会使其值也变成响应式的

例子1

修改其属性是非响应式的这样是不会改变的

<template> <div> <button @click="changeMsg">change</button> <div>{{ message }}</div> </div> </template> <script setup lang="ts"> import { Ref, shallowRef } from vue type Obj = { name: string } let message: Ref<Obj> = shallowRef({ name: "唐少" }) const changeMsg = () => { message.value.name = 唐少2 } </script> <style> </style>

例子2

这样是可以被监听到的修改value           ,必须要修改整个对象才行

import { Ref, shallowRef } from vue type Obj = { name: string } let message: Ref<Obj> = shallowRef({ name: "唐少" }) const changeMsg = () => { message.value = { name: "唐少2" } }

4 triggerRef

为了解决shallowRef的问题     ,我们强制更新页面DOM                ,这样也是可以改变值的

<template> <div> <button @click="changeMsg">change</button> <div>{{ message }}</div> </div> </template> <script setup lang="ts"> import { Ref, shallowRef,triggerRef } from vue type Obj = { name: string } let message: Ref<Obj> = shallowRef({ name: "唐少" }) const changeMsg = () => { message.value.name = 唐2 triggerRef(message) } </script> <style> </style>

5 customRef

自定义ref            ,customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set

<script setup lang="ts"> import { Ref, shallowRef, triggerRef, customRef } from vue function Myref<T>(value: T) { return customRef((track, trigger) => { return { get() { track() return value }, set(newVal: T) { console.log(set); value = newVal trigger() } } }) } let message = Myref(唐少) const changeMsg = () => { message.value = 唐少2 // triggerRef(message) } </script>

6 reactive

用来绑定复杂的数据类型 例如 对象 数组

reactive源码约束了我们的类型,类型必须是object                ,不能绑定普通的类型                 ,会报错     。你如果用ref去绑定对象 或者数组等复杂的数据类型 我们看源码里面其实也是 去调用reactive,但使用reactive 去修改值无须.value

reactive 基础用法
import { reactive } from vue let person = reactive({ name:"唐少" }) person.name = "唐少2"
数组异步赋值问题
// 这样赋值页面是不会变化的因为会脱离响应式let person = reactive<number[]>([]) setTimeout(() => { person = [1, 2, 3] console.log(person); },1000)
解决方案1:push
import { reactive } from vue let person = reactive<number[]>([]) setTimeout(() => { const arr = [1, 2, 3] person.push(...arr) console.log(person); },1000)
解决方案2:包裹一层对象
type Person = { list?:Array<number> } let person = reactive<Person>({ list:[] }) setTimeout(() => { const arr = [1, 2, 3] person.list = arr; console.log(person); },1000)

7 readonly

拷贝一份proxy对象将其设置为只读

import { reactive ,readonly} from vue const person = reactive({count:1}) const copy = readonly(person) //person.count++ copy.count++

8 shallowReactive

只能对浅层的数据 如果是深层的数据只会改变值 不会改变视图

<template> <div> <div>{{ state }}</div> <button @click="change1">test1</button> <button @click="change2">test2</button> </div> </template> <script setup lang="ts"> import { shallowReactive } from vue const obj = { a: 1, first: { b: 2, second: { c: 3 } } } const state = shallowReactive(obj) function change1() { state.a = 7 } function change2() { state.first.b = 8 state.first.second.c = 9 console.log(state); } </script> <style> </style>

9toRef

如果原始对象是非响应式的就不会更新视图 数据是会变的          ,如果原始对象是响应式的是会更新视图并且改变数据的

<template> <div> <button @click="change">按钮</button> {{state}} </div> </template> <script setup lang="ts"> import { reactive, toRef } from vue const obj = { foo: 1, bar: 1 } const state = toRef(obj, bar) // bar 转化为响应式对象 const change = () => { state.value++ console.log(obj, state); } </script>

10toRefs

可以帮我们批量创建ref对象主要是方便我们解构使用

import { reactive, toRefs } from vue const obj = reactive({ foo: 1, bar: 1 }) let { foo, bar } = toRefs(obj) foo.value++ console.log(foo, bar);

11toRaw

将响应式对象转化为普通对象

import { reactive, toRaw } from vue const obj = reactive({ foo: 1, bar: 1 }) const state = toRaw(obj) // 响应式对象转化为普通对象 const change = () => { console.log(obj, state); }
声明:本站所有文章                 ,如无特殊说明或标注      ,均为本站原创发布      。任何个人或组织          ,在未征得本站同意时                ,禁止复制           、盗用                、采集     、发布本站内容到任何网站           、书籍等各类媒体平台                。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理          。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
罗山县百度百科("罗山县") seo关键词排名优化怎样收费(掌握SEO关键词排名优化的专业公司,助您事半功倍!)