精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Vue真是太好了 壹萬多字的Vue知識點(diǎn) 超詳細(xì)!

?1??、Vue和其他兩大框架的區(qū)別


?3??、MVVM


?4??、Vue指令

?4??.?1?? v-text

說明: 文本數(shù)據(jù)渲染
用法: v-text = 'Vue實(shí)例中的數(shù)據(jù)' => 簡寫 {{Vue實(shí)例中的數(shù)據(jù)}}

相當(dāng)于JavaScript中的innerText

?4??.?1??.?2?? v-text指令 和 {{ }}插值表達(dá)式 的區(qū)別

?4??.?2?? v-html

說明: HTML渲染數(shù)據(jù)
用法:v-html = 'Vue實(shí)例中的數(shù)據(jù)'
會解析html結(jié)構(gòu) 渲染至頁面

相當(dāng)于JavaScript中的innerHTML

?4??.?2??.?1?? v-html指令 和 v-text指令的區(qū)別

注意: 在網(wǎng)站上動態(tài)渲染任意的 HTML 是非常危險(xiǎn)的!!! 因?yàn)槿菀讓?dǎo)致 XSS 攻擊 只在可信內(nèi)容上使用 v-html 絕對不要用在用戶通過(提交)的內(nèi)容上使用

?4??.?3?? v-on

說明: 事件綁定(綁定事件監(jiān)聽器)
用法: v-on:事件名 = '事件處理函數(shù)' => 簡寫 @事件名 = '事件處理函數(shù)'

?4??.?3??.?1?? 詳細(xì)用法

  1. $event.target 獲取當(dāng)前事件觸發(fā)的DOM元素
  2. $event.path[0](el.path[0]) 也可以獲取當(dāng)前事件觸發(fā)的DOM元素 path數(shù)組中有從觸發(fā)事件源的元素的所有上一級元素 直到window
  3. 實(shí)參不傳遞(沒有任何參數(shù)) 默認(rèn)在形參中第一個(gè)就是事件參數(shù)
    實(shí)參傳遞 就必須傳遞$event 來獲取獲取事件參數(shù)

?4??.?3??.?2?? 事件修飾符

面試問及

之前在使用餓了么UI的時(shí)候給一個(gè)組件添加一個(gè)原生的事件
但是一直觸發(fā)不了
后面查閱文檔發(fā)現(xiàn)這個(gè)組件內(nèi)部并沒有注冊我使用的原生事件
事件修飾符.native就可以直接監(jiān)聽并觸發(fā)組件的原生事件

?4??.?4?? v-bind

說明: 屬性綁定(行內(nèi)屬性)
用法: v-bind:屬性名='Vue實(shí)例中的數(shù)據(jù)' => 簡寫 :屬性名='Vue實(shí)例中的數(shù)據(jù)'
當(dāng)Vue實(shí)例中的數(shù)據(jù)改變之后 頁面會同步更新

?4??.?4??.1?? 屬性綁定修飾符

?4??.?4??.2?? 對象的方式綁定class

isRed = true 就有red這個(gè)類
isRed = false 就沒有red這個(gè)類
isRed 在 Vue 實(shí)例data中聲明

class = 'red' :class = '{'yellow' : isYellow}'

?4??.?4??.3?? 對象的方式綁定style

?4??.?5?? v-model

說明: 雙向數(shù)據(jù)綁定
用法: v-model = 'Vue實(shí)例中的數(shù)據(jù)'

?4??.?5??.?1?? 雙向

?4??.?5??.?2?? 雙向綁定修飾符

注意: v-model 只能設(shè)置給from表單屬性

?4??.?6?? v-for

說明: 循環(huán)渲染
用法: v-for = '(item,index) in items' :key = 'index'

items是源數(shù)據(jù)數(shù)組
item是被迭代的數(shù)組元素的別名
index是被迭代的數(shù)組元素的下標(biāo)(索引)

?4??.?6??.?1?? :key

?4??.?6??.?2?? 遍歷數(shù)組注意點(diǎn)

push()
pop()
shift()
unshift()
splice()
sort()
reverse()
...

這種修改數(shù)組中的元素是無法實(shí)現(xiàn)數(shù)據(jù)改變后頁面會同步改變(只會修改data中的數(shù)據(jù) 但是頁面不會同步改變)

?4??.?7?? v-if,v-else,v-else-if

說明: 條件(表達(dá)式或布爾值)判斷渲染
用法:
v-if = '表達(dá)式或布爾值'
v-else-if = '表達(dá)式或布爾值'
v-else

?4??.?7??.?1?? 注意

v-if 和 v-else-if 后面必須跟表達(dá)式或布爾值
v-else-if 和 v-else 不能獨(dú)立使用 必須跟在 v-if 后面

?4??.?8?? v-show

說明: 條件渲染
用法: v-show = '表達(dá)式或布爾值'
根據(jù)表達(dá)式或布爾值的真假切換元素的display屬性

?4??.?8??.?1?? 注意

v-show 不支持 <template>元素 也不支持 v-else

?4??.?9?? v-if vs v-show

都是用來判斷渲染數(shù)據(jù)的

1.有較高的切換性能消耗
2.惰性渲染 第一次如果條件為false 則不會渲染到頁面 需要等后面條件切換后才會進(jìn)行第一次渲染
3.條件切換是切換DOM數(shù)中這個(gè)元素的移除或添加
4.如果運(yùn)行時(shí)條件很少改變則使用v-if

1.有較高的初始渲染消耗
2.初始渲染 不管條件 第一次加載頁面的時(shí)候都會渲染到頁面
3.條件切換只是切換元素的display屬性
4.如果運(yùn)行時(shí)條件會非常頻繁的切換則使用v-show

?4??.??1??0?? v-cloak

說明: 這個(gè)指令保存在這個(gè)元素上 直到關(guān)聯(lián)實(shí)例結(jié)束編譯

?4??.??1??0??.?1?? 詳細(xì)說明

插值表達(dá)式在網(wǎng)絡(luò)較滿的情況下可能會出現(xiàn)數(shù)據(jù)閃爍問題
可以通過給實(shí)例(#app)盒子添加一個(gè) v-cloak 指令
通過這個(gè)指令的特性(如頁面中還有插值表達(dá)式就會存在這個(gè)指令 如果頁面的插值表達(dá)式都被替換成數(shù)據(jù) 就會自動移除這個(gè)標(biāo)簽)
配合css [v-cloak]{display:none|opacity:0}來解決數(shù)據(jù)閃爍的問題

?4??.??1??1?? v-once

說明: 這個(gè)指令添加的元素 內(nèi)部的胡子語法只會在第一次渲染的時(shí)候執(zhí)行解析一次 后面數(shù)據(jù)發(fā)生改變后也不會觸發(fā)更新

?4??.??1??1??.?1?? 用途

某些元素只需要解析一次 后續(xù)不需要更新 就可以使用這個(gè)指令 提升性能


?5??、Vue實(shí)例

?5??.?1?? el

?5??.?2?? data

?5??.?3?? methods

?5??.?4?? computed

1.使用get和set函數(shù) 需要把計(jì)算屬性函數(shù)改成計(jì)算屬性對象
2.計(jì)算屬性默認(rèn)執(zhí)行g(shù)et方法(根據(jù)相關(guān)的數(shù)據(jù)計(jì)算返回當(dāng)前屬性的值)
3.當(dāng)計(jì)算數(shù)學(xué)值自身改變后執(zhí)行set方法
4.可以用來計(jì)算稅前和稅后的互推算

?5??.?5?? watch

watch: {  // watch里面的 $router 這些對象前面不要帶this  '$route.path'(newVal, oldVal) {    if (newVal.indexOf('/login') >= 0) {      this.welcom = '歡迎登陸';    }    if (newVal.indexOf('/register') >= 0) {      this.welcom = '歡迎注冊';    }  }}

1.偵聽器用來檢測數(shù)據(jù)的改變
2.當(dāng)偵聽的那個(gè)數(shù)據(jù)發(fā)生改變后就會觸發(fā)偵聽器中的對應(yīng)函數(shù)
3.一般我更多的使用是用偵聽路由的變化 => 重新獲取數(shù)據(jù)(如搜索在對應(yīng)的router-view中顯示對應(yīng)的數(shù)據(jù))
4.之前碰到過一個(gè)坑點(diǎn) 偵聽器默認(rèn)無法偵聽復(fù)雜數(shù)據(jù)類型
5.后面使用深度偵聽 depp:true 來解決了這個(gè)問題
6.或者偵聽精確到對象中的那個(gè)值也可

?5??.?6?? computed和watch的區(qū)別

?5??.?7?? components

?5??.?8?? filters

Vue.filter('formatData', (形參=管道符前面的數(shù)據(jù),形參=想要傳入的數(shù)據(jù)...) => {    處理數(shù)據(jù); `返回`處理之后的數(shù)據(jù)});

?6??、Vue實(shí)例中的this


?7??、Vue實(shí)例屬性

?7??.?1?? vm.$data

獲取data中的所有數(shù)據(jù)

?7??.?2?? vm.$options

用于當(dāng)前Vue實(shí)例的初始化選項(xiàng) 可以獲取自定義選項(xiàng)

new Vue({  customOption: 'foo',  created: function () {    console.log(this.$options.customOption) // => 'foo'  }})

?7??.?3?? vm.$refs


?8??、Vue組件

?8??.?1?? 什么是組件

組件的出現(xiàn)就是為了拆分Vue實(shí)例的代碼量 能夠讓我們以不同的組件來劃分不同的功能模塊 需要什么功能就去調(diào)用對應(yīng)的模塊即可 局部功能界面

?8??.?2?? 組件化和模塊化的區(qū)別

?8??.?3?? 全局組件

?8??.?3??.?1?? 用法

Vue.component('組件名',{參數(shù)})

?8??.?3??.?2?? 注意

組件名請使用小寫
大寫需要駝峰命名法

?8??.?3??.?3?? 組件參數(shù)

父向子傳參
通過 props 向子組件傳遞數(shù)據(jù)
可以在組件實(shí)例中通過 this.xxx 拿到傳遞過來的值
高級寫法(props驗(yàn)證)

props:{  xxx:{    // 數(shù)據(jù)類型    type:'String',    // 必須傳遞    required:'true',    // 默認(rèn)值    default:'mystring'    ....  }}

props可以傳遞任何數(shù)據(jù)類型 包括函數(shù)

為什么組件的data是一個(gè)函數(shù) 而Vue實(shí)例的data是一個(gè)對象?

1.每一個(gè)Vue組件都是一個(gè)Vue實(shí)例
2.都是通過new Vue() 創(chuàng)建出來的
3.如果data是一個(gè)對象的話 那么這些組件的引用指向就會相同
4.一個(gè)的值修改后 其他的值也會修改(這是JavaScript語法的特性)
5.如果data是一個(gè)函數(shù) 函數(shù)中再返回一個(gè)對象
6.那么每個(gè)Vue組件都有了自己的作用域 互不干擾


?9??、Vue生命周期鉤子

Vue生命周期鉤子 || Vue生命周期函數(shù)
Vue提供給開發(fā)者一系列的回調(diào)函數(shù) 讓我們可以在Vue的各個(gè)階段添加自定義的邏輯處理

?9??.?1?? 三大階段

?9??.?1??.?1?? 初始化顯示

創(chuàng)建期間的生命周期函數(shù)(1次)

Vue渲染解析插值表達(dá)式 并不是在頁面中直接渲染解析 而是將整個(gè)掛載在Vue實(shí)例的模版 拿到內(nèi)存中去解析 等全部解析完成后 再一次性的渲染到頁面(批量) (因?yàn)橛锌赡茼撁嬷杏泻芏嘁粯拥膁ata中的值 如果是在頁面中直接渲染解析會很耗性能)

?9??.?1??.?2?? 更新顯示

運(yùn)行期間的生命周期函數(shù)(0次-多次)

?9??.?1??.?3?? 銷毀

銷毀期間的生命周期函數(shù)(1次)

想要銷毀Vue實(shí)例 調(diào)用 vm.$destroy() 即可
注意: 這個(gè)方法方法并不會銷毀Vue實(shí)例的一些如 定時(shí)器或計(jì)時(shí)器等方法
會造成 '內(nèi)存泄漏' 所以在完全銷毀之前 需要在 beforeDestory 鉤子中清除定時(shí)器等...


??1??0??、父子組件傳參

??1??0??.?1?? 父傳子

??1??0??.?2?? 子傳父


??1??1??、VueRouter

??1??1??.?1?? 前端路由

url地址和組件之間的關(guān)系

??1??1??.?2?? 如果是模塊工程化(VueCLI)中使用VueRouter

必須添加 Vue.use(VueRouter)

??1??1??.?3?? 路由起步代碼

??1??1??.?3??.?1?? HTML

<router-link to='/login' tag='span'>登陸</router-link><router-link to='/logout' tag='span'>注冊</router-link>

??1??1??.?3??.?2?? JavaScript

const login = { template: '#tempLogin' };const logout = { template: '#tempLogout' };
const router = new VueRouter({  routes});

??1??1??.?4?? 路由高亮

設(shè)置路由匹配成功后 router-link 的樣式屬性

/login => /login/user觸發(fā) 添加樣式

??1??1??.?5?? 聲明式導(dǎo)航

點(diǎn)了跳轉(zhuǎn) 沒有任何邏輯 類似于(a標(biāo)簽設(shè)置了href)
<router-link to='地址'>XXX</router-link>

??1??1??.?6?? 編程式導(dǎo)航

跳轉(zhuǎn)的同時(shí)執(zhí)行其他需要執(zhí)行的邏輯
router.push('地址')

??1??1??.?7?? 動態(tài)路由匹配

??1??1??.?8?? 路由重定向

??1??1??.?9?? 前置導(dǎo)航守衛(wèi)

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {  // ...  next()})

to

去哪個(gè)路由
一般通過to來判斷對應(yīng)路由做對應(yīng)處理

from

來自哪個(gè)路由

next()

必須next()才可以繼續(xù)跳轉(zhuǎn)頁面(像node'express'里面的中間件)

1.判斷登陸狀態(tài) 如判斷token...
2.可以在跳轉(zhuǎn)路由時(shí)先判斷這個(gè)頁面這個(gè)用戶是否有權(quán)限訪問...
3.可以每次路由跳轉(zhuǎn)前都提示用戶跳轉(zhuǎn)至什么頁面...

??1??1??.??1??0?? 路由元信息

??1??1??.??1??1?? 嵌套路由

??1??1??.?1??2?? 統(tǒng)一404頁面

配置錯(cuò)誤路由規(guī)則

??1??1??.?1??3?? 路由懶加載


??1??2??、資源請求

??1??2??.?1?? Axios

??1??2??.?1??.?1?? Axios是什么?

Axios是一個(gè)基于 promise(實(shí)現(xiàn)了鏈?zhǔn)秸{(diào)用) 的 HTTP 庫 可以用在瀏覽器和 Node.js 中 專注于發(fā)請求 專注于網(wǎng)絡(luò)請求的一個(gè)庫`

??1??2??.?1??.?2?? CDN

<script src='https://unpkg.com/axios/dist/axios.min.js'></script>

??1??2??.?1??.?3?? .then

成功回調(diào)

??1??2??.?1??.?4?? .catch

失敗回調(diào)

??1??2??.?1??.?5?? get請求

// 為給定 ID 的 user 創(chuàng)建請求axios.get('/user?ID=12345')  .then(function (response) {    console.log(response);  })  .catch(function (error) {    console.log(error);  });// 可選地,上面的請求可以這樣做axios.get('/user', {    params: {      ID: 12345    }  })  .then(function (response) {    console.log(response);  })  .catch(function (error) {    console.log(error);  });

??1??2??.?1??.?6?? post請求

??1??2??.?1??.?7?? 基地址

基礎(chǔ)的地址應(yīng)用 沒有必要每次都寫 可以直接抽離出來

axios.defaults.baseURL = '設(shè)置的基地址'Vue.prototype.$axios = axios

axios填寫路徑時(shí)后面直接寫對應(yīng)的路徑即可
前面的公共部分不需在寫(寫了也不會影響)

??1??2??.?1??.?8?? 設(shè)置跨域攜帶cookie

axios.defaults.withCredentials = true

??1??2??.?1??.?8??.?1?? 面試問及

??1??2??.?1??.?9?? 創(chuàng)建克隆對象 多基地址設(shè)置

??1??2??.?1??.?1??0?? Axios攔截器

??1??2??.?1??.?1??0??.?1?? 請求攔截器
axios.interceptors.request.use(function (config) {    // 可以在發(fā)請求之前在這里設(shè)置一些請求頭    `config.headers.Authorization=token`    return config;  }, function (error) {    // Do something with request error    return Promise.reject(error);  });
??1??2??.?1??.?1??0??.?2?? 響應(yīng)攔截器

??1??2??.?2?? vue-resource

vue-resource已經(jīng)不再更新 推薦使用Axios


??1??3??、Vue動畫鉤子

??1??3??.?1?? Vue動畫鉤子是什么?

Vue提供的讓程序員可以在動畫的各個(gè)時(shí)機(jī) 添加 自定義邏輯 的鉤子 也可稱之為 動畫鉤子或動畫函數(shù)

??1??3??.?2?? Vue動畫的理解

// 指定顯示的transitionxxx-enter-active// 指定隱藏的transitionxxx-leave-active// 指定隱藏時(shí)的樣式xxx-enter/xxx-leave-to

??1??3??.?3?? 單個(gè)元素動畫

transition標(biāo)簽包裹

??1??3??.?4?? 列表過渡動畫

transition-group標(biāo)簽包裹

??1??3??.?5?? name

動畫樣式的開始類名

??1??3??.?6?? tag

解析為的標(biāo)簽名

??1??3??.?7?? 過渡類名參數(shù)

??1??3??.?8?? 動畫時(shí)機(jī)

??1??3??.?9?? 動畫鉤子代碼

??1??3??.?9??.?1?? HTML

??1??3??.?9??.?2?? JavaScript

// ...methods: {  // --------  // 進(jìn)入中  // --------  beforeEnter: function (el) {    // ...  },  // 當(dāng)與 CSS 結(jié)合使用時(shí)  // 回調(diào)函數(shù) done 是可選的  enter: function (el, done) {    // ...    done()  },  afterEnter: function (el) {    // ...  },  enterCancelled: function (el) {    // ...  },  // --------  // 離開時(shí)  // --------  beforeLeave: function (el) {    // ...  },  // 當(dāng)與 CSS 結(jié)合使用時(shí)  // 回調(diào)函數(shù) done 是可選的  leave: function (el, done) {    // ...    done()  },  afterLeave: function (el) {    // ...  },  // leaveCancelled 只用于 v-show 中  leaveCancelled: function (el) {    // ...  }}

??1??3??.??1??0?? 過渡動畫生命周期



??1??4??、VueX

??1??4??.1?? Vuex是什么?

  • 集中管理所有組件的數(shù)據(jù)
  • 可以把它理解為是一個(gè)倉庫
  • 將組件中公有的數(shù)據(jù)都抽到VueX中
  • VueX中的數(shù)據(jù) 所有的組件都可以獲取 所有的組件都可以修改

??1??4??.2?? 起步

??1??4??.2??.1?? 下載

npm install vuex --save

??1??4??.2??.2?? 創(chuàng)建VueX倉庫

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({ state: { // 數(shù)據(jù) count: 0 }, mutations: { // 方法 increment (state) { state.count } }})new Vue({ el:xxx, // 掛載到Vue實(shí)例上 store})

??1??4??.2??.3?? 在組件中獲取VueX的數(shù)據(jù)

  • HTML
    {{$store.state.count}}
  • JavaScript
    this.$store.state.count

??1??4??.2??.4?? 在組件中修改VueX的數(shù)據(jù)

  • VueX修改數(shù)據(jù)必須通過 mutations 中的方法修改數(shù)據(jù)
    this.$store.commit(''mutations中的方法,'參數(shù)')

??1??4??.3?? VueX - state

  • 數(shù)據(jù)
  • 所有組件的都可以使用 獲取數(shù)據(jù)

??1??4??.4?? VueX - mutation

  • 方法 修改state中的數(shù)據(jù)

??1??5??、VueCLI

??1??5??.1?? 單文件組件

??1??5??.1??.1?? 用一個(gè)文件能夠包含組件的所有內(nèi)容

  • 結(jié)構(gòu)
<template></template>
  • 邏輯
<script>export default {}</script>
  • 樣式
<style></style>

??1??5??.1??.2?? 單文件開發(fā)的好處

  • 更利于編碼
  • 利于后期維護(hù)
  • 一個(gè)文件包含了所有內(nèi)容

??1??5??.2?? 什么是Vue-CLI

  • 腳手架
  • 可以把.vue文件翻譯成瀏覽器可以識別的內(nèi)容
  • 自動刷新瀏覽器
  • 自動壓縮代碼
  • 自動的把高版本的JavaScript翻譯成低版本的JavaScript
  • 作為代理服務(wù)器
  • ...

把很多開發(fā)中需要用到的功能整合到了一起 讓Vue開發(fā)人員專注于邏輯代碼即可 是用webpack配置出來的

??1??5??.3?? 搭建一個(gè)腳手架

vue create 項(xiàng)目名 <= 項(xiàng)目名不要有中文!!!不要大些
cd 項(xiàng)目名
npm run serve

??1??5??.4?? Vue-CLI搭建項(xiàng)目的本質(zhì)

  • 創(chuàng)建文件夾
  • 下載第三方模塊
  • 創(chuàng)建項(xiàng)目的基本結(jié)構(gòu)
  • 設(shè)置各個(gè)文件之間的關(guān)系
  • 創(chuàng)建git倉庫

1??5??.5?? Vue-cli項(xiàng)目結(jié)構(gòu)

  • main.js
    主要的文件 所有和頂級Vue實(shí)例相關(guān)的都放到這里
  • App.vue
    最頂級的組件 僅次于Vue實(shí)例 看到的頂級頁面結(jié)構(gòu)一般都放在這里
  • /components
    組件的文件夾
  • /assets
    靜態(tài)資源

1??5??.6?? 搭建webpack-vue腳手架(詳細(xì)版本)

npm init webpack '項(xiàng)目名'
cd '項(xiàng)目名'
npm instal
npm run dev

最后一步選 No, I will handle that myself 自己再npm i 下載速度會快一點(diǎn)

1??5??.7?? webpack-vue項(xiàng)目結(jié)構(gòu)

|-- build : webpack 相關(guān)的配置文件夾(基本不需要修改) |-- dev-server.js : 通過 express 啟動后臺服務(wù)器|-- config: webpack 相關(guān)的配置文件夾(基本不需要修改) |-- index.js: 指定的后臺服務(wù)的端口號和靜態(tài)資源文件夾|-- node_modules |-- src : 源碼文件夾 |-- components: vue 組件及其相關(guān)資源文件夾 |-- App.vue: 應(yīng)用根主組件 |-- main.js: 應(yīng)用入口 js|-- static: 靜態(tài)資源文件夾|-- .babelrc: babel 的配置文件|-- .eslintignore: eslint 檢查忽略的配置|-- .eslintrc.js: eslint 檢查的配置|-- .gitignore: git 版本管制忽略的配置|-- index.html: 主頁面文件|-- package.json: 應(yīng)用包配置文件|-- README.md: 應(yīng)用描述說明的 readme 文件

1??5??.8?? Vue-CLI項(xiàng)目編碼

1??5??.8??.1?? 編碼位置

  • 組件的邏輯直接寫在xxx.vue
  • 靜態(tài)資源放在assets文件夾下面 直接使用對應(yīng)路徑引用即可

1??5??.8??.2?? 引入css

  • 全局引入
    main.js => import '路徑'
  • 局部引入
    組件內(nèi)的script標(biāo)簽 => @import url('路徑')

1??5??.8??.3?? 注冊組件

  • 全局組件
    引入在main.js
    import 組件 from 地址
    Vue.component('組件名',組件)
    任意地方都可以使用 將組件名作為標(biāo)簽名 一次注冊 全部使用
  • 局部組件
    在需要用到這個(gè)組件的地方 導(dǎo)入import 組件名 form '地址'
    導(dǎo)入后 設(shè)置給components 就可以在導(dǎo)入的組件中通過組件名使用該組件
    根據(jù)使用的位置 決定局部或者全局注冊 只在某些地方用 用局部組件
  • 組件中的name屬性
    直接在組件的內(nèi)部寫name:值即可
    不能用中文
    寫了只會 Chrome的Vue插件中就可以看見這個(gè)名字 更加利于檢索 利于編碼

1??5??.8??.4?? 整合路由

1??5??.8??.4??.1?? 下包

npm install vue-router

1??5??.8??.4??.2?? 導(dǎo)包

import VueRouter from 'vue-router'

1??5??.8??.4??.3?? 用包
  • 創(chuàng)建路由規(guī)則
    在components文件夾下創(chuàng)建一個(gè)組件xxx.vue
    import 組件名 from '組件路徑'
    const routes = [{path:'/xxx/:xx},component:組件名]
  • 創(chuàng)建路由對象
`const router = new VueRouter({    routes})`
  • 設(shè)置給Vue實(shí)例
`new Vue({ router})`
1??5??.8??.4??.4?? 編碼位置
  • 導(dǎo)入 注冊路由 main.js
  • router-link router-view app.vue
  • 添加組件components
  • 靜態(tài)資源assets

1??5??.9?? 在Vue中使用其他插件

  • 可以將插件寫到Vue原型中 這樣在其他組件中都可以使用這個(gè)插件
  • (main.js)Vue.prototype.$XXX = XXX
  • (其他組件) this.$XXX
  • $XXX 的$的目的是 區(qū)分是Vue自帶的屬性還是后面自定義在原型中的屬性

1??5??.9??.1?? 面試問及

  • Vue原型用過沒
  • 為了共享 將插件設(shè)置在Vue原型上
  • 所有組件都是Vue的實(shí)例
  • 所有在其他組件中 可以通過 this.$XXX 獲取

1??5??.1??0?? css預(yù)處理與css作用域

1??5??.1??0??.1?? css預(yù)處理

1??5??.1??0??.1??.1??使用less
  • 下載
    -npm install -D less-loader less
  • 使用
    <style lang='less'></style> 也可以直接導(dǎo)入less文件
1??5??.1??0??.1??.2?? 使用sass
  • 下載
    -npm install -D sass-loader node-sass
  • 使用
    <style lang='scss'></style> 也可以至今導(dǎo)入scss文件

1??5??.1??0??.2?? css作用域

  • 為style標(biāo)簽 添加 scoped 屬性即可
  • 生成樣式,和渲染組件時(shí)

為元素添加隨機(jī)屬性
樣式中添加屬性選擇器
2者結(jié)合 就把css的作用范圍 約束

  • 為了不影響其他 可以添加這個(gè)屬性
  • 注意
    樣式的屬性是隨機(jī)生成的 如果要修改樣式
    直接修改在scoped中的樣式 不要抽離成樣式文件導(dǎo)入

1??5??.1??1?? ES6模塊化語法

1??5??.1??1??.1?? 默認(rèn)導(dǎo)出導(dǎo)入

  • 導(dǎo)出
    export default xxx 只能寫一個(gè) 如果需要暴露多個(gè) 可以在default后面寫對象
  • 導(dǎo)入
    import xxx from '模塊'

1??5??.1??1??.2?? 按名字導(dǎo)出導(dǎo)入

  • 導(dǎo)出
    export const bbb 導(dǎo)出和導(dǎo)入的名字必須一樣
  • 導(dǎo)入
    import {bbb} from '模塊'

1??5??.1??2?? Vue全家桶

  • Vue
  • axios
  • Vue-router
  • 餓了么ui

餓了么前端團(tuán)隊(duì)開發(fā)的PC端的基于Vue的組件
內(nèi)部封裝了很多現(xiàn)成的組件
在VueCLI中使用elementUI
npm i element-ui
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
有些組件并沒有在組件內(nèi)部使用原生事件
但是有些情況需要一些原生事件
就可以使用.native修飾符來觸發(fā)

  • Vuex

??1??6??、擴(kuò)展

??1??6??.1?? link 和 @import 的區(qū)別

??1??6??.1??.1?? link

  • link是html提供引入樣式的標(biāo)簽
  • link沒有兼容性問題
  • 可以通過JavaScript來控制link標(biāo)簽 修改樣式文件路徑
  • 會和html一起加載

??1??6??.1??.2?? @import

  • @import是提供的提供導(dǎo)入樣式的方法
  • @import有兼容問題 ie5以下不支持
  • 不能通過JavaScript來操縱@import
  • 等html全部加載完畢后再加載@import

??1??6??.2?? JavaScript數(shù)組方法

  • arr.filter()

返回所有匹配成功的值
創(chuàng)建一個(gè)新數(shù)組,
其包含通過所提供函數(shù)實(shí)現(xiàn)的測試的所有元素
(數(shù)組過濾)

const oldArr = ['dajsk', 'dkjdklas', 'kgjftlk', 'ksf', 'ds', 'mfksjjks'];let res = oldArr.filter((val, index) => val.indexOf('d') != -1); // 返回所有匹配成功的值console.log(res); // [ 'dajsk', 'dkjdklas', 'ds' ]
  • arr.find()

返回匹配的第一個(gè)值
返回?cái)?shù)組中滿足提供的測試函數(shù)的第一個(gè)元素的值
沒有匹配成功返回undefined

const oldArr = ['dajsk', 'dkjdklas', 'kgjftlk', 'ksf', 'ds', 'mfksjjks'];let res1 = oldArr.find((val, index) => val.indexOf('d') != -1); // 返回匹配的第一個(gè)值console.log(res1); // dajsk
  • arr.map()

將匹配成功的值做對應(yīng)的計(jì)算后再次返回
創(chuàng)建一個(gè)新數(shù)組
其結(jié)果是該數(shù)組中的每個(gè)元素都調(diào)用一個(gè)提供的函數(shù)后返回的結(jié)果

const oldArrMap = [3, 4, 7, 1, 8, 5];let res2 = oldArrMap.map((val, index) => {  // 將匹配成功的值做對應(yīng)的計(jì)算后再次返回  if (val > 5) {    val = val * 2;  }  return val;});console.log(res2); // [ 3, 4, 14, 1, 16, 5 ]

因?yàn)檫@些??????方法都是返回的新數(shù)組 并沒有覆蓋原來的數(shù)組所以可以繼續(xù)鏈?zhǔn)秸{(diào)用數(shù)組的方法繼續(xù)過濾

  • arr.forEach()

遍歷數(shù)組
方法對數(shù)組的每個(gè)元素執(zhí)行一次提供的函數(shù)

const oldArrForEach = [3, 6, 8, 2, 8, 0];let num = 0;oldArrForEach.forEach((val, index) => { num = val;});console.log(num); // 27oldArrForEach.forEach((val, index) => { if (index == 2) return console.log(val); // 8});

??1??6??.3?? 解決跨域方案

  • CORS
    服務(wù)器設(shè)置允許訪問 響應(yīng)一個(gè)響應(yīng)頭
    存在低版本不識別這個(gè)響應(yīng)頭
  • JSONP
    瀏覽器script的src支持跨域訪問 發(fā)送一個(gè)callback去服務(wù)器
    服務(wù)器接收callback 返回一個(gè)函數(shù)的調(diào)用攜帶數(shù)據(jù)
    瀏覽器接收到返回值當(dāng)作js執(zhí)行 執(zhí)行代碼

注意
需要在瀏覽器聲明callback去的函數(shù)
需要在script請求前聲明
兼容性強(qiáng)
只能發(fā)送get請求

  • flash
    現(xiàn)已不用 蘋果不支持flash
  • sliverlight
  • WebSocket
  • postmessage
  • iframe
  • ...

??1??6??.4?? 接口的請求方法和restful api

網(wǎng)絡(luò)請求設(shè)計(jì)方法時(shí)
考慮到數(shù)據(jù)的操作主要:增刪改查
方法的命名可以體現(xiàn)這個(gè)操作
一般常用的就是get和post

  1. GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng)).
  2. POST(CREATE):在服務(wù)器新建一個(gè)資源.
  3. PUT(UPDATE):在服務(wù)器更新資源(客戶端提供改變后的完整資源).
  4. PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供改變的屬性).
  5. DELETE(DELETE):從服務(wù)器刪除資源.
  6. HEAD:獲取資源的元數(shù)據(jù).
  7. OPTIONS:獲取信息,關(guān)于資源的哪些屬性是客戶端可以改變的.

??1??6??.5?? Cookie、Session、token、localStorage、sessionStorage

??1??6??.5??.1?? Cookie

  • 用來解決http 是無狀態(tài)
  • 什么是無狀態(tài)?

每次請求 瀏覽器和服務(wù)器交互完畢后 彼此并沒有留下什么
繼續(xù)請求 也無法判斷你是誰
如登陸功能
為了能夠保存一些信息
服務(wù)器返回響應(yīng)報(bào)文時(shí) 會偷偷的帶一個(gè)響應(yīng)頭
作用是在瀏覽器中偷偷保存一些信息set-cookie
瀏覽器接收到這個(gè)響應(yīng)頭后 會在本地保存這個(gè)響應(yīng)頭
第二次請求時(shí) 瀏覽器就會自動帶上這個(gè)信息去服務(wù)器
服務(wù)器接收到這個(gè)信息 就知道你是誰了
ajax跨域請求 默認(rèn)不攜帶cookie 需要設(shè)置
跨域cookie在瀏覽器中無法看到 需要抓包

??1??6??.5??.2?? Session

Seesion 是將用戶數(shù)據(jù)存儲在服務(wù)器中
通過sessionId來驗(yàn)證查找服務(wù)器中的用戶信息
sessionId一般是存放在瀏覽器的cookie中的

所以Session需要配合瀏覽器的cookie或者瀏覽器的其他存儲技術(shù)一起使用

??1??6??.5??.3?? token

和cookie差不多 也可以記錄登陸狀態(tài)
服務(wù)器生成的
通過用戶瀏覽器版本、用戶信息...生成的一個(gè)密鑰

瀏覽器不會自動保存
可以接口本地存儲來保存token
瀏覽器不會自動攜帶發(fā)送
每次請求接口時(shí)可以通過headers攜帶存儲的token
headers{ Authorization :token }

??1??6??.5??.4?? localStorage

可以把數(shù)據(jù)存儲到本地(瀏覽器) 只要用戶不刪除 則會一直保存 每個(gè)域名都是獨(dú)立的保存數(shù)據(jù) 不同域名不能互相訪問 長久保存數(shù)據(jù)可以存儲到 localStorage 可以存儲5M數(shù)據(jù)

  • 保存數(shù)據(jù) localStorage.setItem(key,value)
  • 獲取數(shù)據(jù) localStorage.getItem(key) => 如果沒有這個(gè)數(shù)據(jù) 則返回 null
  • 刪除一個(gè)數(shù)據(jù) localStorage.removeItem(key)
  • 清空所有數(shù)據(jù) localStorage.clear()

??1??6??.5??.5?? sessionStorage

短暫存儲數(shù)據(jù) 可以多頁面?zhèn)髦?相當(dāng)于localStorage會更安全 瀏覽器關(guān)閉后就不會保存了 可以存儲5M數(shù)據(jù)

  • 保存數(shù)據(jù) sessionStorage.setItem(key,value)
  • 獲取數(shù)據(jù) sessionStorage.getItem(key) => 如果沒有這個(gè)數(shù)據(jù) 則返回 null
  • 刪除一個(gè)數(shù)據(jù) sessionStorage.removeItem(key)
  • 清空所有數(shù)據(jù) sessionStorage.clear()

??1??7??、Xmind筆記


很多都是自己的話去解釋和理解 可能會存在錯(cuò)誤 或者有錯(cuò)別字 歡迎指出謝謝

打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
前端開發(fā)框架vue常見的面試題
Vue.js--Vue.js搬磚基礎(chǔ)
vuejs高頻面試題
前端知識大全
JavaScript常見變量和函數(shù)命名示例
Vue 前端面試題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 丰顺县| 白城市| 昌图县| 湾仔区| 田阳县| 平南县| 怀仁县| 宜丰县| 上思县| 楚雄市| 津南区| 辽源市| 中牟县| 雷州市| 措美县| 敦煌市| 专栏| 忻州市| 文安县| 凌源市| 喀喇沁旗| 龙泉市| 仙桃市| 丰顺县| 即墨市| 蒙城县| 通化县| 彭水| 娱乐| 贵定县| 稻城县| 璧山县| 梅州市| 海盐县| 四子王旗| 库尔勒市| 刚察县| 防城港市| 阳谷县| 池州市| 灵台县|