1. 程式人生 > >Vue中你可能認為是bug的情況原來是這樣的

Vue中你可能認為是bug的情況原來是這樣的

前言

我們知道Vue框架劇本雙向資料繫結功能,在我們使用方便的同時,還有一些細節問題我們並不知道,接下來一起探討一些吧

雙向資料繫結

  • js變數改變影響頁面
  • 頁面改變影響js變數

Vue2是如何做到資料繫結的

Object.defineProperty(obj,key,{
                set:function (newV) {
                    val = newV;
                    // 通知所有用到這個屬性的DOM更新
                    dep.notifyAll();
                },
                get:function () {
                    if (Dep.currentSub) {
                         // 對這個屬性,新訂閱一個元素
                        dep.subscribe(); 
                    }
                    return val;
                }
            });
  • 以上需要說的就是: Vue中data函式返回的物件,會經過層層遍歷,最後將所有的物件通過以上方法,把其屬性進行監視。
    • 通過xxx.xxx = 'xxx' 就會觸發set函式
    • 通過xxx.xxx 就會觸發get函式

關於陣列與基本資料型別的奇葩現象

我們宣告好陣列,其中放置基本資料型別

 let vm = new Vue({
        el:'#app',
        template:`
        <div>
          <p v-for="n in arr" >
            {{n}}
          </p>
        </div>`,
        data(){
          return {
            arr:[1,2,3]
          }
        }
    });

現在我們改變其中的元素值

  • 如圖所見,我們改變陣列中某個元素的值,並未發現頁面改變

解答疑問

  • 首先我們知道作為data的屬性,Vue都會通過for in 來遍歷該物件的所有屬性及子屬性,然後針對每個屬性進行reactive式的資料劫持。
  • 但是當遍歷陣列或物件屬性時,如果是非物件資料型別,就如下圖
  • 我們可以看到在Vue中 對於reactive操作,非物件資料型別是不管的,因此,我們更改vm.arr[0] = 98沒有效果

想辦法解決

聽說有個函式可以讓Vue知道你在新增屬性,並完成響應式。Vue.set(obj.key.value);

哇,有效果!!

我們再來改變他看看是否能雙向資料繫結

哦! No!看看原始碼


看到了嗎? 基本(原始)資料型別還給個警告!!


往下執行,如果是陣列直接結束了,並不做reactive操作哦

總結

之前講解了Vue做資料劫持是基於Object.defineProperty的,但是他只能做set和get,而無法監視到屬性的增加或者減少,這點倒是可以用Vue.set(obj.key.value)解決!而陣列+基本資料型別不行! 當然話說回來,真實業務中,直接用陣列操作基本資料型別的場景還真不多!

相關推薦

Vue可能認為bug情況原來這樣

前言 我們知道Vue框架劇本雙向資料繫結功能,在我們使用方便的同時,還有一些細節問題我們並不知道,接下來一起探討一些吧 雙向資料繫結 js變數改變影響頁面 頁面改變影響js變數 Vue2是如何做到資料繫結的 Object.defineProperty(obj,key,{ s

Vue 實際項目可能會遇見的坑

只需要 lint .com tro 生產 首次加載 int on() 格式   紙上得來終覺淺,絕知此事要躬行!   Vue的文檔和教程看的太多,小的demo做的多,也不如自己實際的進行一個完整項目的開發。只有做了才知道原來問題這麽多,這裏列舉了一些你做demo教程可能不會

RestTemplate使用過程可能需要注意的點

RestTemplate在get請求設定引數時,url中後跟的引數一定不要是encode之後的param值,因為他會再次encode 一個url可以多次encode,每次結果不一 附上:原生jack

Spring可能不知道的事(二)

sele 說明 打了 getclass ins 中文翻譯 寫法 學習 import 在上一節中,我介紹了Spring中極為重要的BeanPostProcessor BeanFactoryPostProcessor Import ImportSelector,還介紹了一些其他

C語言可能會用到的字符串函數的代碼

!= else if 長度 int turn return 可能 代碼 str 將寫內容過程中比較常用的內容段做個備份,下面資料是關於C語言中你可能會用到的字符串函數的內容。 { if(dest == src) return

Yii2可能忽略但很有用的兩個方法batch&each

我們的資料庫常常都是很龐大的,一次查詢的結果集也很大,這樣很浪費記憶體,為了降低記憶體的使用率,我們可以使用yii2的bat

vue的axios.post使用json數據傳輸,出現請求頭字段內容類型是不被允許的情況的解決方案

字段 pan PE acc lin 方案 配置 json數據 style 問題描述: 由於restful接口需要在頭部header傳遞兩個字段: Content-Type: application/jsonAccess-Token: 84c6635800b14e0eba

vue使用baidushare分享到微信無法顯示bug解決方案

解決 需要 基礎知識 才會 微信 在線 項目 fig 二維 最近vue單頁面項目中有個頁面分享的功能需求,按以往經驗,選擇了百度開源的baidushare.js 經過一天的掙紮,終於弄清楚了分享到微信後無法顯示的原因。 對比分析:   以往成功使用:另寫了一個專門的分

解決幾個vue是swiper插件遇到的bug

created ini 情況 node bug ack ets bpa ner 1、在使用swiper插件的時候,如果內容都是靜態資源的話不會出現錯誤,但是動態的話會出現劃不動,或者白屏 分析:這種bug是怎樣出現的,一般都是初始化的位置不對 方法: swiperInit

墨菲定律:當覺得一個地方可能bug,那麼這個地方就會有bug----順帶了解下Tomcat那少有人注意的localhost.log tomcat日誌 之 catalina.log & localhost.log

一、問題概述 題目有點長,但應該值得後端java們瞭解下有點小坑的localhost.log,讓我長話短說。 博主是搞java後端的。後臺是很簡單的spring mvc + spring框架。 今天測試一個Controller層的介面,但是斷點一直進不來。 我做的改動也不大,新增了mqMsgFacto

墨菲定律:當覺得一個地方可能bug,那麽這個地方就會有bug----順帶了解下Tomcat那少有人註意的localhost.log

col 紅色 exceptio str host .cn trac 線程同步 html 一、問題概述 題目有點長,但應該值得後端java們了解下有點小坑的localhost.log,讓我長話短說。 博主是搞java後端的。後臺是很簡單的spring mvc + spri

Vue解決陣列在被清空的情況下,頁面仍會存在快取資料的問題

一,情況描述 1.1 點選完成按鈕 1.2 發現該資料沒有被清空 二,問題所在 2.1 查詢出來的陣列為null 由於使用父子件傳輸的方式進行傳遞資料,因為父元件從介面獲取資料的時候,當獲取到的資料為空,就會變成null。然後將這個

vue技術分享之可能不知道的7個祕密

本文是vue原始碼貢獻值Chris Fritz在公共場合的一場分享,覺得分享裡面有不少東西值得借鑑,雖然有些內容我在工作中也是這麼做的,還是把大神的ppt在這裡翻譯一下,希望給朋友帶來一些幫助。 一、善用watch的immediate屬性 這一點我在專案中也是這麼寫的。例如有請求需要再也沒初

可能需要的一本前端小冊:Vue 專案構建與開發入門

最近抽時間寫了一本關於 Vue 的小冊:《Vue 專案構建與開發入門》,前前後後斷斷續續花了大概兩個月的時間。作為 Vue 的第一批使用者,同時也作為一名專欄作者,雖然我之前寫過好幾篇關於 Vue 的文章,但是該小冊是我第一本系統性介紹 Vue 專案構建與開發相關知識的書籍,也是我對於自己積累的 Vue 經驗

手把手教vue如何使用TradingView

1、去官方倉庫(地址)下載程式碼到本地 2、進到專案資料夾 => 可用node啟動專案 => npm install http-server -g => http-server -p 9090 3、通過index.html檔案,知道以下三個檔案

大資料Hadoopx之HDFS模組那些可能不知道的小知識!

再給大家分享一些小知識,一起來瞧瞧吧! 一、namenode & secondarynamenode    1)namenode啟動(namenode格式化時會建立fsimage,edits兩個檔案,如果不是第一次啟動,會直接載入這兩個檔案到記憶體)。   2)secondary

面試官問:說一個工作有價值的bug

表面看這是一個非常簡單的一個問題,做測試辣麼久,發現的bug無數,隨便從中挑選一個比較“特別”的一個bug說說就可以了啊! 但其實,越是從習以為常的事情中找“特別”越困難,比如,我每天中午都是樓下隨便找一家快餐店吃飯,如果有人問我:說說你印象深刻的一次吃快餐的經歷。除非我哪天吃出了蒼蠅,否則怎麼

vue使用jointjs的方法

本篇文章主要介紹了在vue中使用jointjs的方法,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 首先在vue專案中執行npm install jointjs --save 然後在入口檔案,我的是main.js,也有可能

Vue-Cleave - 在Vue使用CleaveJS格式化的輸入內容

寫於 2016.07.16 專案地址:github.com/jrainlau/vu… What's CleaveJS? CleaveJS是最近github上的一個熱門專案,在短短的一個多月中star數達到了2500+,且保持著強勁的上升勢頭。它的主要目的是 Format in

墨菲定律:當覺得一個地方可能bug,那麼這個地方就會有bug----順帶了解下Tomcat那少有人注意的localhost.log

一、問題概述 題目有點長,但應該值得後端java們瞭解下有點小坑的localhost.log,讓我長話短說。 博主是搞java後端的。後臺是很簡單的spring mvc + spring框架。 今天測試一個Controller層的介面,但是斷點一直進不來。 我做的改動也不大,新增了mqMsgFacto