靈魂拷問:你是否懂得全部的Vue模板語法呢?

file

做者 | Jesksonjavascript

掘金 | https://juejin.im/user/5a16e1...css

Vue.js的建立者爲尤雨溪,2014年,Vue.js正式發佈,2015年,正式發佈1.00版本。VUE.JS爲漸進式的JavaScript框架,聲明式渲染,組件系統,客戶端路由,集中式狀態管理,項目構建。html

vue.js是一套用於構建用戶界面的漸進式框架,與其它大型框架不一樣的是,Vue被設計能夠自底向上逐層應用,vue.js的核心庫只關心視圖層,很容易上手,也便於和第三方庫或者是既有的項目整合。前端

vue的優勢,易用,就是能夠快速上手vue,靈活,就是能夠在一個庫和一套完整框架之間自入伸縮,高效,文件大小20kb運行大小,提供超快的虛擬DOM。vue

傳統開發模式的代碼:java

JavaScript原生代碼:jquery

<div id = "msg"> </div>

<script type="text/javascript">
 var msg = 'hello dada';
 var div = document.getElementById("msg");
 div.innerHTML = msg;
</script>

jquery代碼:web

<div id="msg"></div>

<script type="text/javascript" src="js/jquery.js"></script>

<script type="text/javascript">
 var msg = "hello da";
 $('#msg').html(msg);
</script>

Vue的基本操做,向世界問好!算法

<div id="app>
 <div>{{msg}}</div>
</div>

<script type="text/javascript" src="js/vue.js"></script>

<script type="text/javascript">
 new Vue({
  el: '#app',
  data: {
   msg: 'hello world'
  }
 })
</script>

vue的使用過程,須要提供標籤用於填充數據,引入vue.js庫文件,可使用vue的語法作功能,把vue提供的數據填充到標籤裏面。segmentfault

el屬性,元素的掛載位置,值能夠是css選擇器或者是dom元素

data屬性,模型數據,值是一個對象

插值表達式用法

將數據填充到HTML標籤中,插值表達式支持基本的計算操做

vue代碼運行的原理

vue語法到原生語法,vue的語法經過vue框架編譯成原生的代碼。

vue的模板語法

如何理解前端渲染?

把數據填充到HTML標籤中

模板和數據-》前端渲染-》靜態HTML文件

前端渲染方式:原生js拼接字符串,使用前端模板引擎,使用vue特有的模板語法

原生js拼接字符串,就是將數據以字符串的方式拼接到HTML標籤中。

什麼是指令?什麼是自定義屬性,指令的本質就是自定義的屬性,指令格式以v-開頭

指令v-cloak

插值表達式存在一個問題,「閃動」問題,就是刷新的時候會出現閃動的效果,如何解決問題,使用v-cloak指令,解決這個問題的原理,先隱藏,替換好值以後再顯示最終的值。

v-cloak,不須要表達式,用法,這個指令保持在元素上直到關聯實例結束編譯,和css規則如 [v-cloak] {display: none} 一塊兒用時,這個指令能夠隱藏未編譯的mustache標籤直到實例準備完畢。

示例:標準的屬性選擇器

[v-cloak] {
 display: none;
}

<div v-cloak>
 {{message}}
</div>

不會顯示,直到編譯結束。

v-cloak指令的用法

第一步使用提供的樣式

[v-cloak] {
 display: none;
}

第二步,在插值表達式所在的標籤中添加v-cloak指令

本質原理,先經過樣式隱藏內容,而後在內存中進行值的替換,替換好以後在顯示最終的結果。

數據綁定的指令

v-text填充純文本,v-html填充HTML代碼,v-pre填充原始信息

v-text,string,更新元素的textContent

示例:

<span v-text="msg"></span>

<span>{{msg}}</span>

v-html,string,更新元素的innerHTML,內容按照普通HTML插入,不會做爲vue模板進行編譯,若是試圖使用v-html組合模板,能夠從新考慮是否經過使用組件來替代。

在網站上動態渲染任意HTML是很危險的,容易致使xss攻擊,只在可信內容上使用v-html,永不用在用戶提交的內容上。

在單文件組件裏,scoped的樣式不會應用在v-html內部,由於那部分HTML沒有被vue的模板編譯器處理,若是你但願針對v-html的內容設置帶做用域的css,你能夠替換爲css modules或用一個額外的全局<style>元素手動設置相似bem的做用域策略。

v-html填充HTML片斷,存在安全問題的,只有在本網站內部數據可使用,第三方的數據不可使用。

v-pre填充原始信息

什麼是原始信息,就是若是是,不用編譯,跳過編譯過程

<div v-pre>{{msg}}</div>

會致使顯示結果爲: {{msg}}

指令

數據響應式,HTML5中的響應式,數據的響應式,什麼是數據綁定?v-once只會編譯一次。HTML5中的變化,屏幕尺寸的變化會致使樣式的變化,數據的響應式指數據的 變化致使頁面中內容的變化。

file

數據綁定如何理解,就是插值表達式是將數據填充到標籤中。

編譯,vue的模板內容就要經過vue的編譯過程,v-once只編譯一次,顯示內容以後再也不具備響應式功能。

雙向數據綁定

v-model指令的用法

<input type="text" v-model="name"/>

MVVM設計思想:把不一樣的功能代碼放到不一樣的模塊裏面

M,model
v,VIEW
VM,view-model

模型,數據,用到的數據,視圖,就是dom元素,模板,vm,二者的結合,把二者聯合到一塊兒。

file

file

file

核心思想,分而食之,事件監聽,數據綁定。

事件綁定,如何處理事件,v-on指令的用法

<input type="button" v-on:click="num++"/>

<input type="button" @click="num++"/>

事件函數的調用

直接綁定函數名稱

<button v-on:click="da">dada</button>

調用函數

<button v-on:click="da()">dada</button>

事件函數參數傳遞

普通參數和事件對象

<button v-on:click='da("da",$event)'>da</button>

阻止事件冒泡

dada: function(event) {
 event.stopPropagation();
}

事件修飾符

.stop 阻止冒泡
<a v-on:click.stop = "dada">跳轉</a>

.prevent 阻止默認行爲
<a v-on:click:prevent="dada">跳轉</a>

事件處理

監聽事件

能夠用v-on指令監聽dom事件,並在觸發時運行一些JavaScript代碼。

示例:

<div id="dada">
 <button v-on:click="counter += 1">da da</button>
 <p>dada {{counter}} </p>
</div>

var vm = new Vue({
 el: '#dada',
 data: {
  counter: 0
 }
})

內聯處理器中的方法

除了直接綁定到一個方法,也能夠在內聯的JavaScript語句中調用方法

<div id="da">
 <button v-on:click="say('hi')">dada</button>
</div>

new Vue({
 el: '#da',
 methods: {
  say: function(message) {
   alert(message)
  }
 }
})

事件修飾符

在事件處理程序中調用 event.preventDefault() 或 event.stopPropagation() 是很是常見的需求。

.stop

.prevent

.capture

.self

.once

.passive
// 阻止單擊事件繼續傳播
<a v-on:click.stop = "doThis"></a>

// 提交事件再也不重載頁面
<form v-on:submit.prevent="onSubmit"></form>

// 修飾符能夠串聯
<a v-on:click.stop.prevent="doThis"></a>

// 只有修飾符
<form v-on:submit.prevent></form>

// 添加事件監聽時使用事件捕獲模式
// 即爲元素自身觸發的事件先在此處理,而後才交由元素進行處理
<div v-on:click.capture="doThis"></div>

// 只當在event.target是當前元素自身觸發處理函數
// 即事件不是從內部元素觸發的
<div v-on:click.self="doThat">..</div>

按鍵修飾符

// .enter 回車鍵
<input v-on:keyup.enter="submit">

// .delete刪除鍵
<input v-on:keyup.deleter="handle">

使用修飾符要注意順序,相應的代碼會以一樣的順序產生。

v-on:click.prevent.self 會阻止全部的點擊

v-on:click.self.prevent 只會阻止對元素自身的點擊

所有的按鍵別名:

.enter

.tab

.delete

.esc

.space

.up

.down

.left

.right

自定義按鍵事件修飾符

能夠經過全局 config.keyCodes 對象自定義按鍵修飾符別名:

// 可使用v-on:keyup.f1

Vue.config.keyCodes.f1 = 112
<body>
 <div id="app">
  <input type="text" v-on:keyup.aaa="handle" v-model="info">
 </div>
 <script type="text/javascript" src="js/vue.js"></script>
 <script type="text/javascript">
 Vue.config.keyCodes.aaa = 65
 var vm =  new Vue({
  el: '#app',
  data: {
   info: ''
  },
  methods: {
   handle: function(event) {
    console.log(event.keyCode)
   }
  }
 });
</script>

應用實例,簡單的計算器

需求,實現簡單的加法計算,分別輸入數值a和數值b,點擊計算按鈕,結果顯示在下面

<body> 
<div id="app">
<h1>計算器</h1>

<div>
<span>數值a</span>
<span>
<input type="text" v-model="a">
</span>
</div>

<div>
<span>數值b:</span>
<span>
<input type="text" v-model="b">
</span>
</div>

<div>
<button @:click="handle">計算</button>
</div>

<div>
<span>計算結果:</span>
<span></span>
</div>
</div>

<script type="text/javascript" src="js/vue.js"></script>

<script type="text/javascript">
 var vm = new Vue({
  el: '#app',
  data: {
   a: '',
   b: '',
   result: ''
  },
   methods: {
    handle: function() {
     // 實現計算邏輯
     this.result = parseInt(this.a) + parseInt(this.b);
    }
   }
 });
</script>

屬性綁定

vue如何動態處理屬性呢?

// v-bind指令
<a v-bind:href="url">跳轉</a>

// 縮寫方式
<a :href="url">跳轉</a>

考察v-model指令的本質

<body>
<div id="app">
<input type="text" v-bind:value="msg" v-on:input="handle">
</div>

<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">

var vm = new Vue({
 el:'#app',
 data: {
  msg: 'dada',
 },
 methods: {
  handle: function(event) {
   this.msg = event.target.value;
  }
 }
})

優化:

<input type="text" v-bind:value="msg" v-on:input="msg=$event.target.value">

樣式綁定

class樣式處理

對象語法

<div v-bind:class="{ active: isActive }"></div>

數組語法

<div v-bind:class="{activeClass, errorClass}"></div>

數組綁定樣式的語法:

<div v-bind:class="[activeClass, errorClass]'>dada</div>

var vm = new Vue({
 el: '#app',
 data: {
  activeClass: 'active',
  errorClass: 'error'
 },
 methods: {
  handle: function(){
   this.activeClass= '',
   this.errorClass= '',
  }
 }
});

對象綁定和數組綁定能夠結合使用,class綁定的值能夠簡化操做。

v-bind:class="[activeClass, errorClass, {test: isTest}]"
// 數組的簡化
arrClasses: ['active', 'erro'],

// 對象的簡化
objClass: {
 active: true,
 error: true
}

style樣式處理

// 對象語法
<div v-bind:style=" { color: activeColor, fontSize: fontsize }"></div>

// 數組語法
<div v-bind:style="[baseStyle, overridingStyles]"></div>

分支循環結構

v-if
v-else
v-else-if
v-show

v-if 指令用於條件性地渲染一塊內容。這塊內容只會在指令的表達式返回 truthy 值的時候被渲染。

<h1 v-if="awesome">Vue is awesome!</h1>

也能夠用 v-else 添加一個「else 塊」:

<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

帶有 v-show 的元素始終會被渲染並保留在 DOM 中。v-show 只是簡單地切換元素的 CSS 屬性 display。

v-if和v-show的區別

v-if控制元素是否渲染到頁面

v-show控制元素是否顯示,已經渲染到了頁面

循環結構

// v-for遍歷數組
<li v-for="item in list">{{item}}</li>

<li v-for="(item, index) in list">{{item}}+","+{{index}}</li>

<li :key="item.id" v-for="(item,index) in list">{{item}}</li>

key的做用:幫助vue區分不一樣的元素,從而提升性能

v-if和v-for的使用

// v-for遍歷對象
<div v-for="(value, key, index) in object"></div>

// v-if和v-for
<div v-if="value==12" v-for="(value,key,index) in object"></div>

for...in...循環不建議遍歷數組,只遍歷對象

實例:

Vue實現Tab選項卡

主要思路:

點擊不一樣 tab

獲取 tab 選項卡下標併爲其動態綁定一個class(選中狀態時的樣式)

點擊時使 tab 對應的內容下標與 tab 選項卡下標保持一致

使用 v-show / v-if 指令控制內容顯示與隱藏

<div class="parts">
    <span @click="func('A');" v-bind:class="{'active':(active=='A') }">A</span>
    <span  @click="func('B');" v-bind:class="{'active':(active=='B') }">B</span>
    <span  @click="func('C');" v-bind:class="{'active':(active=='C') }">C</span>
</div>

<div class="block block1" v-if="block=='A'">
    A block
</div>
<div class="block block1" v-if="block=='B'">
    B block
</div>
<div class="block block1" v-if="block=='C'">
    C block
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            active:'A',
            block:'A'
        },
        filter:{
 
        },
        watch:{
 
        },
        methods: {
            func:function(c){
                this.active=C;
                this.block=C;
            }
        }
    });
</script>
<template id="tp1">
    <div id="nav">
        <ul>
            <li v-for="item in array" @click="choose(item)" :class='content===item?"pink":"blue"'>{{item}}</li>
        </ul>
        <div id="div">{{content}}</div>
    </div>
</template>
<script>
    //建立一個組件
    var component=Vue.extend({
       template:"#tp1",
        data:function () {
            return{
              content:"北京",
              array:["北京","上海","杭州","廣州","深圳"]
           }
        },
        methods:{
           choose:function (item) {
            this.content=item;
           }
        }
    });
    //註冊一個組件
    Vue.component("test",component);
    new Vue({
        el:"#app",
        data:{
            name:"選項卡組件案例"
        }
    });
</script>
<template>
    <div>
      <div id="tab">
        <div class="tab-tit">
          
          <a href="javascript:;" @click="curId=0" :class="{'cur':curId===0}">html</a>
          <a href="javascript:;" @click="curId=1" :class="{'cur':curId===1}">css</a>
          <a href="javascript:;" @click="curId=2" :class="{'cur':curId===2}">javascript</a>
          <a href="javascript:;" @click="curId=3" :class="{'cur':curId===3}">vue</a>
        </div>
        <div class="tab-con">
          
          <div v-show="curId===0">
            html<br/>
          </div>
          <div v-show="curId===1">
            css
          </div>
          <div v-show="curId===2">
            javascript
          </div>
          <div v-show="curId===3">
            vue
          </div>
        </div>
      </div>
    </div>
</template>

在博客平臺裏,將來的路還很長,也但願本身之後的文章你們能多多支持,多多批評指正,咱們一塊兒進步,一塊兒走花路。

很是感謝讀者能看到這裏,若是這個文章寫得還不錯,以爲「達達」我有點東西的話,以爲我可以堅持的學習,以爲此人能夠交朋友的話, 求點贊👍 求關注❤️ 求分享👥 對暖男我來講真的

很是有用!!!

❤️ 不要忘記留下你學習的腳印 [點贊 + 收藏 + 評論]

做者Info:

【做者】:Jeskson
【原創公衆號】:達達前端小酒館。
【福利】:公衆號回覆 「資料」 送自學資料大禮包(進羣分享,想要啥就說哈,看我有沒有)!
【轉載說明】:轉載請說明出處,謝謝合做!~

大前端開發,定位前端開發技術棧博客,PHP後臺知識點,web全棧技術領域,數據結構與算法、網絡原理等通俗易懂的呈現給小夥伴。謝謝支持,承蒙厚愛!!!


若本號內容有作得不到位的地方(好比:涉及版權或其餘問題),請及時聯繫咱們進行整改便可,會在第一時間進行處理。


請點贊!由於大家的贊同/鼓勵是我寫做的最大動力!

歡迎關注達達的CSDN!

這是一個有質量,有態度的博客

前端技術棧

相關文章
相關標籤/搜索