什么是vue.js
Vue.js 是目前最火的一個前端框架,React是最流行的一個前端框架(React除了開發網站,還可以開發手機App, Vue語法也是可以用于進行手機App開發的,需要借助于Weex)
Vue.js 是前端的主流框架之一,和Angular.js、React.js 一起,并成為前端三大主流框架!
Vue.js 是一套構建用戶界面的框架,只關注視圖層,它不僅易于上手,還便于與第三方庫或既有項目整合。(Vue有配套的第三方類庫,可以整合起來做大型項目的開發)
基本指令
vue.min.js 官網下載
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="../js/vue.min.js"></script>
</head>
<body>
<div id="app">
<span>{{msg}}</span>
</div>
</body>
<script type="text/javascript">
創建一個vue的實例,當頁面引入vue.min.jshou,瀏覽器的內存中會存在一個vue的構造函數
new 出來的 vue對象就是 MVVM中的 VM調度者
var vm = new Vue({
el:'#app',當前的vue實例,會控制頁面中id是app的區域
data:{data屬性中,存放的時el區域要用到的數據
msg:'hello vue '
}
})
</script>
</html>
v-cloak 指令
當引用的vue.js庫沒有完成加載時,html中的{{msg}}表達式就會展示成原始代碼
可以在標簽中加上 v-cloak,在style中設置display:none即可
<style type="text/css">
[v-cloak]{
display: none;
}
</style>
<div id="app">
<span v-cloak>{{msg}}</span>
</div>
插值表達式
- {{msg}}
會出現上述表達式展示源碼問題,但是該方式不會影響標簽中除表達式外的其他內容
例:<span>這是{{msg}}的內容</span>
- v-text="msg"
不會出現上述表達式展示源碼問題,但是該方式會覆蓋標簽中的內容
例:<span v-text="msg">vue text</span>
若msg是abc 則vue text將被替換成abc
- v-html="msg"
如果需要向頁面中寫入HTML標簽時,則需要使用 v-html
<div id="app">
<span v-html="msg1"></span>
</div>
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
msg:'<h2>我是H2</h2>'
}
})
</script>
v-bind 用于綁定屬性的指令
var vm = new Vue({
el:'#app',
data:{
value1:'按鈕'
}
})
<input type="button" value="value1" name="" >
效果如下:
<input type="button" v-bind:value="value1" name="" >
效果如下:
v-bind 簡寫方式, 效果一樣
<input type="button" :value="value1" name="" >
v-on:click 標簽綁定單擊事件
<script type="text/javascript">
var vm = new Vue({
el:'#app',
data:{
value1:'按鈕',
},
methods:{在這里定義當前vue實例用到的函數
show:function(){ alert("綁定點擊事件") }
}
})
<input type="button" value="按鈕1" name="" v-on:click="show" >
v-on: 簡寫方式 @
<input type="button" value="按鈕1" name="" @click="show" >
在methods中的函數如果想要獲取data中定義的屬性值
可以通過this.屬性名獲取,this.方法名
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
value1:'按鈕',
},
methods:{
show:function(){ alert("綁定點擊事件") },
show2:function(){ alert(this.msg); }
}
})
vue會監聽data中屬性值的變化,并且實時更新到頁面中
<div id="app">
<span v-cloak>{{msg}}</span>
<input type="button" value="按鈕3" name="" @click="show3" >
</div>
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
},
methods:{//在這里定義當前vue實例用到的函數
show3:function(){ this.msg='msg value changed'; }
}
})
-
點擊按鈕3之前頁面展示
image.png -
點擊按鈕3之后頁面展示
image.png
事件修飾符
- stop 阻止事件冒泡
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
msg1:'<h2>我是H2</h2>',
value1:'按鈕',
},
methods:{
show4:function(){ alert('4'); },
show5:function(){ alert('5'); }
}
})
<div @click="show5">
<input type="button" value="按鈕4" name="" @click.stop="show4" >
</div>
- capture 監聽捕獲事件
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
msg1:'<h2>我是H2</h2>',
value1:'按鈕',
},
methods:{
show4:function(){ alert('4'); },
show5:function(){ alert('5'); }
}
})
<div @click.capture="show5">
<input type="button" value="按鈕4" name="" @click.stop="show4" >
</div>
結果: 【點擊按鈕4,會先彈出5 ,再彈出4.】
- self 只有元素本身可以觸發綁定的事件
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
msg1:'<h2>我是H2</h2>',
value1:'按鈕',
},
methods:{
show4:function(){ alert('4'); },
show5:function(){ alert('5'); }
}
})
<div @click.self="show5">
<input type="button" value="按鈕4" name="" @click="show4" >
</div>
結果: 【點擊div時,只會彈出5 ,不再彈出4.】
v-model 實現數據雙向綁定;只能用于表單元素
var vm = new Vue({
el:'#app',
data:{
msg:'hello vue ',
}
})
<input type="text" value="按鈕7" name="" v-model="msg" >
結果:【當文本框中的值改變時,data中的msg也隨之改變】
v-once 如果展示的信息后續不需要再修改,可以使用該指令,可以提高性能
vue中樣式的操作
- :class="['類選擇器','類選擇器',..]" 括號中的類選擇器一定要有單引號括起來
- 如果沒有單引號,則會被當做data中的屬性,例如案例代碼中的 flag
- 括號中可以使用表達式
<style type="text/css">
div{
width: 300px;
height: 100px;
}
.showStyle1{
color:blue;
}
.showStyle2{
font-size:30px;
}
.showStyle3{
background-color: green;
}
</style>
<div :class="['showStyle1','showStyle2',flag?'showStyle3':'']">
div中的內容
</div>
var vm = new Vue({
el:'#app',
data:{
flag:true,
}
})
-
當flag為true時,效果如下 (請自行忽略我的程序員配色)
image.png -
當flag為false時,效果如下
image.png
簡寫方式,效果相同
<div :class="['showStyle1','showStyle2',{showStyle3:flag}]">
div中的內容
</div>
:class={樣式名:boolean,樣式名:boolean,...} 效果同上
<style type="text/css">
div{
width: 300px;
height: 100px;
}
.showStyle1{
color:blue;
}
.showStyle2{
font-size:30px;
}
.showStyle3{
background-color: green;
}
</style>
<div :class="{showStyle1:true, showStyle2:true, showStyle3:false}">
div中的內容
</div>
:class="data中屬性" 效果同上
var vm = new Vue({
el:'#app',
data:{
styleObj:{showStyle1:true, showStyle2:true, showStyle3:false}
}
})
<div :class="styleObj"> div中的內容 </div>
v-for 指令 用于遍歷數組、集合
ar vm = new Vue({
el:'#app',
data:{
list1:['一班','二班','三班','四班','五班']
},
methods:{//在這里定義當前vue實例用到的函數
}
})
item 是數組或集合中的每個實例,只是一個變量名稱,寫法不是固定的
<p v-for="item in list1">{{item}}</p>
v-for="(item,i) in List" i 是每個實例的下標,從 0 開始
遍歷復雜集合
var vm = new Vue({
el:'#app',
data:{
list2:[
{id:'1' ,name :'zsa1'},
{id:'2' ,name :'zsa2'},
{id:'3' ,name :'zsa3'}
]
},
methods:{//在這里定義當前vue實例用到的函數
}
})
<p v-for="user in list2">編號:{{user.id}},姓名:{{user.name}}</p>
遍歷對象
<p v-for="(key,val,i) in userInfo">{{key}} -- {{val}} -- {{i}}</p>
var vm = new Vue({
el:'#app',
data:{
userInfo:{
id:"1",
name:"jack"
}
},
methods:{//在這里定義當前vue實例用到的函數
}
})
當list對象發生變化,vue-model會重新加載
<div>
id:<input type="text" v-model="id" > name:<input type="text" v-model="name">
<input type="button" value="add" v-on:click="add">
</div>
var vm = new Vue({
el:'#app',
data:{
list1:[
{id:'1' ,name :'zsa1'},
{id:'2' ,name :'zsa2'},
{id:'3' ,name :'zsa3'}
],
id:"",
name:""
},
methods:{//在這里定義當前vue實例用到的函數
add(){
var info = {"id":this.id,"name":this.name};
this.list1.push(info);
}
}
})
v-for中的key
<div id="app">
<input type="button" value="add" v-on:click="add">
<p v-for="(item,i) in list " :key="item.id">
<input type="checkbox"> {{item.id}} -- {{item.name}}
</p>
</div>
</body>
<script>
var vue = new Vue({
el:"#app",
data:{
list:[
{id:"1",name:"jack"},
{id:"2",name:"tom"},
{id:"3",name:"alen"}
]
},
methods: {
add(){
var info = {id:"4",name:"Json"};
this.list.unshift(info);
}
}
})
</script>
刪除列表中的元素
<div id="app">
<table>
<tr v-for="item in list">
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>
// prevent 阻止默認事件
<a href="" @click.prevent="del(item.id)">刪除</a>
<a href="" @click.prevent="del1(item.id)">刪除1</a>
</td>
</tr>
</table>
</div>
var mv = new Vue({
el:"#app",
data:{
list:[
{id:'1' ,name :'zsa1'},
{id:'2' ,name :'zsa2'},
{id:'3' ,name :'zsa3'}
]
},
methods:{
del(id){
for(let i=0;i<this.list.length ;i++){
if(this.list[i].id == id){
this.list.splice(i,1);
break;
}
}
},
del1(id){
var index = this.list.findIndex(function(item){
return item.id == id;
})
this.list.splice(index,1);
}
}
})
跟進內容查詢過濾集合數據
<div id="app">
<input type="text" value="" @change="search" v-model="searchName">
<p v-for="item in search(searchName)" :key="item.id">
<input type="checkbox"> {{item.name}}
</p>
</div>
<script>
var vue = new Vue({
el:"#app",
data:{
list:[
{id:"1",name:"jack"},
{id:"2",name:"tom"},
{id:"3",name:"alen"},
{id:"4",name:"jackson"}
],
searchName:""
},
methods: {
search(searchNameParam){
return this.list.filter(item => {
return item.name.indexOf(searchNameParam) != -1;
});
}
}
})
</script>
如果 in 后面是一個數字 ,count則從1 開始
<p v-for="count in 10">{{count}}</p>
分支結構
- 只有表達式符合成立的標簽才會展示
var vm = new Vue({
el:'#app',
data:{
score:'69'
},
methods:{//在這里定義當前vue實例用到的函數
}
})
<div id="app">
<p v-if="score>80 && score<90">良好</p>
<p v-else-if="score>80 && score<100">優秀</p>
<p v-else="score<80">及格</p>
</div>
v-show 功能與v-if相同,區別在于v-show的條件表達式為false時,實際上標簽已經存在網頁中,只不過設置成display:none
而v-if 并不會將標簽畫出
var vm = new Vue({
el:'#app',
data:{
showFlag:false
},
methods:{//在這里定義當前vue實例用到的函數
}
})
<div id="app">
<div v-show="showFlag">演示v-show</div>
</div>
-
查看網頁源碼
image.png
v-for 與 v-if 集合使用
<p v-if="user.id=='2'" v-for="user in list2">編號:{{user.id}},姓名:{{user.name}}</p>
vue 的常用特性
- 表單特性 :表單中的組件都是基于v-model進行數據綁定的
- 單選框,復選框,下拉選不需要配置相同的name組,只要綁定相同的v-model即可
<input type="radio" name="" value="1" v-model="sex"> 男
<input type="radio" name="" value="2" v-model="sex"> 女
var vm = new Vue({
el:'#app',
data:{
sex:'1'
},
methods:{//在這里定義當前vue實例用到的函數
}
})
- sex 初始值時1 ,頁面則默認選擇男
- 注意: 下拉選的v-model 綁定在<select> 標簽中
表單修飾符
- v-model.number 將字符串轉為數字
- v-model.trim 去除字符串兩邊的空白字符
Vue.js——vue-resource全攻略
Vue.js是數據驅動的,這使得我們并不需要直接操作DOM,如果我們不需要使用jQuery的DOM選擇器,就沒有必要引入jQuery。vue-resource是Vue.js的一款插件,它可以通過XMLHttpRequest或JSONP發起請求并處理響應。也就是說,$.ajax能做的事情,vue-resource插件一樣也能做到,而且vue-resource的API更為簡潔。另外,vue-resource還提供了非常有用的inteceptor功能,使用inteceptor可以在請求前和請求后附加一些行為,比如使用inteceptor在ajax請求時顯示loading界面。
vue-resource特點
1. 體積小
vue-resource非常小巧,在壓縮以后只有大約12KB,服務端啟用gzip壓縮后只有4.5KB大小,這遠比jQuery的體積要小得多。
2. 支持主流的瀏覽器
和Vue.js一樣,vue-resource除了不支持IE 9以下的瀏覽器,其他主流的瀏覽器都支持。
3. 支持Promise API和URI Templates
Promise是ES6的特性,Promise的中文含義為“先知”,Promise對象用于異步計算。
URI Templates表示URI模板,有些類似于ASP.NET MVC的路由模板。
4. 支持攔截器
攔截器是全局的,攔截器可以在請求發送前和發送請求后做一些處理。
攔截器在一些場景下會非常有用,比如請求發送前在headers中設置access_token,或者在請求失敗時,提供共通的處理方式。
在發送請求后,使用then方法來處理響應結果,then方法有兩個參數,第一個參數是響應成功時的回調函數,第二個參數是響應失敗時的回調函數。
then方法的回調函數也有兩種寫法,第一種是傳統的函數寫法,第二種是更為簡潔的ES 6的Lambda寫法:```
// 傳統寫法
this.$http.get('/someUrl', [options]).then(function(response){
// 響應成功回調
}, function(response){
// 響應錯誤回調
});
// Lambda寫法
this.$http.get('/someUrl', [options]).then((response) => {
// 響應成功回調
}, (response) => {
// 響應錯誤回調
});
支持的HTTP方法
get(url, [options])
head(url, [options])
delete(url, [options])
jsonp(url, [options])
post(url, [body], [options])
put(url, [body], [options])
patch(url, [body], [options])
發送get請求:
<body>
<div id="app">
<input type="button" v-on:click="get" value="get">
<p v-model="getInfo">{{getInfo}}</p>
</div>
</body>
<script>
var vue = new Vue({
el:"#app",
data:{
getInfo:"aa"
},
methods: {
get(){
this.$http.get('http://www.liulongbin.top:3005/api/getlunbo').then(res => {
console.log(res.body);
})
}
}
})
</script>
發送post請求:
postInfo() {
var url = 'http://www.liulongbin.top:3005/api/post';
// post 方法接收三個參數:
// 參數1: 要請求的URL地址
// 參數2: 要發送的數據對象
// 參數3: 指定post提交的編碼類型為 application/x-www-form-urlencoded
this.$http.post(url, { name: 'zs' }, { emulateJSON: true }).then(res => {
console.log(res.body);
});
}
發送JSONP請求獲取數據:
jsonpInfo() { // JSONP形式從服務器獲取數據
var url = 'http://www.liulongbin.top:3005/api/jsonp';
this.$http.jsonp(url).then(res => {
console.log(res.body);
});
}
通過接口獲取產品信息集合
<body>
<div id="app">
<input type="button" @click="getprodlist" value="getprodlist">
<p v-for="item in list" :key="item.id">
{{item.id}} -- {{item.name}} -- {{item.ctime}}
</p>
</div>
</body>
<script>
var vue = new Vue({
el:"#app",
data:{
list:[]
},
methods: {
getprodlist(){
this.$http.get('http://www.liulongbin.top:3005/api/getprodlist').then(res => {
//status message
console.log(res.body);
if(res.body.status == 0){
this.list = res.body.message;
}
})
}
}
})
</script>
什么是組件
組件是可復用的 Vue 實例,說白了就是一組可以重復使用的模板,跟 JSTL 的自定義標簽、Thymeleaf 的 th:fragment 等框架有著異曲同工之妙。
注意:在實際開發中,我們并不會用以下方式開發組件,而是采用 vue-cli 創建 .vue 模板文件的方式開發,以下方法只是為了讓大家理解什么是組件。
<div id="app">
<beixi></beixi>
</div>
<script>
//注冊組件
Vue.component("beixi",{
template:'<li>hello</li>'
});
var app = new Vue({
el:"#app",
});
</script>
Vue.component():注冊組件
beixi:自定義組件的名字
template:組件的模板
使用 props 屬性動態傳遞參數
v-for=“item in items”:遍歷 Vue 實例中定義的名為 items 的數組,并創建同等數量的組件
v-bind:value=“item”:將遍歷的 item 項綁定到組件中 props 定義的名為 value屬性上;= 號左邊的 value 為 props 定義的屬性名,右邊的為 item in items 中遍歷的 item 項的值
<body>
<div id="app">
<!--組件:使用props把值傳遞給組件-->
<blog-post v-for="item in items" v-bind:value="item"></blog-post>
</div>
<script>
Vue.component("blog-post",{
props:['value'],
template:'<li>{{value}}</li>'
});
var app = new Vue({
el:"#app",
data:{
items:['beixi','jzj','賈志杰']
}
});
</script>
</body>
什么是Axios
Axios 是一個開源的可以用在瀏覽器端和 NodeJS 的異步通信框架,她的主要作用就是實現 AJAX 異步通信
為什么要使用 Axios
由于 Vue.js 是一個 視圖層框架 并且作者(尤雨溪)嚴格準守 SoC (關注度分離原則),所以 Vue.js 并不包含 AJAX 的通信功能,為了解決通信問題,作者單獨開發了一個名為 vue-resource 的插件,不過在進入 2.0 版本以后停止了對該插件的維護并推薦了 Axios 框架。少用jQuery,因為它操作Dom太頻繁!
在線引入axios。在項目開發中會安裝axios組件(npm install axios)
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axios.get("http://localhost:9001/vue/get").then(function (response) {
console.log(response.data);
});
axios.post("http://localhost:9001/vue/post",{
name:"jack",
age:"23"
}).then(function (response) {
//console.log(response);
});
@RestController
@RequestMapping("vue")
public class VueTestController {
@RequestMapping("/get")
public User gerUser(){
User user = new User();
user.setName("jack");
user.setAge(12);
return user;
}
@PostMapping("/post")
public void setUser(@RequestBody User paramUser){
System.out.println(paramUser.getName());
System.out.println(paramUser.getAge());
}
}
并發請求
將多個請求同時發送,由服務端統計處理。
function getVue() {
axios.get("http://localhost:9001/vue/get").then(function (response) {
console.log(response.data);
});
}
function postVue() {
axios.post("http://localhost:9001/vue/post",{
name:"jack",
age:"23"
}).then(function (response) {
//console.log(response);
});
}
//返回結果處理
axios.all([getVue(),postVue()]).then(axios.spread(function (res1,res2) {
console.log(res1.data);
console.log(res2.data);
}));
什么是計算屬性
當一些數據需要根據其它數據變化時,需要進行處理才能去展示,雖然vue提供了綁定數據表達式綁定的方式,但是設計它的初衷只是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護,對于一些比較復雜和特殊的計算有可能就捉襟見肘了,而且計算的屬性寫在模板里也不利于項目維護
computed主要的作用:
分離邏輯(模板和數據分離)
??緩存值
??雙向綁定(getter,setter)
<body>
<div id="app">
<input type="text" v-model="num1"/><input type="text" v-model="num2"/>
<p>求和結果{{result}}</p>
</div>
</body>
<script>
var app=new Vue({
el:"#app",
data:{num1:1,num2:2},
computed:{//計算屬性
result:function(){
return parseInt(this.num1)+parseInt(this.num2);
}
}
})
</script>
npm安裝vue ,vue-cli
安裝node.js
從node.js官網下載并安裝node,安裝過程很簡單,一直點下一步就ok了
-- 鏡像加速
npm config set registry=http://registry.npm.taobao.org
安裝vue
安裝vue-cli
初始化vue項目目錄
啟動vue
安裝webpack
image.png