Vue 注意事項

簡單地來理解Vue,把mvvm什么的都撇開~


0. 大小寫不敏感

由于js和html之間要進行溝通,而vue讀取到的html中定義的變量/函數/方法為小寫,所以請盡量用純小寫/下劃線/連詞符代替。


1. 為什么是new Vue({el:'#myApp'.....})

這是對應網頁中id為myApp的對象

<div id='myApp'.......

而如果網頁中tag的class為myApp要記住靈活運用,把new Vue({el:'#myApp'.....})改為new Vue({el:'.myApp'....."), 易可寫成new Vue({el:'div.myApp'.....")

參考jquery查詢元素方式


2.只能存在一個Vue對象么?

只存在一個vue??蓜摻ǘ鄠€,官方不建議,且在3.x會報錯。


3.設計網頁中的變量怎么實現的數據鏈接呢?

通過網頁中查找{{.*}}特征對象,也是為了兼容瀏覽器的妥協


4.特征值查詢

條件v-if,邏輯v-for,插件,綁定參數v-bind:.*,事件v-on:click 等也都是通過解析網頁達到二次處理的


4.1. 補充 Vue的結構

el
獲取網頁模版對象,可以通過類似jquery方式查詢到,比如<div id='abc' class='xyz'>,那么可以寫成new Vue({el:'#abc'}) 或者 new Vue({el:'.xyz'})或者new Vue({el:'div#abc'}) 或者 new Vue({el:'div.xyz'})。 這些都是靈活的,并非刻板,只要能找到網頁中對應的DOM對象標簽就可以。

_data
傳遞的值(必須小寫),可以是變量定義,數組定義,也可以是字典,靈活運用數據結構,這里data不加s,本身數據就是一個結合。

components
組件群的定義,記住這是個容器。

watch
監控data中對應值的變化。

methods
@click等事件處理

computed
對變量的靈活處理,可以把存取變量分離開來,包括對變量的get/set處理

filters
過濾函數,相當于便捷化的處理函數,在{{}}中就能進行調用,缺點是格式固定,一個變量可進行多個過濾函數處理


5.值的自動變更

當更改變量值時,引用的{{}}對象也會自動變更,這是MVVM機制,簡單來講,{{}}并不只被渲染為固定值,而是將原始結構作為模版,達到刷新替換的效果


6.過濾器 filter

{{}}中可以對值進行過濾,結構是{{變量1,變量2,變量3... | 過濾器1 | 過濾器2 | 過濾器3 ...}},過濾器可以是多個,參數也可以是多個
比如設計器中寫入 {{ "你好, 世界! " , 3 | doChange | doChange2}}
開發代碼中插入過濾器

filters:{
  doChange: function(p1,p2) {
    var p="";
    for(let i=0;i<p2;i++){
      p+=p1;
    }
    return [p,p2];
  },
  doChange2: function(p1) {
    for(let i=0;i<p1[1];i++){
      p1[0] = p1[0].replace('世界', ' 中國' );
    }
    return p1[0];
  }
}

輸出

你好, 中國! 你好, 中國! 你好, 中國!

進入第二個過濾器時無法傳遞多個參數,通過數組方式傳遞進去,這時候如果不傳遞過濾器則只替換了第一個世界,這里只是舉個例子,repace使用RegEx過濾可以進行全局過濾 p1[0] = p1[0].replace(/世界/g, ' 中國' );


7.變量和計算函數重名?

首先會報錯,但不影響運行,運行時優先讀取變量值。


8. 解析{{}}優先級

變量/屬性property > 計算函數computed > 數值/字符串計算 > 過濾器filter(直接被識別為空)
過濾器filter不在優先級中,因為過濾器在|識別符后,直接寫filter是無效的(雖然filter傳參并不會報錯)


9. 觀察和死循環

當進行觀察watch時小心邏輯卡死
寫這樣一個結構

<div id='div'>
<p>{{a}}//{}</p>
<button v-on:click="click1()">按鈕</button>

code:

var div = new Vue({
    el: #div,
    data: {
        a: 1,
        b: 2,
    },
    watch: {
        a: function() {
            this.b++
            console.log(b, this.b);
        },
        b: function() {
            this.a++
            console.log(a, this.a);
        }
    },
}

當a/b任意一個值變動時,網頁會進入假死狀態,其實不用兩個值,只要watch的時候更改自己的值就會導致假死

注意不要在watch中更改屬性變量本身的值


10. 計算Computed的setter和getter

computed:{
    var_b: {
        get: function(){
            //讀變量處理
        },
        set: function(){
            //設置變量處理邏輯
        }
    }
}

11. 箭頭函數 ?

貌似在Vue內部是不能定義箭頭函數的,但是在整個代碼環境下是可以使用箭頭函數的,Vue對象內部可以調用箭頭函數

let output = (str)=>{return console.log(str)}

調用

cCount: {
  get:function () {
    strange(this.count)
    return this.count * 100
  },
  set:function (val) {
    this.count = val/100
  }
}

這里可以成功使用箭頭函數創建的方法


12. 多條件處理 v-if v-else v-elseif

這里我寫了個假枚舉,用來支持開關變量

<div id="div">
<h1 v-if="type==Type.Type_1">類型1</h1>
<h1 v-else-if="type==Type.Type_2">類型2</h1>
<h1 v-else-if="type==Type.Type_3">類型3</h1>
<h1 v-else>類型type={{type}}</h1>
</div>

代碼

var div = new Vue({
    el:'#div',
    data:{
    Type:{
        Type_None:0,
        Type_1:1,
        Type_2:2,
        Type_3:3,
    },
    type:null,
])

div.type = div.Type.Type_2;

條件判斷內不支持位操作符號(|,&,^,~),使用后結果會不正確,|被解析成了過濾器


13. v-model

雙向綁定,相當于增加了對變量屬性的設置功能,強化版的{{}},但他并沒有{{}}靈活。

對象 作用 變量類型
input checkbox 當選中時,將對象的value傳入變量數組 數組變量
input radio 當選中時,將對象的value傳入變量 字符串變量
input text 更改變量,默認值會替換placeholder值 字符串變量
input button 屬性值決定了按鈕上顯示的文字 字符串變量
input image 無效果
input password 更改變量,默認值會替換placeholder值 字符串變量

14. 什么時候需要{{}} ?

當需要在和普通內容混編多時候需要{{}},當在特殊關鍵字下不需要,比如v-if,v-forv-on,v-model,這些關鍵字都明確說明了之后的處理和vue有關,就不需要{{}}了


15.當checkbox和radio遇上v-for

錯誤寫法:

<input v-for="(item, index) in radios" :key="index" name="1" type="radio" v-bind:value="item" v-model="radioxx">{{item}}

這樣的循環無法得到{{item}}值
解決方式

<label v-for="(item, index) in radios" :key="index">
   <input name="1" type="radio" v-bind:value="item" v-model="radioxx">{{item}}
</label>

本身input不包含額外標簽,即便后面跟著item和</>結束符,得到的值也只是input自己在循環,這時候只需要在外嵌套一個不影響排版的標簽就可以令按鈕橫排顯示



16. 組件(component)的內部結構

組件既可以單獨創建,也可以在vue中創建,區別在于直接在對象下創建的組件直接對應字典數據表
Vue.component('組件名稱',{組件結構})
Vue({ compenents:{ '組件名稱':{組件結構} } })
組件結構:

templete
重中之重,一個組件可以沒有props傳參,可以沒有data數據,也可以沒有computed處理,但必須有模版本身的內容。

props
props,數組/字典。
傳遞數組時,可接收的參數格式為 v-bind:變量名='值/其他變量名':變量名='值/其他變量名'格式, 可以傳遞多個變量值。
傳遞字典時,每個key對應的數據結構{ type:數據類型(String/Number/Boolean/Object),default:默認返回處理函數,required:是否必須,validator:驗證函數返回真假},如果數據為Object結構,則變量傳遞不全會丟失數據,而不會傳遞缺省的值.String類型使用key="value"方式傳遞,其他類型使用:key="value"方式傳遞。

data
數據,和Vue直接定義的data不同,這里是需要創建一個返回函數,data:function(){return {data結構} }, 寫起來有些拗。

computed
計算,獲得的變量通過一定方式處理獲得computed:{ name: function(){ return 'abc' } } 或者經過get/set處理。

methods
同vue的methods,事件處理

記住定義的變量名必須為全小寫,如果html結構中進行了大寫操作,在傳遞后會強制轉換為小寫,但Vue的語法又對大小寫敏感,你會拿不到任何值,比如:valFromMajor='value', 那么獲得的變量名為valfrommajor,不寫成小寫會拿不到值。這個問題同樣出現在Vue的data定義中。需要綁定的數據鏈必須是在html中,而不能是在templete模版中,否則會當成普通字符串處理。


17. 事件的發送 / 發射器 / $emit

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 序言:亂七八糟一鍋粥! 基于Vue.js 教程、介紹— Vue.js 心得: 在vue中,推薦始終使用 kebab...
    苦苦修行閱讀 654評論 0 1
  • Vue簡介 2014年誕生,2013年react,09年angularjs 作者: 尤雨溪 核心概念: 組件化 雙...
    簡單就好wfc閱讀 1,603評論 0 1
  • Vue學習筆記 Vue初始化對象 data和methods里面的屬性都是Vue這個實例對象的代理屬性,例:vm.m...
    土豪碼農閱讀 1,004評論 1 1
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內容,還有我對于 Vue 1.0 印象不深的內容。關于...
    云之外閱讀 5,071評論 0 29
  • vue學習筆記 安裝 Vue 提供一個官方命令行工具,可用于快速搭建大型單頁應用。只需幾分鐘即可創建并啟動一個帶熱...
    EL_PSY_CONGROO閱讀 1,085評論 0 5