欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue3中關(guān)于ref和reactive的問題

 更新時間:2023年04月19日 14:28:25   作者:貓老板的豆  
這篇文章主要介紹了Vue3中關(guān)于ref和reactive的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

關(guān)于ref和reactive的問題

如果你使用過 Vue3,你知道的,在 Vue3 中有兩個非常常用的響應(yīng)式 API:reactive 和 ref。它們會把我們想要追蹤的數(shù)據(jù)變成響應(yīng)式。

而且我們在使用時一直被告知 ref 用于創(chuàng)建基礎(chǔ)類型的響應(yīng)式,也可以創(chuàng)建引用類型的響應(yīng)式。而對于引用類型,底層也是轉(zhuǎn)換為 reactive 來進行響應(yīng)式處理。那既然這樣為撒還需要 reactive ,全部使用 ref 不就行了嗎?

雖然 ref 創(chuàng)建的響應(yīng)式數(shù)據(jù)在腳本中需要通過 .value 才能訪問到呀!但是這里肯定影響不大。并且在模板中會自動添加上 .value,所以模板中不需要通過 .value 訪問。

既然這二者基本沒撒差別,但是還是暴露了 reactive 這個 API,難道有什么場景是 reactive 能做而 ref 做不了的?

簡單了解 ref & reactive

我們先簡單了解一下這兩個 API。

reactive

返回對象的響應(yīng)式副本,響應(yīng)式轉(zhuǎn)換是“深層”的——它影響所有嵌套 property。我們一般這樣寫。

const obj = reactive({ count: 0 })

并且可以直接使用。

const count = obj.count

ref

受一個內(nèi)部值并返回一個響應(yīng)式且可變的 ref 對象。ref 對象僅有一個 .value property,指向該內(nèi)部值。我們一般是這樣寫。

const data = ref(xxx)

引用的時候,一般會通過data.value的方式引用。

const dataValue = data.value

通過跟蹤 Vue3 的源代碼可以證明,當(dāng)我們調(diào)用 ref 方法來定義響應(yīng)式數(shù)據(jù)時,當(dāng)參數(shù)為對象類型時,其實里面用的是 reactive 方法。也就是說上面的 data.value ,事實上是 reactive 方法創(chuàng)造出來的。

注意:

reactive 能做的 ref 也能做,并且還是用 reactive 做的

當(dāng) ref 的參數(shù)為對象時,用的就是 reactive 方法

在 Vue3 中,如果是把對象類型的數(shù)據(jù)弄成響應(yīng)式,reactive 和 ref 都可以,且ref 內(nèi)部是通過r eactive 來支持的。也就是說,你 reactive 能做的,我 ref 也能做。

簡單來說 ref 是在 reactive 上在進行了封裝進行了增強,所以在 Vue3 中 reactive 能做的,ref 也能做,reactive 不能做的,ref 也能做。

個人理解ref是reactive的語法糖,如:ref(1) 就等價于 reactive({value: 1});

平時項目ref一把梭,是可以的,問題也不大

vue3 ref 和reactive的區(qū)別

Ref

ref數(shù)據(jù)響應(yīng)式監(jiān)聽。ref 函數(shù)傳入一個值作為參數(shù),一般傳入基本數(shù)據(jù)類型,返回一個基于該值的響應(yīng)式Ref對象,該對象中的值一旦被改變和訪問,都會被跟蹤到,就像我們改寫后的示例代碼一樣,通過修改 count.value 的值,可以觸發(fā)模板的重新渲染,顯示最新的值

<template>
  
  <h1>{{name}}</h1>
  <h1>{{age}}</h1>
  <button @click="sayName">按鈕</button>
</template>

<script lang="ts">
import {ref,computed} from 'vue' 

export default {
  name: 'App',
  setup(){
    const name = ref('zhangsan')
    const birthYear = ref(2000)
    const now = ref(2020)
    const age = computed(()=>{
      return now.value - birthYear.value
    })
    const sayName = () =>{
      name.value = 'I am ' + name.value
    }
    return {
      name,
      sayName,
      age
    }
  }
}
</script>


reactive

reactive是用來定義更加復(fù)雜的數(shù)據(jù)類型,但是定義后里面的變量取出來就不在是響應(yīng)式Ref對象數(shù)據(jù)了

所以需要用toRefs函數(shù)轉(zhuǎn)化為響應(yīng)式數(shù)據(jù)對象

將上面用ref寫的代碼轉(zhuǎn)化成reactive型的代碼

<template>
  <!-- <img alt="Vue logo" src="./assets/logo.png"> -->
  <div>
    <h1>{{ name }}</h1>
    <h1>{{ age }}</h1>
    <button @click="sayName">按鈕</button>
  </div>
</template>

<script lang="ts">
import { computed, reactive,toRefs } from "vue";

interface DataProps {
  name: string;
  now: number;
  birthYear: number;
  age: number;
  sayName: () => void;
}

export default {
  name: "App",
  setup() {
   

    const data: DataProps = reactive({
      name: "zhangsan",
      birthYear: 2000,
      now: 2020,
      sayName: () => {
        console.log(1111);
        console.log(data.name);
        
        data.name = "I am " + data.name;
        console.log(data.name);
      },
      age: computed(() => {
        return data.now - data.birthYear;
      }),
    });

    const refData = toRefs(data)
    refData.age
    return {
      ...refData,
    };
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • electron+vue?實現(xiàn)靜默打印功能

    electron+vue?實現(xiàn)靜默打印功能

    這篇文章主要介紹了electron+vue?實現(xiàn)靜默打印功能,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • vue2.0使用Sortable.js實現(xiàn)的拖拽功能示例

    vue2.0使用Sortable.js實現(xiàn)的拖拽功能示例

    本篇文章主要介紹了vue2.0使用Sortable.js實現(xiàn)的拖拽功能示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 將 vue 生成的 js 上傳到七牛的實例

    將 vue 生成的 js 上傳到七牛的實例

    本篇文章主要介紹了將 vue 生成的 js 上傳到七牛的實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Vue3  defineExpose要在方法聲明定義以后使用的教程

    Vue3  defineExpose要在方法聲明定義以后使用的教程

    這篇文章主要介紹了Vue3  defineExpose要在方法聲明定義以后使用的教程,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • vue3配置router路由并實現(xiàn)頁面跳轉(zhuǎn)功能

    vue3配置router路由并實現(xiàn)頁面跳轉(zhuǎn)功能

    這篇文章主要介紹了vue3配置router路由并實現(xiàn)頁面跳轉(zhuǎn),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • vue3 與 vue2 優(yōu)點對比匯總

    vue3 與 vue2 優(yōu)點對比匯總

    隨著用vue3 的開發(fā)者越來越多,其必定是又她一定的有帶你,接下來這篇文章小編就為大家介紹vue3 對比 vue2 有什么優(yōu)點?感興趣的小伙伴請跟小編一起閱讀下文吧
    2021-09-09
  • vue2中使用less簡易教程

    vue2中使用less簡易教程

    這篇文章主要介紹了vue2中使用less簡易教程,由于不需要手動配置webpack,所以vue中使用less是非常簡單的,只需要安裝less,less-loadder就ok了
    2018-03-03
  • 詳解Vue路由History mode模式中頁面無法渲染的原因及解決

    詳解Vue路由History mode模式中頁面無法渲染的原因及解決

    這篇文章主要介紹了詳解Vue路由History mode模式中頁面無法渲染的原因及解決,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • 關(guān)于vue?src路徑動態(tài)拼接的小知識

    關(guān)于vue?src路徑動態(tài)拼接的小知識

    這篇文章主要介紹了vue?src路徑動態(tài)拼接的小知識,具有很好的參考價值,希望對大家有所幫助。
    2022-04-04
  • el-form-renderer使用教程

    el-form-renderer使用教程

    本文主要介紹了el-form-renderer使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評論