記錄--vue3中的ref,toRef,toRefs

来源:https://www.cnblogs.com/smileZAZ/archive/2022/06/22/16399630.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. ref的使用 ref 接受一個原始值,返回一個具有響應式的對象,對象有一個value屬性,其值就是所傳遞的原始值。 ref是做的一個拷貝關係,修改對象msg的值,不會影響對象obj,視圖會發生變化。 import { ref } f ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

1. ref的使用

  ref 接受一個原始值,返回一個具有響應式的對象,對象有一個value屬性,其值就是所傳遞的原始值。

  ref是做的一個拷貝關係,修改對象msg的值,不會影響對象obj,視圖會發生變化。

    import { ref } from "vue";
    let obj = { name: "你好", age: 16 };
    let msg = ref(obj.name);
    console.log(msg.value); // 你好
    let arr = ref([]) // ref 可以是任何類型 也可以是對象
    function change1() {
      msg.value = "世界"; 
      //修改msg1數據的時候必須要加 .value 渲染數據的時候就不用加了
      console.log(obj, msg.value);
      // {name: "你好", age: 16} '世界' 
      // 數據此時沒改變 但是頁面的數據改變了
      
    }
    change1();
 
     return {
        obj,
        msg,
     };

如果給dom上加ref 就是當前的dom元素

<template>
  <div class="home-new">  
      <div ref="target">
       
      </div>
  </div>
</template>
import {ref} from 'vue'
export default {
  name: "HomeNew",
  setup(p, { emit }) {
    const target = ref(null);
    // 懶載入
    console.log(target);
    return {
      target,
    };
  },
 
};

2. toRef的使用

 toRef用來給抽離響應式對象中的某一個屬性,並把該屬性包裹成ref對象,使其和原對象產生鏈接

 toRef是做的一種引用關係,修改msg2的值,會影響對象msg,但視圖不會發生變化

    setup(){
    	let msg = { name: 'zs', age: 16 }
        let msg2 = toRef(msg, 'name')
        console.log(msg2.value)	// zs
        function change2() {
            msg2.value = 'ww'
            console.log(msg, msg2.value) // {name: "ww", age: 16} ww
            //此時 msg.ww 數據變了 但是視圖上的是不會變的
        }
        change2()
        return { msg2,change2 }
    }

3. toRefs的使用

toRefs用來把響應式對象轉換成普通對象,把對象中的每一個屬性,包裹成ref對象

toRefs就是toRef的升級版,只是toRefs是把響應式對象進行轉換,其餘的特性和toRef無二

setup(){
    let msg = { name: 'zs', age: 16 }
    let msg3 = toRefs(msg)
    console.log(msg) // { name:ref, age:ref }  ref代指ref對象
    function change3() {
      msg3.name.value = 'zl'
      msg3.age.value = 20
      console.log(msg, msg3) // {name: "zl", age: 20} { name:ref, age:ref }
    }
    change3()
    return { msg3, change3 }
}

請求過來的數據封裝了一下

<script>
import { reactive, toRefs } from "vue";
import { getBanner } from "@/api";
export default {
  setup() {
    return {
      ...toRefs(getBan()),
    };
  },
};
function getBan() {
  let bannerList = reactive({
    list: [],// 模板中直接 寫入 list 就可以了
  });
  getBanner().then((res) => {
    bannerList.list = res.data;
    console.log(bannerList.list);
  });
  return bannerList;
}
</script>

這樣寫模板中直接寫入 {{ list }}  就可以了 , 不用 {{ obj.list }},修改數據的時候還是 obj.list = 'aaa' 

  import { reactive, toRefs } from "vue";
  setup() {
    let obj = reactive({
      list: [],
      newS: [],
      moods: [],
    });
 
    return { ...toRefs(obj) };
  },

4.總結

ref、toRef、toRefs 都可以將某個對象中的屬性變成響應式數據

ref的本質是拷貝,修改響應式數據,不會影響到原始數據,視圖會更新

toRef、toRefs的本質是引用,修改響應式數據,會影響到原始數據,視圖不會更新

toRef 一次僅能設置一個數據,接收兩個參數,第一個參數是哪個對象,第二個參數是對象的哪個屬性

toRefs接收一個對象作為參數,它會遍歷對象身上的所有屬性,然後挨個調用toRef執行

本文轉載於:

https://blog.csdn.net/qq_54753561/article/details/121351993

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天繼續是對後臺管理部分的一個操作,但是快要結束了,今天結束,明天會進入一個從Vue以來,另外一個名聲顯著的東西了,一隻耳聞從未見識,而且十分的炫酷 他就是 數據可視化Echarts,迫不及待瞭解了 11.銷售屬性添加 當我們點擊添加就,應該把添加的放到table裡面來,table裡面每一行數據是一 ...
  • JavaScript 介紹 Javascript 語言誕生主要是完成頁面的數據驗證。因此它運行在客戶端,需要運行瀏覽器來解析執行 JavaScript 代碼。 JS 是 Netscape 網景公司的產品,最早取名為 LiveScript;為了吸引更多 java 程式員。更名為 JavaScript。 ...
  • watch是監聽某個變數或者屬性的變化,並執行相應的回調函數,通常是一個變數的變化決定多個變數的變化,watch可以進行非同步操作,但不支持緩存。一個偵聽器對應一條數據,當偵聽的數據發生變化是,watch才會執行對應的方法(一對一) computed計算屬性是依賴已有的變數來計算一個目標變數,大多數情 ...
  • 1、所謂數據響應式就是能夠使數據變化可以被檢測並對這種變化做出響應的機制。 2、MVVM框架要解決的一個核心問題是連接數據層和視圖層,通過數據驅動應用,數據變化,視圖更新,要做到這點的就需要對數據做響應式處理,這樣一旦數據發生變化就可以立即做出更新處理。 3、以vue為例說明,通過數據響應式加上虛擬 ...
  • 路由懶載入:有效拆分App尺寸,訪問時才非同步載入 keep-alive組件緩存:避免重覆創建組件實例,且能保留緩存組件狀態 使用v-show復用DOM:避免重覆創建組件 v-for遍歷避免同時使用v-if 長列表性能優化:如果是大數據長列表,可採用虛擬滾動(不會將所有內容渲染,只是把可是區域渲染), ...
  • 泛型 指在定義函數、介面或類的時候,不預先指定具體的類型,而在使用的時候再指定具體類型的一種特性。 引入 下麵創建一個函數, 實現功能: 根據指定的數量 count 和數據 value , 創建一個包含 count 個 value 的數組 不用泛型的話,這個函數可能是下麵這樣: function c ...
  • 前言 : 組件系統是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可復用的小組件來構建大型應用,任意類型的應用界面都可以抽象為一個組件樹。 現在基於vue的UI組件庫有很多,比如iview,element-ui等。但有時候這些組件庫滿足不了我們的開發需求,這時候我們就需要自己寫 ...
  • Vue 3.x基礎 模版 <template> // html </template> <script setup> // setup API // ... </script> <style> // css </style> setup API 變數(響應式) // 基本數據類型 let refVa ...
一周排行
    -Advertisement-
    Play Games
  • 什麼是工廠模式 工廠模式是最常用的設計模式之一,屬於創建型模式。 有點: 解耦,可以把對象的創建和過程分開 減少代碼量,易於維護 什麼時候用? 當一個抽象類有多個實現的時候,需要多次實例化的時候,就要考慮使用工廠模式。 比如:登錄的抽象類ILoginBusiness,它有2個實現,一個用用戶名密碼登 ...
  • 這次iNeuOS升級主要升級圖形渲染引擎和增加豐富的圖元信息,可以很快的方案應用。總共增加41個通用和行業領域的圖元應用,增加2154個圖元信息,現在iNeuOS視圖建模功能模塊總共包括5894個行業圖元信息。現在完全支持製作高保真的工藝流程和大屏展示效果。 ...
  • 效果圖先附上: 首先 這是我是參考 教程:使用 SignalR 2 和 MVC 5 實時聊天 | Microsoft Docs 先附上教程: 在“添加新項 - SignalRChat”中,選擇 InstalledVisual> C#>WebSignalR>,然後選擇 SignalR Hub 類 (v ...
  • 一、前言 項目中之前涉及到胎兒心率圖曲線的繪製,最近項目中還需要添加心電曲線和血樣曲線的繪製功能。今天就來分享一下心電曲線的繪製方式; 二、正文 1、胎兒心率曲線的繪製是通過DrawingVisual來實現的,這裡的心電曲線我也是採用差不多相同的方式來實現的,只是兩者曲線的數據有所區別。心電圖的數據 ...
  • 安裝 Redis # 首先安裝依賴gcc, 後面需要使用make編譯redis yum install gcc -y # 進入 /usr/local/src 目錄, 把源碼下載到這裡 cd /usr/local/src # 下載 redis 7.0.2 的源碼,github被牆,可以使用國內的地址 ...
  • Redis 的定義? 百度百科: Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 中文官網: Redis是一個開源(BSD許可),記憶體存 ...
  • 事情的起因是收到了一位網友的請求,他的java課設需要設計實現迷宮相關的程式——如標題概括。 我這邊不方便透露相關信息,就只把任務要求寫出來。 演示視頻指路👉: 基於JavaFX圖形界面的迷宮程式演示_嗶哩嗶哩_bilibili 完整代碼鏈接🔎: 網盤:https://pan.baidu.com ...
  • Python中的字典 Python中的字典是另一種可變容器模型,且可存儲任意類型對象。鍵值使用冒號分割,你可以看成是一串json。 常用方法 獲取字典中的值 dict[key] 如果key不存在會報錯,建議使用dict.get(key),不存在返回None 修改和新建字典值 dict[key]=va ...
  • 迎面走來了你的面試官,身穿格子衫,挺著啤酒肚,髮際線嚴重後移的中年男子。 手拿泡著枸杞的保溫杯,胳膊夾著MacBook,MacBook上還貼著公司標語:“加班使我快樂”。 面試官: 看你簡歷上用過MySQL,問你幾個簡單的問題吧。什麼是聚簇索引和非聚簇索引? 這個問題難不住我啊。來之前我看一下一燈M ...
  • tunm二進位協議在python上的實現 tunm是一種對標JSON的二進位協議, 支持JSON的所有類型的動態組合 支持的數據類型 基本支持的類型 "u8", "i8", "u16", "i16", "u32", "i32", "u64", "i64", "varint", "float", "s ...