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、計算屬性中不能引用其他計算屬性?
官方教程中沒有找到相關說明(應該是我沒找到),從使用角度而言大致可以總結出以下結論:
- 計算屬性必須引用(依賴)非計算屬性或固定值。(見demo1)
- 計算屬性若引用(依賴)其他計算屬性,則被引用的計算屬性必須引用非計算屬性或固定值(見demo2)
- 計算屬性可迴圈依賴,但最終依賴鏈上的最上游的計算屬性,必須引用非計算屬性或固定值。
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為空陣列
觸發這個問題有以下幾個前提:
- vue版本為2.0版本,1.0無此問題。
- 使用元件巢狀,在父元件的模板中訪問
$children
變數 - 在渲染完成後沒有再將
$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個問題。
觸發此問題的前提:
- vue2.0版本
- 父元件和子元件都直接寫在呼叫方模板中
- 在模板中訪問
$children
變數 - 已經解決在上述問題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 節