天天看點

Vue.js實戰 · 從初識到計算屬性

什麼是Vue.js

簡單小巧的核心

Vue.js壓縮後很小,隻有17KB

漸進式技術棧

可以一步一步地、階段性地來使用Vue.js,隻使用自己現階段需要的,不必一開始就使用它所有的東西

MVVM(Model-View-ViewModel)模式

由MVC模式衍生而來

Vue.js實戰 · 從初識到計算屬性

視圖層變化時,自動更新到視圖模型,反之亦然,兩者之間通過雙向資料綁定建立聯系

使用Vue.js

傳統的前端開發模式

<code>jQuery</code>+<code>RequireJS/SeaJS</code>+<code>artTemplate/doT</code>+<code>Gulp/Grunt</code>

Vue.js的開發模式

1.引入Vue.js

自動識别最新的穩定版的Vue.js

&lt;script src="https://unpkg.com/vue/dist/vue.min.js"&gt;&lt;/script&gt;

或者指定某個具體的版本的Vue.js

&lt;script src="https://unpkg.com/[email protected]/dist/vue.min.js"&gt;&lt;/script&gt;

還可以将代碼下載下傳下來,通過自己本地的路徑來引用

2.建立Vue執行個體

&lt;!doctype html&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta charset="utf-8"&gt;

&lt;title&gt;第一個Vue應用&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;div id="app"&gt;

&lt;input type="text" placeholder="第一個Vue應用" v-model="textcontent"&gt;

&lt;h1&gt;{{textcontent}}&lt;/h1&gt;

&lt;/div&gt;

&lt;script&gt;

var app = new Vue({

el:'#app', //或者document.getElementById("app")????

data:{ //????

textcontent:''

}

})

&lt;/script&gt;

&lt;/body&gt;

&lt;/html&gt;

????<code>el</code>用于指定頁面中的一個DOM元素挂載Vue執行個體。挂載後,可以通過'$'來通路該元素(注:Vue的執行個體屬性和方法以'$'開頭)

el:'#app',

data:{

a:2

console.log(app.$el);

????<code>data</code>用于聲明需要雙向綁定的資料。可以通過Vue執行個體本身來通路;除了顯示地聲明資料以外,還可以指向一個變量

console.log(app.a); //2

&lt;pre&gt;&lt;code&gt;var mydata = {

a:3

var app2 = new Vue({

data:mydata

console.log(app2.a); //3

//因為是雙向資料綁定,是以無論是修改屬性還是修改原資料,都會相應地改變

app2.a = 4;

console.log(mydata.a); //4

mydata.a = 5;

console.log(app2.a); //5

&lt;/code&gt;&lt;/pre&gt;

生命周期

Vue執行個體建立時會經曆一系列初始化過程,這其中會調用相應的<code>生命周期鈎子</code>(類似于jQuery中的ready()),利用這些鈎子我們可以選擇時機執行我們的業務邏輯,常用的鈎子有:

(1)<code>created</code> 執行個體建立完後調用

(2)<code>mounted</code> el挂載到執行個體上後調用

(3)<code>beforeDestroy</code> 執行個體銷毀之前調用

這些鈎子與<code>el</code>和<code>data</code>類型,作為選項寫入Vue執行個體内,鈎子的<code>this</code>指向調用它的Vue執行個體

el:document.getElementById('#app'),

},

created:function(){

console.log(this.a); //2

mounted:function(){

console.log(this.$el); //&lt;div id='app'&gt;&lt;/div&gt;

插值、表達式

使用'<code>{{}}</code>'來表達<code>文本插值</code>,會自動将雙向綁定的資料實時顯示出來

&lt;title&gt;文本插值&lt;/title&gt;

{{textcontent}}

textcontent:'《實戰Vue.js》'

例????顯示目前時間

&lt;title&gt;顯示目前時間&lt;/title&gt;

&lt;div id='app'&gt;

{{date}}

date:new Date()

var _this = this; //聲明一個變量指向Vue執行個體this,保證作用域一緻

thi.timer = setInterval(function(){

_this.date = new Date(); //修改date

},1000);

beforeDestroy:function(){

if(this.timer){

clearInterval(this.timer); //Vue執行個體銷毀前清除定時器

<code>v-html</code>輸出HTML,不解析

&lt;title&gt;v-html&lt;/title&gt;

&lt;span v-html="link"&gt;&lt;/span&gt;

el:"#app",

link:'&lt;a href="#"&gt;一個連結&lt;/a&gt;'

<code>v-pre</code>顯示{{}}标簽,不進行替換

&lt;title&gt;v-pre&lt;/title&gt;

&lt;div id="app" v-pre&gt;

在'{{}}'中,除了使用簡單的綁定屬性值外,還可以使用javascript的表達式;不能使用自定義的全局變量,隻能使用<code>Vue白名單</code>内的全局變量

&lt;title&gt;在{{}}内使用表達式&lt;/title&gt;

&lt;!--{{number/10}}--&gt;

&lt;!--{{ok?确定:取消}}--&gt;

{{text.split(',').reverse().join(',')}}

number:100,

ok:false,

text:'123,456'

過濾器

通過在'{{}}'插值尾部添加一個<code>管道符</code>('|'),自定義一個過濾的規則,并在Vue執行個體中設定<code>filters</code>選項來進行過濾

例????對時間進行格式化處理

&lt;title&gt;過濾器&lt;/title&gt;

{{date|formatDate}}

var padDate = function(value){

return value &lt; 0 ? '0' + value:value;

filters:{

formatDate:function(value){

var date = new Date(value);

var year = date.getFullYear();

var month = padDate(date.getMonth()+1);

var day = padDate(date.getDate());

var hours = padDate(date.getHours());

var minutes = padDate(date.getMinutes());

var seconds = padDate(date.getSeconds());

return year+'-'+month+'-'+day+'-'+hours+':'+minutes+':'+seconds;

var _this = this;

this.timer = setInterval(function(){

_this.date = new Date();

clearInterval(this.timer);

<code>setInterval()</code>

過濾器可以多個串聯,也可以接收參數

{{message|filterA|filterB}}

{{message|filterA('arg1','arg2')}}

注:過濾器常用于處理簡單的文本轉換,如果涉及複雜的資料變換,應當使用計算屬性

指令與事件

指令以'v'為字首,當其表達式的值改變時,相應地将某些行為應用到DOM上

<code>v-if</code>

&lt;title&gt;v-if&lt;/title&gt;

&lt;p v-if='show'&gt;顯示這段文本&lt;/p&gt;

show:false //show的值為false時會将&lt;p&gt;移除,反之,将&lt;p&gt;插入,這展現了Vue.js資料驅動的核心理念

<code>v-bind</code>

動态更新HTML元素上的屬性

&lt;title&gt;v-bind&lt;/title&gt;

&lt;a v-bind:href='url'&gt;百度&lt;/a&gt;

&lt;img v-bind:src='imgUrl'&gt;

url:'https://www.baidu.com',

imgUrl:'https://imagecs.fenxianglu.cn/images/wallpaper/側卧聆聽1619012145373.jpg'

<code>v-on</code>

用來綁定事件監聽器

&lt;title&gt;v-on&lt;/title&gt;

&lt;p v-if='show'&gt;這是一段文本&lt;/p&gt;

&lt;button v-on:click='handleClose'&gt;點選隐藏文本&lt;/button&gt;

show:true

methods:{

handleClose:function(){

this.show = false;

v-on監聽原生的DOM事件,如<code>click</code>、<code>dblclick</code>、<code>keyup</code>、<code>mousemove</code>等

表達式可以是方法名(方法寫在Vue執行個體的<code>methods</code>屬性裡),也可以直接使用内聯語句(類似内聯樣式)的形式

&lt;button v-on:click='show=false'&gt;點選隐藏文本&lt;/button&gt;

可以像通路資料那樣來通過執行個體來調用方法,例如:

init:function(text){

console.log(text);

this.init('初始化時調用');

});

app.init('在Vue執行個體外部調用');

文法糖

文法糖是在不影響功能的情況下,添加某種方法以實作相同的效果,友善程式的開發(可簡單看成是簡寫)

<code>v-bind</code>簡寫為':'

<code>v-on</code>簡寫為'@'

計算屬性

當'{{}}'内的表達式過長或邏輯複雜時,難以維護,這是就需要使用計算屬性

計算屬性以函數的形式寫在Vue執行個體的<code>computed</code>屬性内

例如:

&lt;div&gt;

使用計算屬性改寫為下:

{{reversedText}}

computed:{

reversedText:function(){

return this.text.split(',').reverse().join(',');

計算屬性還可以依賴多個Vue執行個體的資料

&lt;title&gt;計算屬性可以依賴于多個Vue執行個體&lt;/title&gt;

總價:{{prices}}

package1:[

{

name:'iphone7',

price:7199,

count:2

name:'iPad',

price:2999,

count:1

],

package2:[

name:'apple',

price:3,

count:5

name:'banana',

price:2,

count:10

]

prices:function(){

var prices = 0;

for(var i = 0;i &lt; this.package1.length;i++){

prices += this.package1[i].price*this.package1[i].count;

for(var i = 0;i &lt; this.package2.length;i++){

prices += this.package2[i].price*this.package2[i].count;

return prices;

每一個計算屬性都包含一個<code>getter</code>和一個<code>setter</code>,不特殊聲明時預設使用<code>getter</code>讀取計算屬性,手動修改一個計算屬性的值時會觸發<code>setter</code>函數,執行一些自定義的操作

&lt;title&gt;getter與setter&lt;/title&gt;

姓名:{{fullName}}

firstName:'Jack',

lastName:'Green'

fullName:{

//getter,用于讀取

get:function(){

return this.firstName + ' ' + this.lastName;

//setter,寫入時觸發

set:function(newValue){

var names = newValue.split(' ');

this.firstName = names[0];

this.lastName = names[names.length-1];

手動修改fullName時,setter函數會被調用,視圖同時會被更新

Vue.js實戰 · 從初識到計算屬性

除了處理文本插值外,計算屬性還常用于動态地設定元素的樣式名稱class和内聯樣式style,使用元件時,也常用于動态傳遞props

計算屬性可以依賴于其他的計算屬性;而且不僅可以依賴目前Vue執行個體的資料,還可以依賴其他執行個體的資料

&lt;title&gt;依賴其他Vue執行個體的資料&lt;/title&gt;

&lt;div id='app1'&gt;&lt;/div&gt;

&lt;div id='app2'&gt;

var app1 = new Vue({

el:'#app1',

el:'#app2',

return app1.text.split(',').reverse().join(',');

使用計算屬性還是methods

使用方法(在Vue執行個體内設定<code>methods</code>選項)有時也能達到與使用計算屬性(在執行個體内設定<code>computed</code>選項)相同的效果,但計算屬性是基于它的依賴緩存的,隻要依賴的資料發生變化,計算屬性就會被更新;而如果依賴不是響應式的,計算屬性也不會更新,這時應使用methods,隻要重新進行渲染,就可實作更新

&lt;title&gt;&lt;/title&gt;

&lt;div id='app1'&gt;

{{now}}

now:function(){

return Date.now();

&lt;title&gt;點選以獲得Date.now()&lt;/title&gt;

&lt;button v-on:click='showNow'&gt;{{now}}&lt;/button&gt;

now:''

showNow:function(){

this.now = Date.now();