Props介紹
Props
作為元件的核心特性之一,也是我們平時開發Vue專案中接觸最多的特性之一,它可以讓元件的功能變得豐富,也是父子元件通訊的一個渠道。
【1】普通傳值
在元件的標籤上自定義屬性,用屬性繫結給改自定義屬性繫結一個變數,元件內部定義props陣列,將自定義的屬性名填入,即可在元件內使用父元件傳入的變數,變數名就是自定義的元件。
父元件
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
// 自定義屬性,並且繫結一個變數message
<index :mymessage="message"></index>
</div>
</template>
<script>
import index from "../components/index.vue";
export default {
name: 'HomeView',
data(){
return{
message:'hqq'
}
},
components: {
HelloWorld,
index
}
}
</script>
子元件
<template>
<div class="index">
<h1>我是小元件</h1>
<button @click="handleShow">點我看控制檯</button>
</div>
</template>
<style scoped>
</style>
<script>
export default {
name: 'index',
data(){
return{
name:''
}
},
methods:{
handleShow(){
console.log(this.mymessage)
}
},
// 使用props陣列接收mymessage自定義屬性名,就可以在當前元件使用這個變數
props:['mymessage']
}
</script>
【2】限制資料型別
透過給子元件的props傳一個物件{{自定義屬性名: 資料型別}}
這樣子就會限制父元件傳來的資料的型別,如果傳了不同的型別的資料,瀏覽器控制檯會警告,但是不會直接報錯。
子元件
<script>
export default {
name: 'index',
data() {
return {
name: ''
}
},
methods: {
handleShow() {
console.log(this.mymessage)
}
},
// 給props傳一個物件
props: {mymessage: String}
}
</script>
【3】傳物件
這樣做可以對父元件傳來的資料進一步限制
子元件
props: {
name:'mymessage', // 自定義屬性名
required:true, // 是否是必須填的
type:String, // 限制資料型別
default:'隔壁老王來了' // 預設值
}
混入
mixin
混入,可以把多個元件共用的配置提取成一個混入物件,這樣就不需要在每個元件都寫了。
就相當於寫了一個功能,很多個頁面都需要用這個功能,這時候就可以把這個功能封裝起來,下次需要使用的時候直接匯入就行
【1】封裝 匯出
最好建立一個資料夾,mixin,再建立一個index.js,在這裡面寫封裝的功能
const hunru = {
data() {
return {
title: '好好學習'
}
},
methods: {
handleClick() {
alert(this.title)
console.log(this.title)
}
}
}
// 一定要把功能匯出
export default hunru
【2】匯入
在需要使用的頁面匯入該模組,配置mixins屬性
<template>
<div class="about">
<h1>This is an about page</h1>
<button @click="handleClick">彈窗</button>
</div>
</template>
<script>
// 匯入模組
import hunru from "@/mixin";
export default {
name:'about',
data(){
return{
}
},
methods:{},
// 配置mixins 將模組名填入陣列
mixins:[hunru]
}
</script>
【3】全域性使用
上面的方法都是區域性使用的方法,也可以進行全域性配置,在main.js裡面進行全域性配置
import hunru from "@/mixin";
Vue.mixin(hunru)
外掛
外掛其實就是vue的增強功能,通常用來為vue新增全域性功能
【1】常見功能
一般有以下幾種功能
- 新增全域性方法或者 property。如: vue-custom-element
- 新增全域性資源: 指令/過濾器/過渡等。如 vue-touch
- 透過全域性混入來新增一些元件選項。如 vue-router
- 新增 Vue 例項方法,透過把它們新增到 Vue.prototype 上實現。
- 一個庫,提供自己的 API,同時提供上面提到的一個或多個功能。如 vue-router
【2】開發外掛
開發外掛也叫定義外掛,主要是透過install方法來暴露的,引數,vue例項以及自定義引數。無論在install中寫什麼,vue都會替你執行
export default {
install(a) {
// 1 定義全域性變數
Vue.prototype.name = 'hqq'
// 2 定義全域性變數最好加上$字首,防止汙染
Vue.prototype.$axios = axios
// 3 可以直接定義一個函式,如登入,以後要登入直接呼叫即可
Vue.prototype.$login = (url, username, password) => {
axios.post('http://127.0.0.1:8000/api/v1/user/login/', {
username: username,
password: password
})
.then((response) => {
alert('登入成功')
})
}
}
}
export default {
install: function(Vue) {
console.log('Vue', Vue);
// 1. 新增全域性方法或 property
Vue.myGlobalMethod = function () {
console.log('這是外掛的全域性方法');
}
// 2. 新增全域性資源
Vue.directive('my-directive', {
bind (el, binding, vnode, oldVnode) {
console.log('這是外掛的全域性指令');
}
})
// 3. 注入元件選項
Vue.mixin({
created: function () {
console.log('這是外掛的混入');
}
})
// 4. 新增例項方法
Vue.prototype.$myMethod = function (methodOptions) {
console.log('這是外掛的例項方法');
}
}
}
【3】使用外掛
使用外掛分為全域性引用和區域性引用
全域性引用
在main.js中引入並且使用
// 引入
import my from '@/plugins'
// 使用
Vue.use(my)
區域性引用
區域性引用,在需要用到外掛的頁面use就行
<script>
// 匯入外掛
import my from '../plugins'
// 匯入Vue例項
import Vue from "vue";
export default {
name: 'HomeView',
created() {
console.log(this.name)
// 使用外掛
Vue.use(my)
// 輸出外掛裡面定義的name
console.log('hahaha',this.name)
}
}
</script>
插槽
Vue插槽的主要作用是承載分發內容的出口,分為匿名插槽具名插槽和作用域插槽三種
以下面為例子
- child.vue:封裝 name 為 ChildExample 的元件
- parent.vue:引入 child.vue,呼叫 ChildExample 元件
【1】匿名插槽
<slot> </slot>
是最常用的插槽,根據需要自定義內容
// child.vue
<slot></slot>
// parent.vue
<child-example>
<span>這是匿名插槽的內容</span>
</child-example>
【2】具名插槽
假設一個插槽滿足不了要求,需要設定多個插槽,那麼就必須要給插槽賦name值
匿名插槽是特殊的具名插槽,它的name為default
// child.vue
<slot name="left"></slot>
<slot name="right"></slot>
// parent.vue
<child-example>
<span slot="left">這是具名插槽left的內容</span>
<!-- 2.6.0 + -->
<template v-slot:right>
<span>這是具名插槽right的內容</span>
</template>
</child-example>
本地儲存
本地儲存通常用於儲存使用者登入資訊
通常有三種方式sessionStorage,localStorage和vue-cookies
vue-cookies是第三方外掛,需要下載
【1】sessionStorage和localstorage的區別
- sessionStorage 中的資料僅在當前會話有效,也就是說當使用者增加了標籤頁或者關閉瀏覽器之後,儲存的資料就會丟失。
- localstorage 中的資料可以說是永久有效的,只要使用者不主動清除,就會一直存在。
【2】操作sessionStorage
// 增
sessionStorage.setItem(‘key’, ‘value’)
// 查
sessionStorage.getItem(‘key’)
// 刪除單個key資料
sessionStorage.removeItem(‘key’)
// 清除sessionStorage所有資料
sessionStorage.clear()
【3】操作localstorage
// 增
localstorage.setItem(‘key’, ‘value’)
// 查
localstorage.getItem(‘key’)
// 刪除單個key資料
localstorage.removeItem(‘key’)
// 清除sessionStorage所有資料
localstorage.clear()
【3】使用vue-cookies
這是一個簡單的Vue.js外掛,專門用於在vue中處理瀏覽器的cookie操作,vue-cookie
s沒有依賴關係,它可以獨立存在,對vuejs友好。
安裝 引用
// 安裝
npm install vue-cookies --save
// 引用
import Vue from 'vue'
import VueCookies from 'vue-cookies'
Vue.use(VueCookies)
API
//不寫過期時間,預設為1天過期
this.$cookies.set("token","123456")
// 1天過期,忽略大小寫
this.$cookies.set("token","12346","1d")
this.$cookies.set("token","123456","1D")
// 以秒為單位,設定1天過去
this.$cookies.set("token","123456",60 * 60 * 24)
// 填寫Date物件,明確指定過期時間
this.$cookies.set("token","123456", new Date(2020, 10, 01))
// 填寫一個時間字串,指定過期時間
this.$cookies.set("token","123456", "Sat, 13 Mar 2017 12:25:57 GMT")
//瀏覽器會話結束時過期
this.$cookies.set("token","input_value","0");
//永不過期
this.$cookies.set("token","input_value",-1);