亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue3.0 Reactive數據更新頁面沒有刷新怎么解決

發布時間:2023-04-19 17:31:29 來源:億速云 閱讀:531 作者:iii 欄目:開發技術

這篇文章主要介紹了vue3.0 Reactive數據更新頁面沒有刷新怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇vue3.0 Reactive數據更新頁面沒有刷新怎么解決文章都會有所收獲,下面我們一起來看看吧。

    vue3.0 Reactive數據更新頁面沒有刷新

    vue 3.0 ref 和 Reactive 數據響應式,以及使用 Reactive 數據已更新但頁面沒有同步刷新異常

    Vue 3.0 中我們使用 reactive() 定義的響應式數據的時候,當我們對象再次賦值,我們發現數據已經修改成功,但是頁?并沒有自動渲染成最新的數據;

    這時我們可以改成 ref () 或者對 reactive() 綁定的數據類型下點功夫;

    • ref()

    ref() 接受一個內部值并返回一個響應式且可變的 ref 對象。ref 對象僅有一個 .value property,指向該內部值

    <template>
      <div>
        <button @click="changeMsg">更改數據</button>
        <div>{{ message }}</div>
      </div>
    </template>
    
    <script setup lang="ts">
    import {ref} from 'vue'
    
    /**
     *   ref() 基礎用法
     */
     
    let message = ref<string | number>("測試數據")
    
    /**
     *   更改 ref 數據
     */
      
    const changeMsg = () => {
       message.value = "更改測試數據"
    }
    </script>
    • reactive()

    reactive() 主要時用來綁定一些復雜的數據類型,比如(對象、數組) ;它不可以綁定普通的數據類型,否則會報錯;如果我們需要綁定普通的數據類型,建議使用上面的 ref()

    <template>
      <div>
        <button @click="changeObj">更改數據</button>
        <div> {{obj.data}} </div>
        <div> {{obj.dataBoolean}} </div>
        <div> {{obj.dataArr}} </div>
      </div>
    </template>
    
    <script setup lang="ts">
    import {reactive} from 'vue'
    
    /**
     *   reactive() 基礎用法
     */
     
    const obj = reactive({
        data: '',
        dataBoolean: false,
        dataArr: <number[]>[],
    })
    
    /**
     *   更改 reactive() 數據
     */
     const changeObj = () => {
         obj .data = '測試數據'
         obj .dataBoolean = true
         obj .dataArr = [1, 2, 3, 4, 5, 6]
     }
    
    </script>

    vue3.0中的reactive用法

    reactive 是 Vue3 中提供的實現響應式數據的方法。

    在 Vue2 中響應式數據是通過 defineProperty 來實現的,

    在 Vue3 中響應式數據是通過 ES6 的 Proxy來實現的。

    reactive 參數必須是對象 (json / arr)

    如果給 reactive 傳遞了其它對象

    • 默認情況下,修改對象無法實現界面的數據綁定更新。

    • 如果需要更新,需要進行重新賦值。(即不允許直接操作數據,需要放個新的數據來替代原數據)

    在 reactive 使用基本類型參數

    基本類型(數字、字符串、布爾值)在 reactive 中無法被創建成 proxy 對象,也就無法實現監聽。

    <template>
    <div>
      <p>{{msg}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive(0)
        function c() {
          console.log(msg);
          msg ++;
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    點擊 button ,我們期望的結果是數字從 0 變成 1,然而實際上界面上的數字并沒有發生任何改變。

    查看控制臺,它的輸出是這樣的(我點了 3 次)

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    出現提示

    value cannot be made reactive: 0

    而輸出的值確實發生了變化,只不過這種變化并沒有反饋到界面上,也就是說并沒有實現雙向數據綁定。當然,如果是 ref 的話,就不存在這樣的問題。而如果要使用 reactive ,我們需要將參數從 基本類型 轉化為 對象。

    <template>
    <div>
      <p>{{msg.num}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive({
          num: 0
        })
        function c() {
          console.log(msg);
          msg.num ++;
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    將參數替換成了對象 {num: 0},此時,點擊按鈕界面就會產生改變(我點了 3 次)。

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    在控制臺打印消息

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    可以看到,msg 成功被創建成了 proxy 對象,他通過劫持對象的 getset 方法實現了對象的雙向數據綁定。

    深層的、對象內部的變化也能被察覺到(注意下面代碼中的 inner )

    <template>
    <div>
      <p>{{msg.num.inner}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive({
          num: {
            inner: 0
          }
        })
        function c() {
          console.log(msg);
          msg.num.inner ++;
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    數組變化也不在話下。

    <template>
    <div>
      <p>{{msg}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive([1, 2, 3])
        function c() {
          console.log(msg);
          msg[0] += 1;
          msg[1] = 5;
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    在-reactive-使用-date-參數在 reactive 使用 Date 參數

    如果參數不是數組、對象,而是稍微奇怪一點的數據類型,例如說 Date ,那么麻煩又來了。

    <template>
    <div>
      <p>{{msg}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive(new Date())
        function c() {
          console.log(msg);
          msg.setDate(msg.getDate() + 1);
          console.log(msg);
        }
        return {
          msg,
          c
        };
      }
    }
    </script>!

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    這里我先打印了 msg 兩次,可以看到,點擊一次 button ,msg 的數據是存在變化的,但界面并未發生變化,同時我們發現在控制臺里,msg 并未被識別成 proxy

    就算我們把 Date 放在對象里,就像這樣

    <template>
    <div>
      <p>{{msg.date}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive({
          date: new Date()
        });
        function c() {
          console.log(msg);
          msg.date.setDate(msg.date.getDate() + 1);
          console.log(msg);
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    也仍然不起效果。

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    顯然,對于這種數據類型,我們需要做特殊處理。

    這個特殊處理就是重新賦值(,而不是直接修改原來的值)。

    <template>
    <div>
      <p>{{msg.date}}</p>
      <button @click="c">button</button>
    </div>
    </template>
     
    <script>
    import { reactive } from 'vue'
    export default {
      name: 'App',
      setup() {
        let msg = reactive({
          date: new Date()
        });
        function c() {
          console.log(msg);
          msg.date.setDate((msg.date.getDate() + 1));
          msg.date = new Date(msg.date);
          console.log(msg);
        }
        return {
          msg,
          c
        };
      }
    }
    </script>

    這里我采用了拷貝的方案重新賦值了 msg.date,界面成功發生了變化(日期 + 1)。

    vue3.0 Reactive數據更新頁面沒有刷新怎么解決

    響應式代理 vs. 原始對象

    值得注意的是,reactive() 返回的是一個源對象的 Proxy,它和源對象是不相等的:

    const raw = {}
    const proxy = reactive(raw)
     
    // 代理和原始對象不是全等的
    console.log(proxy === raw) // false

    只有代理是響應式的,更改原始的對象不會觸發更新。因此,使用 Vue 的響應式系統的最佳實踐是 僅使用代理作為狀態

    為保證訪問代理的一致性,對同一個對象調用 reactive() 會總是返回同樣的代理,而對代理調用 reactive() 則會返回它自己:

    // 在同一個對象上調用 reactive() 會返回相同的代理
    console.log(reactive(raw) === proxy) // true
     
    // 在一個代理上調用 reactive() 會返回它自己
    console.log(reactive(proxy) === proxy) // true

    這個規則對深層級的對象也適用。依靠深層響應性,響應式對象內的深層級對象依然是代理:

    const proxy = reactive({})
     
    const raw = {}
    proxy.nested = raw
     
    console.log(proxy.nested === raw) // false

    關于“vue3.0 Reactive數據更新頁面沒有刷新怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“vue3.0 Reactive數據更新頁面沒有刷新怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    明水县| 米泉市| 南平市| 涞源县| 郎溪县| 本溪市| 彩票| 无极县| 江孜县| 周至县| 佛冈县| 沅江市| 启东市| 浪卡子县| 富宁县| 安仁县| 柳林县| 清远市| 杭锦旗| 金溪县| 吉隆县| 屏东市| 定南县| 新津县| 承德县| 巴彦淖尔市| 清水县| 通州区| 绥中县| 灵丘县| 定襄县| 沁源县| 保亭| 汉阴县| 石泉县| 宁陵县| 泰兴市| 米脂县| 怀化市| 历史| 信阳市|