最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3中的ref和reactive響應(yīng)式原理解析

 更新時(shí)間:2022年08月06日 10:34:29   作者:LotusFlower  
這篇文章主要介紹了Vue3中的ref和reactive響應(yīng)式,本節(jié)主要介紹了響應(yīng)式變量和對(duì)象,以及變量和對(duì)象在響應(yīng)式和非響應(yīng)式之間的轉(zhuǎn)換,需要的朋友可以參考下

Vue3系列4--ref和reactive響應(yīng)式

本節(jié)主要介紹了響應(yīng)式變量和對(duì)象,以及變量和對(duì)象在響應(yīng)式和非響應(yīng)式之間的轉(zhuǎn)換。

1 ref

接受一個(gè)內(nèi)部值并返回一個(gè)響應(yīng)式且可變的 ref 對(duì)象。ref 對(duì)象僅有一個(gè).valueproperty,指向該內(nèi)部值。

案例

<template>
  <div>
    <button @click="changeMsg">change</button>
    <div>{{ message }}</div>
  </div>
</template>
  
<script setup lang="ts">
let message: string = "我是message"
  
const changeMsg = () => {
   message = "change msg"
}
</script>
  
<style>
</style>

我們這樣操作是無(wú)法改變message 的值 應(yīng)為message 不是響應(yīng)式的無(wú)法被vue 跟蹤要改成ref。響應(yīng)式就是在頁(yè)面上實(shí)時(shí)顯示修改的值。

Ref TS對(duì)應(yīng)的接口:

interface Ref<T> {
  value: T
} // 對(duì)于接口問(wèn)題,是TS語(yǔ)法,如果不清楚,直接看TS

但是被ref包裹后需要使用value來(lái)進(jìn)行賦值。

<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判斷是不是一個(gè)ref對(duì)象

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創(chuàng)建一個(gè)跟蹤自身.value變化的 ref,但不會(huì)使其值也變成響應(yīng)式的

例子1

修改其屬性是非響應(yīng)式的這樣是不會(huì)改變的

<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

這樣是可以被監(jiān)聽(tīng)到的修改value,必須要修改整個(gè)對(duì)象才行

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

4 triggerRef

為了解決shallowRef的問(wèn)題,我們強(qiáng)制更新頁(yè)面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 是個(gè)工廠函數(shù)要求我們返回一個(gè)對(duì)象 并且實(shí)現(xiàn) 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用來(lái)綁定復(fù)雜的數(shù)據(jù)類型

例如 對(duì)象 數(shù)組

reactive源碼約束了我們的類型,類型必須是object,不能綁定普通的類型,會(huì)報(bào)錯(cuò)。你如果用ref去綁定對(duì)象 或者數(shù)組等復(fù)雜的數(shù)據(jù)類型 我們看源碼里面其實(shí)也是 去調(diào)用reactive,但使用reactive 去修改值無(wú)須.value

reactive 基礎(chǔ)用法

import { reactive } from 'vue'
let person = reactive({
   name:"唐少"
})
person.name = "唐少2"

數(shù)組異步賦值問(wèn)題

// 這樣賦值頁(yè)面是不會(huì)變化的因?yàn)闀?huì)脫離響應(yīng)式<br data-filtered="filtered">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:包裹一層對(duì)象

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對(duì)象將其設(shè)置為只讀

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

8 shallowReactive

只能對(duì)淺層的數(shù)據(jù) 如果是深層的數(shù)據(jù)只會(huì)改變值 不會(huì)改變視圖

<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

如果原始對(duì)象是非響應(yīng)式的就不會(huì)更新視圖 數(shù)據(jù)是會(huì)變的,如果原始對(duì)象是響應(yīng)式的是會(huì)更新視圖并且改變數(shù)據(jù)的

<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 轉(zhuǎn)化為響應(yīng)式對(duì)象
  
const change = () => {
   state.value++
   console.log(obj, state);
}
</script>

10toRefs

可以幫我們批量創(chuàng)建ref對(duì)象主要是方便我們解構(gòu)使用

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

11toRaw

將響應(yīng)式對(duì)象轉(zhuǎn)化為普通對(duì)象

import { reactive, toRaw } from 'vue'
const obj = reactive({
   foo: 1,
   bar: 1
})
const state = toRaw(obj)
// 響應(yīng)式對(duì)象轉(zhuǎn)化為普通對(duì)象
  
const change = () => {
   console.log(obj, state);
}

到此這篇關(guān)于Vue3中的ref和reactive響應(yīng)式的文章就介紹到這了,更多相關(guān)Vue3 ref和reactive響應(yīng)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

修水县| 山西省| 景德镇市| 临澧县| 临泽县| 丰城市| 神农架林区| 东至县| 泰州市| 格尔木市| 射洪县| 雅安市| 娄底市| 绥中县| 米林县| 肥东县| 龙井市| 定安县| 景东| 合肥市| 福安市| 横山县| 宾阳县| 黔西| 炎陵县| 金川县| 昭苏县| 桂平市| 团风县| 井研县| 郴州市| 青铜峡市| 灯塔市| 青川县| 寿阳县| 津南区| 杭锦后旗| 中阳县| 迭部县| 南丹县| 陇南市|