1. 程式人生 > 實用技巧 >Vue的基本使用

Vue的基本使用

Vue的基本使用

一. Vue.js之細節分析

1.例項引數分析

  • el:元素的掛載位置(值可以是CSS選擇器或者DOM元素)

  • data 模型資料(值是一個物件)

  • methods:{} 方法區: 裡面放的函式

  • computed:{}計算屬性區:,計算屬性定義在computed裡面

  • watch:{} 監聽器: 資料變化時執行非同步或者開銷較大的操作,資料一旦發生變化就通知監聽器所繫結的方法

  • mounted: function(){}鉤子函式: 該生命週期鉤子函式被觸發的時候,模版已經可以使用,

    一般此事用於獲取後臺資料,然後把資料填充到模版

  • components:{} 區域性元件 ,放到components:{}中的組建只有本類中可以使用

2.插值表示式用法

  • 將資料填充到HTML標籤中

  • 插值表示式指出基本的計算操作

  • 語法: {{}}

    <body>
    <div id="app">
    <!-- 插值表示式 ,頁面顯示data裡面msg裡的值Hello Vue-->
    <!-- 插值表示式還支援下面的一些基本計算和資料拼接-->
    <div>{{msg}}</div>
    <div>{{1+2}}</div>
    <div>{{msg+'----'+123}}</div>
    </div>
    <script src="js/vue.js"></script>
    <script>
    var vm= new Vue({
    el:'#app',
    data:{
    msg:'Hello Vue'
    }
    })
    </script>
    </body>

3.陣列相關API

3.1 變異方法(修改原有資料)
  • Push() 在陣列尾部新增新元素。(尾部新增)

  • Pop() 取出陣列尾部元素。(尾部取出)

  • Shift() 取出陣列頭部元素。(頭部取出)

  • Unshift() 在陣列頭部新增新元素。(頭部新增)

  • Splice() 向陣列中新增,刪除 元素,然後返回被刪除的元素

  • Sort() 對陣列的元素進行排序. 升序

  • Reverse() 對陣列的元素進行排序. 降序

3.2 替換陣列(生成新的陣列)
  • Filter(). 通過檢查指定陣列中符合條件的所有元素

  • Concat() 連線兩個或更多的陣列,並返回結果

  • Slice() 從已有的陣列中返回選定的元素

  • Some(). 用於檢測陣列中的元素是否滿足指定條件,如果滿足,返回true,剩下的不會執行

3.3 修改響應式資料
  • Vue.set(vm.items,indexOfltem,newValue)

  • vm.$set(vm.items,indexOfltem,newValue) 和前面的小效果一樣,只是寫法不同

    1⃣️ 引數一表示要處理的陣列名稱

    2⃣️ 引數二表示要處理的陣列索引

    3⃣️ 引數三表示要處理的陣列的值

<body>
<div id="app">
<ul>
<li v-for="item in list">{{item}}</li>
</ul>
</div>
<script src="../../js/vue.js"></script>
<script>

var vm = new Vue({
el: '#app',
data: {
list:["apple","orange","banana"]
},
})
//把陣列中第二個資料改成茄子
vm.$set(vm.list,1,"茄子")
</script>
</body>

二. Vue模版語法

前段渲染方式

  • 插值表示式

  • 指令

  • 事件繫結

  • 屬性繫結

  • 樣式繫結

  • 分支迴圈結構

2.指令

2.1 資料繫結指令
  • v-text 填充純文字

    1⃣️ 相比插值表示式更加簡潔

  • V-html 填充HTML片段

    1⃣️ 存在安全問題

    2⃣️ 本網站內部資料可以使用,來自第三方的資料不可以用

  • v-pre 填充原始資訊

    1⃣️ 顯示原始資訊,跳過編譯過程

       <div>v-html="msg"</div> <!--和插值表示式一樣頁面顯示的是data裡msg的值-->
    <div>v-text='msg'</div><!--和插值表示式一樣頁面顯示的是data裡msg的值,不安全!-->
    <div>v-pre="msg"</div><!--頁面顯示的是msg,而不是msg的值-->
2.2 資料響應式
  • 如何理解響應式

    1⃣️ html5中的響應式(螢幕尺寸的變化導致樣式的變化)

    2⃣️ 資料的響應式(資料的變化導致頁面內容的變化)

  • 什麼是資料繫結

    1⃣️ 資料繫結: 將資料填充到標籤中

    2⃣️ vue是雙向繫結,用v-model繫結可以實現

  • v-once只編譯一次

    1⃣️ 實現內容之後不再具有響應式功能

2.3自定義指令
  • 自定義指令用法

    <input type="text" v-focus>

3.事件繫結

3.1vue如何處理事件?
  • v-on指令用法

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

  • V-on. 縮寫: @

    <input type=''button" @click=''''/>

3.2事件函式的呼叫方式
  • 直接繫結函式名稱,無引數,預設有一個事件物件

    <button @click="say">Hello</button>

  • 呼叫函式(有引數)

    <button @click="say(123,333,$event)">Hello</button>

    <body>
    <div id="app">
    <div>{{num}}</div>
    <!-- 直接呼叫,預設會有事件函式-->
    <button @click="handle">點選1</button>
    <!-- 可以傳引數,$event事件函式要手動新增,必須在最後一個-->
    <button @click="handle(123,456,$event)">點選2</button>

    </div>
    <script src="js/vue.js"></script>
    <script>
    var vm= new Vue({
    el:'#app',
    data:{
    num:0,
    },
    methods:{
    /*
    事件繫結-引數傳遞
    1。如果事件直接繫結函式名稱,那麼預設會傳遞事件物件作為事件函式的第一個引數
    *2。如果時間繫結函式呼叫,(傳遞引數),那麼事件物件必須在最後一個
    3。$event事件函式是固定寫法
    */
    handle:function (p,k,event) {
    //這裡的引數就是獲取到的引數123,和456
    console.log(p,k)
    //$event是事件物件,
    //$event.target則指的是事件觸發的目標,即哪一個元素觸發了事件,這將直接獲取該dom元素
    console.log(event.target)

    // 這裡的this是Vue的例項物件
    this.num++;
    }
    }
    })
    </script>
    </body>

3.3事件修飾符
  • .stop阻止冒泡

  • .prevent阻止預設行為

3.4 按鍵修飾符
  • .enter 回車鍵

    <input v-on :keyup.enter="submit">

  • .delete 刪除鍵

    <input v-on :keyup.delete="handle">

3.5 簡易得計算機案例
  • 實現邏輯

  • 1.先繫結input a,input b. ,input 結果

  • 2.data裡面定義a、b、結果三個熟悉

  • 然後點選按鈕觸發事件,在方法裡寫相加的邏輯

<body>
<div id="app">
<h1>簡易計算機</h1>
<div>
<span>數值A:</span>
<span><!--繫結a-->
<input type="text" v-model="a">
</span>
</div>
<div>
<span>數值B:</span>
<span><!--繫結b-->
<input type="text" v-model="b">
</span>
</div>
<div>
<button @click="handel">計算</button>
</div>
<div>
<span>計算結果</span>
<!--繫結result-->
<span v-text="result"></span>
</div>
</div>
<script src="js/vue.js"></script>
<script >
var vm= new Vue({
el:'#app',
data:{
a:'',
b:'',
result:''
},
methods:{
handel:function () {
//實現計算邏輯
// parseInt(this.a)轉換成int ,不轉換的話是就會拼接
this.result= parseInt(this.a)+ parseInt(this.b);
}

}
})
</script>
</body>

4.屬性繫結

4.1 vue如何動態處理屬性?
  • v-bind指令用法

    <a v-bind:href="url"></a>

  • 縮寫形式

    <a :href="url"></a>

<body>
<div id="app">
<!-- v-bind是屬性繫結 ,簡寫成 :-->
<!-- 現在就是綁定了data裡面的url的地址-->
<a :href="url">跳轉</a>
<button @click="handle">切換</button>
</div>
<script src="js/vue.js"></script>
<script >
var vm= new Vue({
el:'#app',
data:{
url:'http://www.baidu.com'
},
methods:{
handle:function () {
//修改URL的地址
this.url='http://itcast.cn';
}

}
})
</script>
</body>
4.2 v-model的底層實現原理分析
  • v-model其實就是v-bind和v-on組合起來的

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

5.樣式繫結

5.1 class樣式處理
  • 物件語法

    <div v-bind:class="{active: isActive}"></div>
  • 陣列語法

    <div v-bind:class="{a,b}"></div>

5.2 Style樣式處理
  • 物件語法

    <body>
    <div id="app">
    <!-- //內聯樣式Style-->
    <div v-bind:style="{border:borderStyle1,width:widthStyle,height:heightStyle}"></div>
    <!-- //內聯繫結物件-->
    <div v-bind:style="objStyles"></div>

    <button v-on:click="handle">切換</button>
    </div>
    <script src="js/vue.js"></script>
    <script >
    var vm= new Vue({
    el:'#app',
    data:{
    borderStyle1:"1px solid blue",
    widthStyle:"100px",
    heightStyle:"200px",

    objStyles:{ /*物件*/
    border:"1px solid green",
    width:"200px",
    height:"100px"
    }
    },
    methods:{
    handle:function () {
    //點選事件之後可以把高度切換成100px
    this.heightStyle='100px';
    //點選事件之後可以把物件裡面的寬度切換成30px
    this.objStyles.width="30px";
    }
    }
    })
    </script>
    </body>

6.分支迴圈結構

6.1 分支結構
  • v-if

  • v-else

  • V-else-if

  • V-show

6.2 迴圈結構
  • v-for遍歷陣列

    <li v-for="item in list">{{item}}</li>

三. Vue常用特性

常用特性概覽

  • 表單操作

  • 計算屬性

  • 過濾器

  • 監聽器

  • 生命週期

1.表單操作

1.1基於Vue的表單操作
  • Input 單行文字

  • textarea 多行文字

  • select 下拉多選

  • Radio 單選框

  • Checkbox 多選框

<body>
<div id="app">
<form>
<!-- input單行表單-->
<div>
<span>姓名:</span>
<span>
<!-- v-model預設是雙向繫結-->
<input type="text" v-model="name1">
</span>
</div>
<!-- 單選按鈕-->
<div>
<span>性別</span>
<span>
<!-- v-model繫結-->
<input type="radio" id="male" value="1" v-model="gender">
<label for="male">男</label>
<input type="radio" id="female" value="2" v-model="gender">
<label for="female"></label>
</span>
</div>
<!-- 多選按鈕 -->
<div>
<span>愛好</span>
<input type="checkbox" id="ball" value="1" v-model="aihao">
<label for="ball">籃球</label>
<input type="checkbox" id="pai" value="2" v-model="aihao">
<label for="pai">排球</label>
<input type="checkbox" id="pingpang" value="3" v-model="aihao">
<label for="pingpang">乒乓球</label>
</div>
<!-- 下拉框 -->
<div>
<span>職業</span>
<select v-model="zhiye">
<option value="0">請選擇職業</option>
<option value="1">教師</option>
<option value="2">程式設計師</option>
<option value="3">電焊工</option>
</select>
</div>
<!-- 多行文字框-->
<div>
<span>個人簡介</span>
<textarea name="" id="" cols="30" rows="10">

</textarea>
</div>
<div>
<!-- .prevent阻止預設行為-->
<input type="submit" @click.prevent="handel">
</div>
</form>
</div>
<script src="../js/vue.js"></script>
<script>

var vm = new Vue({
el: '#app',
data: {
name1: "ddd",
gender: 2,
aihao: [2, 3],
zhiye: 3
},
methods: {
handel: function () {
// 選到女的性別上
alert(this.gender)
},

}

})
</script>
</body>
1.2 表單域修飾符
  • Number:轉化為數值

  • Trim:去掉開始和結尾的空格

  • Lazy:將input事件切換為chang事件

2.計算屬性

2.1計算屬性是基於data裡的資料來計算的, 在computed:{}裡面通過函式的方式定義計算邏輯
<body>
<div id="app">
<div>
{{reverseString}}
</div>
</div>
<script src="../js/vue.js"></script>
<script>

var vm = new Vue({
el: '#app',
data: {
msg:'hello'
},
methods: {

},
//計算屬性,計算屬性定義在computed裡面
//計算屬性存在快取,方法沒有快取!
computed:{
reverseString:function () {
//反轉字串
return this.msg.split('').reverse('');
}

}

})
</script>
</body>
2.2 計算屬性與方法的區別
  • 計算屬性是基於它們的依賴進行快取的

  • 方法不存在快取

3.偵聽器

3.1 監聽器的使用場景
  • 資料變化時執行非同步或者開銷較大的操作,資料一旦發生變化就通知監聽器所繫結的方法

  //監聽器 ,定義在 watch:{}裡面
watch:{
//監聽名,如果名發生變化,把名的變化賦值給姓名
ming:function (value) {
this.xingMing= this.ming+" "+value;
},
//監聽姓,如果發生變化賦值給姓名
xing:function (value) {
this.xingMing=this.xing+" "+value;

}
}

4.過濾器

4.1 過濾器是什麼
  • 格式化資料,比如將字串格式化為首字母大寫,將日期格式化為制定的格式等

4.2 自定義過濾器
<body>
<div id="app">
<input type="text" v-model="msg">
<!-- 過濾器用法,| 後面跟上過濾器的名字-->
<div>{{msg | upper}}</div>
</div>
<script src="../js/vue.js"></script>
<script>
/**
* 自定義過濾器
* Vue.filter呼叫過濾器
*/
Vue.filter("upper",function (val) {
/**
* 過濾器> 需求:將首字母變成大寫
* 思路:
* 1。原生js的 .charAt(0)獲取到第一個字母
* 2. .toUpperCase()方法把字母變成大寫
* 3。 。slice(1)從第二個字母擷取到最後
*/
return val.charAt(0).toUpperCase() + val.slice(1);
})
var vm = new Vue({
el: '#app',
data: {
msg:"",
},
methods: {
}
})
</script>
</body>

4.3 過濾器的使用

<div>{{msg | upper}}</div>
<div>{{msg | upper | lower}}</div>
<civ v-bind:id='id | formatId'> </div>

5.生命週期

5.1 vue的生命週期是什麼
  • vue每個元件都是獨立的,每個元件都有一個屬於它的生命週期,從一個元件建立、資料初始化、掛載、更新、銷燬,這就是一個元件所謂的生命週期

四. 元件化開發

目錄

  • 元件註冊

  • Vue除錯工具用法

  • 元件間資料互動

  • 元件插槽

  • 基於元件的案例

1.元件註冊

1.1 全域性元件註冊語法

Vue.component(元件名稱,{

data: 元件資料,

Template: 元件模版內容

})

<body>
<div id="app">
<!-- 使用元件-->
<button-counter></button-counter>
</div>
<script src="../js/vue.js"></script>
<script>
<!-- 全域性註冊元件-->
Vue.component("button-counter",{
data:function () {
return{
count :0
}
},
template:'<button @click="count++">點選了{{count}}次</button>'
})
var vm = new Vue({
el: '#app',
data: {
},
})

</script>
</body>
1.2 元件用法
<div id="app">
<!-- 使用元件 <button-counter>是全域性註冊的元件名 -->
<button-counter></button-counter>
</div>
1.3 區域性元件註冊
  • 區域性元件就是把元件放到 components:{}中

 var vm = new Vue({
el: '#app',
data: {
},
components: { //區域性元件
//Helloword是定義好的元件引入進來,然後賦值給左邊
'hello-word':Helloword,
}
})

2.元件間資料互動

2.1 父元件向子元件傳值
  • 父元件通過屬性將值傳遞給子元件,子元件通過props:[] 來接收

    <body>
    <div id="app">
    <!-- 父元件通過屬性將值傳遞給子元件,子元件通過props來接收-->
    <menu-item title="來自父元件的值"></menu-item>
    </div>
    <script src="../js/vue.js"></script>
    <script>
    /**
    * 父元件向子元件傳值
    */
    Vue.component('menu-item', {
    props: ['title',],/*props用來接受父元件的值,props後面跟著陣列*/
    data: function () {
    return {
    msg: '子組建本身的資料'
    }
    },
    template: '<table>{{msg+"----"+title}}</table>'
    })
    var vm = new Vue({
    el: '#app',
    data: {
    pmsg: '父元件中的內容'
    }
    })
    </script>
    </body>
2.2 props熟悉名規則
  • 在props中使用駝峰形式,模版中需要使用短橫線的形式 (最好都用短橫線比較好)

3.元件插槽

  • <slot></slot>是插槽的固定寫法 可以在定義好的元件名中間寫內容

<body>
<div id="app">
<!-- 插槽是在兩個<alert-box>中間寫內容-->
<alert-box>有一個錯誤</alert-box>
</div>
<script src="../js/vue.js"></script>
<script>
/*
元件插槽
<slot></slot>是插槽的固定寫法 可以在<alert-box></alert-box>中間寫內容
*/
Vue.component('alert-box',{
template:`<div>
<strong>ERROR</strong>
<slot></slot>
</div>`
}

)
var vm = new Vue({
el: '#app',
data: {
},
})
</script>
</body>

五. 前後端互動模式

目錄

  • URL地址格式

  • Promise用法

  • 介面呼叫-axios用法

  • 介面呼叫-async/await用法

1. URL地址格式

1.1 傳統形式的URL
  • 格式: Schema: //host:port/path?query#fragment

    1⃣️ schema: 協議。例如http、https、ftp等

    2⃣️ host: 域名或者IP地址

    3⃣️ port: 埠, http預設埠80,(可以省略)

    4⃣️ path: 路徑, 例如/abc/a/c

    5⃣️ query: 查詢引數,

    6⃣️ fragment: 錨點(Hash),用於定位頁面的某個位置

1.2 Restful形式的URL
  • HTTP請求方式

    1⃣️ GET 查詢

    2⃣️ POST 新增

    3⃣️ PUT 修改

    4⃣️ DELETE 刪除

2. Promise

2.1 Promise基本用法
  • 例項化Promise物件,建構函式中傳遞函式,該函式處於非同步任務

  • resolvereject兩個引數用於處理成功和失敗兩種情況,並通過p.then獲取處理結果

3.axios

3.1.GET傳遞引數 DELETE與之類似
  • 通過URL方式傳遞參

axios.get('/adata?id=123')
.then(ret=>){
console.log(ret.data)
})
  • 通過Restful方式傳參

axios.get('/adata/id/123')
.then(ret=>){
console.log(ret.data)
})
  • 通過params方式傳參

axios.get('/adata',{
params:{
id:123,
name:'張三'
}
}).then(ret =>{
console.log(ret.data)
})

3.2.POST傳遞引數, put與之類似
  • 通過選項傳遞引數(預設傳遞的是json格式的資料)

axios.post('/adata',{
uname:'tom',
pwd:123
}).then(ret =>{
console.log(ret.data)
})
  • 通過URLSearchParams傳遞引數

 //先例項化URLSearchParams物件,然後把引數append進去,
//然後物件作為引數傳遞
var params= new URLSearchParams();
params.append('uname','張三')
params.append('pwd','111')
axios.post('/adata',params).then(ret =>{
console.log(ret.data)
})
3.3 axiom 的全域性配置
  • axios.defaults.timeout=3000; //超時時間

  • axios.defaults.baseURL=' http://localhost:3000/aaa'. //預設地址

  • axios.defaults.headers[ 'muytoken' ] ='aqafgsadfgadfgadfg'. //設定請求頭

4. async/await用法

4.1 async/await的基本用法
  • async/await是Es7引入的新語法,可以更加方便的進行非同步操作

  • async關鍵字用在函式上(async函式的返回值是Promise例項物件)

  • await關鍵字用於async函式當中(await可以得到非同步的結果)

/**
1. 先在函式的前面加上async
2. 然後再在函式裡面用await得到非同步的結果 ,await後面跟一個Promise例項物件
*/
async function queryData(id){
const ret = await axios.get('/data');
console.log(ret.data) //就可以直接得到data物件

}

六. 路由

目錄

  • vue-router 的基本使用

  • vue-router 巢狀路由

  • vue-router 動態路由匹配

  • vue-router 命名路由

  • vue-router 程式設計式導航

1. 路由的基本使用

1.1 配置路由規則並建立路由例項
var router= new VerRouter({
//routes是路由規則陣列
routes:[
//每個路由規則都是一個配置物件,其中至少包含path和 component 兩個屬性
//path 表示當前路由規則匹配的 hash 地址
//component 表示當前路由規則對應要展示的元件
{ path:'/user',component: User},
{path: '/register', component :Register}
]
})
1.2 路由重定向
  • redirect: 是重定向的地址

var router= new VerRouter({
//routes是路由規則陣列
routes:[
//其中,path 表示需要被重定向的原地址,redirect 表示將要被重定向到的新地址
{ path:'/',redirect:'login'},
]
})