不管如今的你處於什麼狀態,是時候對本身說:不爲模糊不清的將來擔心,只爲清清楚楚的如今努力。
複製代碼
因爲小編時間經歷有限,所瞭解全部VUE的知識分爲私企與你們分享,內容若有到處還請您點撥,指正。TEL/V:15200025778javascript
什麼是: 是第三方開發的基於MVVM設計模式的漸進式的純前端js框架html
(1). 第三方開發: 下載才能用前端
(2). 基於MVVM: ?vue
(3). 漸進式: 能夠在項目中逐步引入vue相關功能,很容易和其它技術混搭。java
(4). 純前端js: 不須要任何nodejs和後端的知識,單靠瀏覽器就能夠運行和學習VUEnode
(5). 框架: 已經包含核心功能的半成品前端程序jquery
爲何: 簡潔!避免大量重複的編碼!小程序
什麼時候: 從此只要以數據操做(增刪改查)爲主的項目,均可用vue開發後端
2種:設計模式
(1). 將vue.js下載到項目本地引入網頁中使用
a. 官網: cn.vuejs.org —— 中文! —— 學有餘力才能去看!
b. <script src="js/vue.js">
c. 問題: 由於前端項目愈來愈龐大,文件夾結構和代碼量愈來愈複雜,致使不一樣的團隊和公司組織文件和文件夾結構時,各不相同!——混亂
(2). 公司中都是用vue腳手架代碼來開發項目
a. 什麼是: 已經包含標準的文件夾結構和核心功能的半成品項目!
b. 優勢: 標準!不一樣團隊和不一樣公司發開出的項目結構幾乎是徹底相同的!
示例: 個人第一個vue程序,分別用jquery和vue實現點擊按鈕修改數量功能
(1). jQuery版:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="btnMinus">-</button><span>0</span><button id="btnAdd">+</button>
<script src="js/jquery-1.11.3.js"></script>
<script>
//DOM 4步
//1. 查找觸發事件的元素
//本例中: 點兩個按鈕修改數量
var $btnMinus=$("#btnMinus");
var $btnAdd=$("#btnAdd");
//2. 綁定事件處理函數
//本例中: 單擊兩個按鈕
$btnAdd.click(function(){
//3. 查找要修改的元素
//本例中: 要修改span
var $span=$("span");
//4. 修改元素
//先取出span中的內容,轉爲整數
var n=parseInt($span.html())
//再將span的內容+1
n++;
//最後將新值放回span內容中
$span.html(n);
});
//2. 綁定事件處理函數
//本例中: 單擊兩個按鈕
$btnMinus.click(function(){
//3. 查找要修改的元素
//本例中: 要修改span
var $span=$("span");
//4. 修改元素
//先取出span中的內容,轉爲整數
var n=parseInt($span.html())
//若是數量>0時,纔將span的內容-1
if(n>0){ n-- }
//最後將新值放回span內容中
$span.html(n);
});
</script>
</body>
</html>
複製代碼
(2). VUE版
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--1. 編寫界面:
要求: 整個界面必須包裹在一個惟一的父元素內,習慣上: <div id="app"></div>
額外: 2件事:
1.1 找到界面中未來可能發生變化的位置,用{{自定義變量名}}臨時佔位
本例中: span的內容,未來隨點擊按鈕而變化,因此<span>{{n}}</span>
1.2 找到界面中可能觸發事件的元素,用@事件名="自定義處理函數名"標記出來
本例中: 單擊btnMinus時觸發減法操做,單擊btnAdd時觸發加法操做,因此
-->
<div id="app">
<button id="btnMinus" @click="minus">-</button>
<span>{{n}}</span>
<button id="btnAdd" @click="add">+</button>
</div>
<!-- <div id="#app2">
</div> -->
<script>
//2. 定義兩個倉庫對象: 倉庫名必須叫data和methods
//2.1 一個倉庫叫data,專門保存界面上所需的全部變量和初始值
//本例中: 界面上一共須要一個變量n,初始值爲0
var data={ n:0 };
//2.2 另外一個倉庫叫methods, 專門保存界面上所需的全部事件處理函數
//本例中: 界面上共須要兩個事件處理函數,分別是add和minus
var methods={
//複習小程序->在線->JSCORE->day07 做業:ES6關於對象中屬性和方法的簡寫
add(){
//雖然如今事件處理函數和data中的n分着寫,可是未來data對象和methods對象會被vue合併爲一個對象,事件處理函數data中的變量最終會放在一個大的對象中保存,因此,methdos中的函數可經過this.xx方式操做data中的變量
//本例中: 點btnAdd,觸發add函數,只想給data中的數量n+1
this.n++;
//不用本身放回去!
},
minus(){
//本例中: 點btnMinus,觸發minus函數,若是data中的數量n>0,纔將數量n-1
if(this.n>0){ this.n-- };
}
}
//3. 建立一個VUE對象充當快遞員,自動送貨
new Vue({
el:"#app", //選擇器: 告訴快遞員,請將貨物送到id爲app的小區中的各個住戶手中!——這個快遞元素所負責的小區
//告訴快遞員,須要配送的變量和函數都放在哪些倉庫裏。
//複習小程序->在線->JSCORE->day07 做業:ES6關於對象中屬性和方法的簡寫
data, //data:data,
methods //methods:methods
});
// new Vue({
// el:"#app2" //這個快遞員專門負責app2小區的自動送貨任務
// })
</script>
</body>
</html>
運行結果:
複製代碼
總結: Vue開發一個功能的基本步驟: 3步
(1). 定義界面:
a. 要求: 整個界面全部元素必須放在一個惟有的父元素下包裹
習慣上: ```<div id="app"> ... </div>```
複製代碼
b. 找到界面內未來可能發生變化的位置,用{{自定義變量名}}臨時佔位
c. 找到界面中全部觸發事件的元素,用@事件名="自定義處理函數名"標記
(2). 定義倉庫對象: 2個 data和methods
a. data: 專門保存界面中所需的全部變量及其初始值
b. methods: 專門保存界面中所需的全部事件處理函數
由於未來data對象和methods對象會被new
Vue()合併爲一個對象,因此methods中的事件處理函數,和data中的變量最終會保存在同一個對象中。因此,methods中的事件處理函數能夠經過this.變量名操做data中的變量
複製代碼
(3). 建立Vue對象,充當快遞員:
new Vue({
el:"#app", //選擇器: 告訴vue對象要將變量和函數送到頁面中哪一個大塊區域中的元素上。
//告訴vue對象界面所需的一切變量和函數都保存在哪裏——倉庫位置
data, //data:data,
methods, //methods:methods,
})
複製代碼
簡寫: 由於data對象和methods對象早晚都要被裝進newVue()對象中,因此實際開發中,咱們不單獨定義data和methods對象。而是直接在newVue()中data屬性和methods屬性值對象中直接添加頁面所需變量和事件處理函數:
new Vue({
el:"#app", //選擇器: 告訴vue對象要將變量和函數送到頁面中哪一個大塊區域中的元素上。
//告訴vue對象界面所需的一切變量和函數都保存在哪裏——倉庫位置
data:{
變量:初始值,
... : ...
},
methods:{
處理函數名(){
this.變量
},
...
}
})
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--1. 編寫界面: -->
<div id="app">
<button id="btnMinus" @click="minus">-</button>
<span>{{n}}</span>
<button id="btnAdd" @click="add">+</button>
</div>
<script>
//2. 建立一個VUE對象充當快遞員,自動送貨
new Vue({
el:"#app",
//3. 在Vue對象內添加data屬性和methods屬性,分別保存頁面所需的全部變量和事件處理函數
data:{
n:0
},
methods:{
add(){
this.n++;
},
minus(){
if(this.n>0){ this.n-- };
}
}
});
</script>
</body>
</html>
運行效果: 同上
複製代碼
簡寫後的步驟: 3步
(1). 定義界面:
(2). 先定義new Vue()對象,用選擇器找到本身負責的頁面區域
(3). 在new Vue()對象內,添加data屬性和methods屬性,其值都是對象。
a. data屬性對象中專門保存頁面所需的全部變量,
b. methods屬性對象中專門保存頁面所需的全部函數。
什麼是MVVM設計模式: 對前端代碼的從新劃分
舊前端代碼,分爲三部分:
(1). HTML: 專門保存網頁的內容和結構
(2). CSS: 專門爲網頁中的元素添加樣式
(3). JS: 專門爲網頁中的元素添加交互效果
問題:
(1). 由於HTML和CSS都是靜態的語言。缺乏標準的程序語言必須的要素
a. 好比HTML和CSS中沒有變量,就沒法實現一次修改,多處變化
b. 好比HTML和CSS中缺乏分支和循環,就沒法實現基本的判斷和反覆生成的功能
總結: HTML和CSS生活不能自理!
(2). 頁面上全部的瑣碎的修改都要依賴js來實現。致使js代碼極其冗餘,且包含大量重複勞動!
新MVVM,也將代碼分爲3部分:
(1). 界面(View): 包括之前的HTML+CSS,並且還加強了HTML的功能
a. 給HTML添加了變量的功能:<span>{{n}}</span>
若是n變化,則span自動變化,無需任何js代碼。
b. 爲HTML添加了分支和循環功能: v-if v-else 以及v-for
(2). 模型對象(Model): 專門集中保存頁面所需的變量和函數的對象
好比: data和methods都是模型對象
問題: 模型對象中的變量和方法不會本身長腿跑到界面中的元素上
複製代碼
(3). 視圖模型(ViewModel): 快遞員
a. 什麼是視圖模型:
自動將data中的變量和methods中的函數送到界面中指定元素上,並能自動保持界面顯示與data中變量值同步 一種特殊的對象
b. 好比: new Vue()就充當了視圖模型自動配送的角色。
(1). 訪問器屬性: 複習: 小程序->在線->JSCORE->day05 5. 訪問器屬性 get set
a. 回顧: 訪問器屬性:
1). 專門提供對一個普通屬性的保護。
2). 每一個訪問器屬性都包含一對兒, get和set函數
i. 當外界試圖獲取訪問器屬性的值時,自動調用訪問器屬性中的get
ii. 當外界試圖修改訪問器屬性的值時,自動調用訪問器屬性中的set
複製代碼
b. new Vue()如何利用訪問器屬性:
1). data對象和methods對象進入newVue()後會馬上被打散。data中的成員變量和methods中的成員函數,最終會直接隸屬於newVue()對象。且data中的變量和methods中的函數處於平級。因此methods中的函數才能用this.變量名方式訪問data中的變量
因此,new Vue()中的幾乎全部this,都指new Vue()對象!
複製代碼
Vue{ ... ...
2). new Vue()隱藏data中原變量。而後爲data中每一個變量分別請保鏢(訪問器屬性)。結果: 任何狀況下操做data中的變量n,早就不是普通的變量了。實際操做的都是訪問器屬性。且,只要試圖修改data中的變量n,都會自動調用訪問器屬性n的set函!
3). new Vue()在每一個訪問器屬性的set函數中悄悄內置了一個通知函數。只要試圖修,都會調用訪問器屬性的set,都會制定向外發出通知: "xx變量的值變了!快來拿新值!"
(2). 虛擬DOM樹:
a. 什麼是: vue經過掃描真實DOM樹,只提取出個別可能發生變化的元素,組成的一個棵簡化版的新的DOM樹。
b. 爲何: 優勢:
1). 小, 只包含可能受影響的元素,不受影響的元素是不包含在內的
2). 遍歷和查找快!
3). 更新效率高,由於每次只更新受影響的元素,不受影響的元素,不變的!
4). 避免重複代碼。虛擬DOM樹中已經提早封裝了DOM增刪改查操做!不用咱們本身寫!
c. 虛擬DOM樹在綁定過程當中如何發揮做用:
1). new Vue中任何位置修改了data中的變量,其實修改的都是訪問器屬性
2). 都會自動觸發這個訪問器屬性的set,都會自動發出通知
3). new Vue接到通知遍歷虛擬DOM樹,只找受本次變量修改影響的個別DOM元素
4). 虛擬DOM樹利用已經封裝好的增刪改查操做,僅更新頁面上受影響的個別元素。而不是大範圍替換界面元素。—— 效率遠高於jQuery!
複製代碼
什麼是綁定語法: vue給HTML中新增的一種可讓HTML直接使用js中的變量 的特殊語法.
爲何: 舊HTML不能使用js中的變量,哪怕很小的修改都要js先取出舊值,再修改後,最後放回來,才能更新界面——繁瑣!
什麼時候: 從此只要界面中一個元素的內容,須要隨js中變量自動變化,就要用綁定語法
如何: <元素>{{自定義變量名}}</元素>
後續: 若是界面中定義了一個{{自定義變量名}},則newVue()的data中就必須添加一個同名的變量,來支持這個界面位置的變化!
其實: {{}}中除了能夠放單個變量以外,還能聽任何有返回值的合法的js表達式!——同ES6模板字符串${}的規則
(1). 能夠放: 變量,運算,三目,有返回值的函數調用,建立對象,訪問數組元素
(2). 不能夠放: 程序結構(分支和循環)以及沒有返回值的函數調用。
示例: 在網頁中用各類語法綁定變量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<!--複習: 小程序->在線->JSCORE->day07 1. 模板字符串-->
<h3>Welcome {{uname}}</h3>
<h3>性別: {{sex==1?"男":"女"}}</h3>
<h3>小計: ¥{{(price*count).toFixed(2)}}</h3>
<h3>下單時間: {{new Date(orderTime).toLocaleString()}}</h3>
<h3>今天星期{{week[new Date().getDay()]}}</h3>
</div>
<script>
new Vue({
el:"#app",
data:{
uname:"dingding",
sex:1,
price:12.5,
count:5,
orderTime:1592549839941, //new Date().getTime()
week:["日","一","二","三","四","五","六"]
// 0 1 2 3 4 5 6
}
})
</script>
</body>
</html>
運行結果:
複製代碼
- src="{{pm25<100?'img/1.png':pm25<200?'img/2.png':pm25<300?'img/3.png':'img/4.png'}}":
Interpolation inside attributes has been removed.
屬性中的插值語法已經被移除了
Use v-bind or the colon shorthand instead. For example,
請用v-bind或:簡寫代替. 例如,
instead of <div id="{{ val }}">, use <div :id="val">.
用<div :id="val"> 代替<div id="{{val}}">
解決: 指令:
複製代碼
什麼是: 一批vue官方提供的,爲HTML添加新功能的特殊自定義擴展屬性
爲何: 由於{{}}只支持元素內容隨變量自動變化,不支持屬性自動變化,甚至沒法實現分支和循環等複雜結構
什麼時候: 從此只要元素的屬性值想隨變量自動變化或想給HTML添加更多新功能時,都用指令!
包括:
(1). 若是元素的屬性值可能隨變量自動變化: v-bind
a. <元素 v-bind:屬性名="js變量或表達式">
b. 原理: 當new VUe()掃描到這裏時,或者依賴的變量發生變化時,newVue都會自動從新計算v-bind後的變量值或表達式結果,用變量值或表達式結果代替該屬性的值!
c. 強調: 若是前邊加了v-bind:,則""中千萬不要再加{{}},此時""就扮演了{{}}的角色。
d. 簡寫: 從此v-bind: 都省略 v-bind,只寫:
<元素 :屬性名="js變量或表達式">
複製代碼
e. 示例: 根據pm25數值改變表情圖片
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<!--需求: 但願img的src屬性值隨data中的pm25數值自動變化
pm25<100,src屬性值爲img/1.png
pm25<200, src屬性值爲img/2.png
pm25<300, src屬性值爲img/3.png
其他img/4.png
-->
<div id="app">
<h3>{{pm25<100?'img/1.png':pm25<200?'img/2.png':pm25<300?'img/3.png':'img/4.png'}}</h3>
<img :src="pm25<100?'img/1.png':pm25<200?'img/2.png':pm25<300?'img/3.png':'img/4.png'" alt="">
</div>
<script>
new Vue({
el:"#app",
data:{
pm25:350
}
})
</script>
</body>
</html>
運行結果:
複製代碼
(2). 根據js中的變量值控制一個元素的顯示隱藏: v-show
a. <元素 v-show="bool類型的變量或js條件表達式">
b. 原理: 當new Vue首次掃描到這裏或依賴的js變量發生變化時,newVue都會自動計算""中的變量值或js表達式值。
1). 若是變量值或表達式值爲false,則new Vue()自動給元素添加display:none,當前元素隱藏
2). 若是變量值或表達式值爲true,則new Vue()自動去掉元素上的display:none,當前元素就顯示
複製代碼
c. 示例: 打開和關閉對話框(極其經常使用)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
<style>
#alert{
width:300px;
height:100px;
background-color:#ffa;
position:fixed;
top:50%;
left:50%;
margin-left:-150px;
margin-top:-50px;
line-height:100px;
}
#alert>a{
float:right;
line-height:30px;
margin-right:10px;
}
</style>
</head>
<body>
<div id="app">
<!--但願div#alert隨變量isShow的值不一樣而顯示隱藏
但願點click me,讓div#alert顯示(將isShow變量值改成true)
但願點×,讓div#alert隱藏(將isShow變量值改成false)-->
<button @click="pop">click me</button>
<div v-show="isShow" id="alert">
<a href="javascript:;" @click="close">×</a>
您的瀏覽器版本過低,請升級瀏覽器
</div>
</div>
<script>
new Vue({
el:"#app",
//由於頁面上須要一個isShow變量,因此
data:{
isShow:false//定義一個變量控制對話框的顯示和隱藏,開局默認隱藏
},
//由於頁面上須要?個事件處理函數: pop和close
methods:{
pop(){
this.isShow=true;
},
close(){
this.isShow=false;
}
}
})
</script>
</body>
</html>
運行結果:
複製代碼
(3). 根據js中的變量值,控制兩個元素二選一顯示隱藏: v-if v-else
a. <元素1 v-if="bool變量或js條件表達式">
<元素2 v-else >
b. 原理: 當new Vue首次掃描到這裏或依賴的js變量發生變化時,newVue都會自動計算v-if後""中的變量值或js表達式值
1). 若是v-if後的值爲true,則保留v-if所在元素,刪除v-else所在元素
2). 若是v-if後的值爲false,則刪除v-if所在元素,保留v-else所在元素
c. 強調:
1). 和程序中的if else同樣,v-else後不要寫="xxx"
2). v-if和v-else兩個元素必須緊挨着,中間不能插入別的元素!
d. 示例: 切換登陸和註銷狀態
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<!--根據變量值不一樣,顯示不一樣的登陸狀態-->
<!--但願點擊登陸,切換到已登陸狀態
但願點擊註銷,切換回未登陸狀態-->
<!--但願未登陸時只顯示第一個div-->
<div v-if="isLogin==false">
<a href="javascript:;" @click="login">登陸</a> | <a href="javascript:;">註冊</a>
</div>
<!--已登陸時只顯示第二個div-->
<div v-else>
<h3>Welcome dingding | <a href="javascript:;" @click="logout">註銷</a></h3>
</div>
</div>
<script>
new Vue({
el:"#app",
//由於頁面上須要根據一個變量值顯示不一樣的登陸狀態,因此data中要提供一個變量表示是否登陸
data:{
isLogin:false,//開局,默認未登陸
},
//由於頁面上須要兩個事件處理函數,因此methods中就要準備2個事件處理函數: login logout
methods:{
login(){
this.isLogin=true;
},
logout(){
this.isLogin=false;
}
}
})
</script>
</body>
</html>
運行結果:
複製代碼
e. 鄙視: v-show 和 v-if的區別?
1). v-show經過刪除元素 display:none 實現隱藏 ——不改變DOM樹結構,效率高
2). v-if 經過刪除元素 實現隱藏 —— 改變DOM樹,效率略低
複製代碼
(4). 多個元素多選一顯示: v-if v-else-if v-else
a. <元素1 v-if="bool變量或js條件表達式">
<元素2 v-else-if="另外一個bool變量或js條件表達式">
... ...
<元素n v-else>
b. 原理: 當new Vue首次掃描到這裏或依賴的js變量發生變化時,new Vue都會自動計算v-if後""中的變量值或js表達式值。
1). 若是v-if後的值爲true,則保留v-if所在元素,刪除其他全部v-else-if和v-else的元素
2). 若是v-if後的值爲false,則刪除v-if的元素,繼續向後判斷每一個v-else-if後的條件。哪一個v-else-if後的條件爲true,就只保留這個v-else-if所在的元素。刪除其他元素
3). 若是全部v-if和v-else-if中的條件都爲false,則刪除全部v-if和v-else-if,只保留v-else所在元素
c. 強調:
1). 和程序中的if else同樣,v-else後不要寫="條件"
2). v-if和v-else-if和v-else多個元素必須緊挨着,中間不能插入別的元素!
d. 示例: 根據PM25數值顯示不一樣的表情
複製代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<!--但願根據pm25的數值,修改頁面上的圖片:
pm25<100,顯示img/1.png
pm25<200, 顯示img/2.png
pm25<300, 顯示img/3.png
其他img/4.png
-->
<img v-if="pm25<100" src="img/1.png" alt="">
<img v-else-if="pm25<200" src="img/2.png" alt="">
<img v-else-if="pm25<300" src="img/3.png" alt="">
<img v-else src="img/4.png" alt="">
</div>
<script>
new Vue({
el:"#app",
//由於頁面上須要根據pm25的數值控制顯示哪張圖片,因此:
data:{
pm25:360
}
})
</script>
</body>
</html>
運行結果:
複製代碼