1. 程式人生 > >Vue學習筆記-2

Vue學習筆記-2

前言

本文非vue教程,僅為學習vue過程中的個人理解與筆記,有說的不正確的地方歡迎指正討論

1、computed計算屬性函式中不能使用vm變數

在計算屬性的函式中,不能使用Vue建構函式返回的vm變數,因為此時vm還未返回,依然處於Vue內部建構函式過程中,遂只能使用this來代替vm。
若要使用typescript,可使用以下方法來實現程式碼智慧感知

vm = vm || this;

另:其他不能用vm變數,只能使用this變數的地方,都可以通過此方法來獲得Typescript的智慧感知和程式碼語法檢查,比如mounted生命週期系列函式等。
不過模板裡的vm引用Typescript無能為力,只能等待ts支援vue的jsx語法了╮(╯_╰)╭

2、計算屬性中不能引用其他計算屬性?

官方教程中沒有找到相關說明(應該是我沒找到),從使用角度而言大致可以總結出以下結論:

  1. 計算屬性必須引用(依賴)非計算屬性或固定值。(見demo1)
  2. 計算屬性若引用(依賴)其他計算屬性,則被引用的計算屬性必須引用非計算屬性或固定值(見demo2)
  3. 計算屬性可迴圈依賴,但最終依賴鏈上的最上游的計算屬性,必須引用非計算屬性或固定值。

DEMO1:官方標準用法,計算屬性引用非計算屬性:

var vm = new Vue({
    el: "#app",
    data: {
        dataVal: "xxcanghai"
    },
    computed: {
        computedVal1: function () {
            //標準用法,計算屬性引用非計算屬性
            return this.dataVal + "_1";//輸出 xxcanghai_1
        }
    }
});

DEMO2:計算屬性鏈式依賴其他計算屬性,則依賴鏈頭必須引用非計算屬性或固定值

var vm = new Vue({
    el: "#app",
    data: {
        dataVal: "xxcanghai"
    },
    computed: {
        computedVal1: function () {
            return this.dataVal + "_1";
        },
        computedVal2: function () {
            //合法,計算屬性computedVal2引用computedVal1,computedVal1再引用dataVal
            return this.computedVal1 + "_2";//輸出 xxcanghai_1_2
        }
    }
});

原因很容易理解,如果最終沒有引用或依賴任何非計算屬性,那麼計算屬性在計算時會陷入死迴圈

3、vue2.0中若使用元件巢狀,則在父元件執行$forceUpdate()之前模板中$children為空陣列

觸發這個問題有以下幾個前提:

  1. vue版本為2.0版本,1.0無此問題。
  2. 使用元件巢狀,在父元件的模板中訪問$children變數
  3. 在渲染完成後沒有再將$children變數寫入過父元件的data變數(或其他vm資料)
    就會觸發此問題。
<!--父元件HTML模板-->
<div id="app">
   <div>{{$children.length}}</div> <!--此處顯示0,應該為3-->
   <child></child>
   <child></child>
   <child></child>
</div>

//子元件程式碼
Vue.component("child", {
    template: "<div>child</div>",
});

//父元件宣告
new Vue({
    el: "#app",
});

如下圖:

解決方案1:使用$forceUpdate()

註冊父元件的mounted方法,執行$forceUpdate()

<div id="app">
   <div>{{$children.length}}</div>
   <child></child>
   <child></child>
   <child></child>
</div>

Vue.component("child", {
    template: "<div>child</div>",
});

new Vue({
    el: "#app",
    mounted: function () {
        this.$forceUpdate();//強制重新繪製
    }
});

$children正確了:

解決方案2:使用vm的變數代替$children

註冊父元件的mounted方法,將$children賦值給自定義的vm的變數。
同時模板中使用自定義的變數來代替預設的$children

<div id="app">
   <div>{{child.length}}</div> <!--使用自定義的child物件-->
   <child></child>
   <child></child>
   <child></child>
</div>

Vue.component("child", {
    template: "<div>child</div>",
});

var vm = new Vue({
    el: "#app",
    data: {
        child: []
    },
    mounted: function () {
        this.child = this.$children;//手動將$children物件賦值給自定義child變數
    }
});

至於導致此問題的原因只能通過閱讀vue2.0版本的原始碼才能瞭解了。

4、若父元件的template或render函式中無引用slot元素,則$children恆等於空陣列

此問題關聯上面第3個問題。
觸發此問題的前提:

  1. vue2.0版本
  2. 父元件和子元件都直接寫在呼叫方模板中
  3. 在模板中訪問$children變數
  4. 已經解決在上述問題3中強制重新整理的問題

復現程式碼:

<div id="app">
    <!--子元件直接寫在呼叫方的模板中-->
   <parent>
       <child></child>
       <child></child>
       <child></child>
   </parent>
</div>

//父元件
Vue.component("parent", {
    template: "<p>parent child:{{$children.length}} </p>",//模板中無slot元素
    mounted(){
        this.$forceUpdate();
    }
});
Vue.component("child", {
    template: "<div>child</div>"
});

var vm = new Vue({
    el: "#app"
});

解決方案1:父元件模板包含slot元素

在父元件的模板中加入slot元素。或在render函式中引用了this.$slots.default變數

Vue.component("parent", {
    template: "<p>parent child:{{$children.length}} <slot></slot></p>",
    mounted(){
        this.$forceUpdate();
    }
});

解決方案2:在父元件模板中編寫子元件定義

此解決方案要修改此問題的復現第2要素,即子元件定義從呼叫方改為寫到父元件的模板中也可解決此問題。

<div id="app">
   <parent>
   </parent>
</div>

Vue.component("parent", {
    //直接在父元件中寫明呼叫子元件標籤
    template: "<p>parent child:{{$children.length}}\
                   <child></child>\
                   <child></child>\
              </p>",
    mounted(){
        this.$forceUpdate();
    }
});
Vue.component("child", {
    template: "<div>child</div>",
});

var vm = new Vue({
    el: "#app",
    data: {
        child: []
    }
});

此方法雖然可以解決問題,但是有時我們直接把子元件寫在呼叫方會更方便更利於理解,比如Tab與TabPage元件。
如下Tab元件程式碼,可能更符合一般人的使用思維:

<div id="app">
   <tab>
       <tab-page>Page1</tab-page>
       <tab-page>Page2</tab-page>
       <tab-page>Page3</tab-page>
   </tab>
</div>

相關筆記

相關推薦

Vue學習筆記2———條件語句

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <script src="js/Vue.j

Vue學習筆記-2

前言 本文非vue教程,僅為學習vue過程中的個人理解與筆記,有說的不正確的地方歡迎指正討論 1、computed計算屬性函式中不能使用vm變數 在計算屬性的函式中,不能使用Vue建構函式返回的vm變數,因為此時vm還未返回,依然處於Vue內部建構函式過程中,遂只能使用this來代替vm。 若要使用types

vue技術棧開發實戰--學習筆記2

2路由基礎 <router-link> <a> <router-view/> 渲染元件 路由物件 path component/components children:[ {子集} ] name 命名 :to="{ name: 'about

Vue學習筆記3.2-生命週期函式(順帶記錄Vue的例項的生命週期)

Vue生命週期函式有beforeCreate、created、beforeMount、Mounted、beforeUpdate、updated、beforeDestroy、destroyed、activated、deactivated、errorCaptured。共11個。本文直說前8個,另外3

vue學習筆記2

這次是比較麻煩的幾個指令。v-on指令<button v-on:click="doThis"></button>可縮寫為<button @click="doThis"></button>click後的方法名與methods的方法

學習筆記2

建議 coo line 長度 cape 發展 div+css 加載 不兼容 雙標簽: <html><head><title><body><table><tr><td><span>

Jmeter學習筆記2-原件作用域與執行順序

校驗 height sse proc tro 有效 收集 技術分享 控制 1.元件的作用域 (1)配置元件(config elements):會影響其作用範圍內的所有元件。 (2)前置處理程序(per-processors):在其作用範圍內的每一個sampler元件之

python學習筆記2:字符串

nbsp 大小 alpha .com format 大小寫 fin 判斷大小 key python學習筆記2:字符串 總結:字符串是不可變變量,不能通過下標修改其值    字符串的方法都不會改變字符串原來的值,而是新生成一個字符串 一、3種寫法——單引號,雙引號,三引號  

java 學習筆記2 面向對象(上)

awr ges abs nal mage 有效 面向對象 ima col 類和對象 類是某一批對象的抽象,可以把類理解成某種概念。對象是一個具體存在的實體。類和對象是面向對象的核心。 類定義的是多個實例的特征,類不是具體存在,實例才是具體存在。 定義類(class)的語法:

Git學習筆記2——Git版本庫的創建

文件添加 不但 提交 linu 記錄 例子 blog 所有 out 創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄: $ cd s: $ cd Git_Learing $ pwd s/Git_Learning pwd命令用於顯示當前目錄。在我的wind

Hadoop 學習筆記 (2) -- 關於MapReduce

規模 pre 分析 bsp 學習筆記 reduce 數據中心 階段 圖例 1. MapReduce 定義: 是一種可用於數據處理的編程的模型 優勢: MapReduce 本質上是並行運行的,因此可以將大規模的數據分析任務,分發給任何一個擁有足夠多機器

算法導論學習筆記(2)-歸並排序

mar 今天 iostream 介紹 font 額外 遞歸 size dsm 今天學習了算法導論上的歸並排序算法,而且完畢了在紙上寫出偽代碼,曾經就學過歸並可是理解的不夠透徹。以 前還一直困惑:為什麽明明歸並排序比快排的時間復雜度更穩定。為什麽庫函數不用歸

ESP8266學習筆記2:實現ESP8266的局域網內通信

pro reg sad net nts 理解 模式 curl ont 上一篇熟悉了編譯下載操作。如今就以實例入手。project使用的是IOT_DEMO,據DEMO文檔能夠知道ESP8266初始工作模式為softAP+station共存的模式。於是這邊我們就先以soft

(MYSQL學習筆記2)多表連接查詢

mysql3種連接方式的區別:INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關系的記錄。LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。3個表連接查詢

JavaSE中Collection集合框架學習筆記(2)——拒絕重復內容的Set和支持隊列操作的Queue

%d eof 是否 face 出錯 can 3.2 lean als 前言:俗話說“金三銀四銅五”,不知道我要在這段時間找工作會不會很艱難。不管了,工作三年之後就當給自己放個暑假。 面試當中Collection(集合)是基礎重點.我在網上看了

Vue學習筆記入門篇——組件的內容分發(slot)

節點 pan 如何 new 深入 接收 span 初始 特殊屬性 本文為轉載,原文:Vue學習筆記入門篇——組件的內容分發(slot) 介紹 為了讓組件可以組合,我們需要一種方式來混合父組件的內容與子組件自己的模板。這個過程被稱為 內容分發 (或 “transclus

Linux學習筆記2-安裝遠程連接客戶端SecureCRT

下載 linux log 學習 文件 spa 客戶端 pre 百度下載 1、百度下載SecureCRT8.0版本 2、安裝,破解 3、百度使用教程,使用SecureCRT連接Linux系統,並操作 4、安裝rzsz,(這樣就能直接把文件復制到Linux系統裏了) yum

Vue學習筆記進階篇——多元素及多組件過渡

之前 bsp lan ssa 當前 好的 can cancel 簽名 本文為轉載,原文:Vue學習筆記進階篇——多元素及多組件過渡 多元素的過渡 對於原生標簽可以使用 v-if/v-else.但是有一點需要註意: 當有相同標簽名的元素切換時,需要通過 key 特性設置唯一

Vue學習筆記進階篇——Render函數

resp targe 無效 數據 iso 簡潔 如果 som cimage 本文為轉載,原文:Vue學習筆記進階篇——Render函數 基礎 Vue 推薦在絕大多數情況下使用 template 來創建你的 HTML。然而在一些場景中,你真的需要 JavaScript 的完全

Vue學習筆記進階篇——過渡狀態

節點 val start 學習筆記 update 設置 hub reat res 本文為轉載,原文:Vue學習筆記進階篇——過渡狀態Vue 的過渡系統提供了非常多簡單的方法設置進入、離開和列表的動效。那麽對於數據元素本身的動效呢,比如: 數字和運算 顏色的顯示 SVG 節