Vue-CLI、Vue-Router知識點復習

1.MVVM

Model-View-ViewModel
數(shù)據(jù)-展示的綁定柒竞,ViewModel監(jiān)聽數(shù)據(jù)的改變和控制,處理數(shù)據(jù)方面的邏輯霹娄,連接Model和View層

2.雙向綁定原理

通過Object.defineProperty()劫持對象的getter能犯,setter鲫骗,數(shù)據(jù)變動時發(fā)布消息給訂閱者,觸發(fā)相應的監(jiān)聽回調(diào)踩晶。

<body>
    <div id="app">
        <input type="text" id="txt">
        <p id="show"></p>
    </div>
</body>
var obj = {};
Object.defineProperty(obj, 'txt', {
  get: function(){
    return obj;
  },
  set: function(val){
    document.getElementById('txt').value = val;
    document.getElementById('show').innerHTML = val;
  }
})
document.addEvuentListener('keyup',function(e){
  obj.txt = e.target.value;
})

2.Vue創(chuàng)建

1. Vue-Cli

1. 常用npm命令

npm install//下載依賴
npm run serve // 啟動vue-cli開發(fā)環(huán)境
npm run build // 啟動生成生產(chǎn)環(huán)境資源(打包)
serve dist//生成dist文件执泰,在本機測試是否完整

2.自動刷新頁面

自動刷新并不是vue-cli功能,是webpack的hot-module-repalement-plugin插件在做這事

3.vue-cli生成的項目可以使用es6渡蜻、es7的語法嗎术吝?

可以使用,配置了babel茸苇,可以將es6排苍,es7在webpack打包時轉(zhuǎn)換成ES5

4.vue-cli怎么解決跨域的問題?

在根目錄下新建:vue.config.js文件学密,然后里面配置

module.exports = {
  devServer: {
    proxy: {
    //配置跨域
      '/api': {
      target: '跨域url',
      ws: true,
      changOrigin: true
// pathRewrite: {
// '^/api': ''
// }
      }
    }
  }
}

5. 怎么創(chuàng)建一個項目

vue create xxxx 選擇模板

6. cli2和cli3有什么區(qū)別

cli3集成了webpack配置淘衙,vue.config.js中統(tǒng)一設(shè)置

3.vue-router

1.重定向頁面

const routes:[
  {
    path: '/a',
    //重定向
    redirect: '/b'
  },{
    path: '/a',
    component: A,
    //別名實現(xiàn)重定向
    alias:'/b'
  }]

2.404頁面

const routes:[
  {
    path: '/aa',
    name: 'aa',
    component: Aa,
    children:[]
  },{
    // 放到最后,*全匹配 不放最后會影響前面頁面全部匹配成404
    path: '*',
    name: '404',
    component: "404組件"
  }
]

3.路由有幾種模式

兩種腻暮,默認為hash彤守,可以同伙VueRouter實例添加mode:'history'改為history模式

  • hash 變更hash不會刷新頁面,會改變地址
  • history 不支持老舊瀏覽器哭靖,基于HTML5具垫,路由變化不會改變地址,但是部署到服務器试幽,需要在ng上進行相應的正向代理跳轉(zhuǎn)筝蚕,否則拷貝鏈接打不開

4.vue-router有幾種鉤子

1.三種鉤子

  • 全局導航鉤子 beforeEach,afterEachbeforeResolve
  • 組件內(nèi)鉤子beforeEnter
  • 單獨路由獨享組件beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave

2.執(zhí)行順序

全局 > 路由 > 組件
除afterEach全局后置铺坞,其他鉤子必須調(diào)用next()否則無法導航起宽,注意全局前置守衛(wèi)可以用于攔截(登陸攔截)

5. router-link

類似a標簽,用于跳轉(zhuǎn)路由

// 字符串
<router-link to="apple"> to apple</router-link>
// 對象
<router-link :to="{path:'apple'}"> to apple</router-link>
// 命名路由
<router-link :to="{name: 'applename'}"> to apple</router-link>
//直接路由帶查詢參數(shù)query康震,地址欄變成 /apple?color=red
<router-link :to="{path: 'apple', query: {color: 'red' }}"> to apple</router-link>
// 命名路由帶查詢參數(shù)query燎含,地址欄變成/apple?color=red
<router-link :to="{name: 'applename', query: {color: 'red' }}"> to apple</router-link>
//直接路由帶路由參數(shù)params,params 不生效腿短,如果提供了 path屏箍,params 會被忽略
<router-link :to="{path: 'apple', params: { color: 'red' }}"> to apple</router-link>
// 命名路由帶路由參數(shù)params,地址欄是/apple/red
<router-link :to="{name: 'applename', params: { color: 'red' }}"> to apple</router-link>

6.vue-router如何響應路由參數(shù)變化

1.為何需要響應參數(shù)變化

  • 切換路由橘忱,路由參數(shù)變化赴魁,頁面數(shù)據(jù)未更新,需要強制刷新
  • 不同路由渲染相同組件钝诚,復用組件颖御,切換路由后,當前組件下的生命周期函數(shù)不會再調(diào)用

2. 解決方案

1. 使用watch監(jiān)聽

watch:  {
  $route(to, from) {
    if(to !== from){
      console.log('檢測到變化,做出處理')
    }
  }
}

2. 向router-view組件中添加key

 <router-view :key="$router.fullPath"></router-view>
 //$route.fullPath是完成后解析的URL潘拱,包含其查詢參數(shù)和hash完整路徑

7.切換到新路由時疹鳄,頁面要滾動到頂部或保持原先的滾動位置怎么做呢?

const router = new Router({
  mode: 'history',
  scrollBehavior(to ,from ,saveOptions) {
    return {x:0, y: 0}
  },
})

8.在什么場景下會用到嵌套路由芦岂?

管理系統(tǒng)多級導航菜單
routes[{path:'/'},children[{paht:'chilld'}]]

9.如何獲取路由傳過來的參數(shù)

如果使用query方式傳入的參數(shù)使用this.route.query 接收 如果使用params方式傳入的參數(shù)使用this.router.params接收

10.active-class是哪個組件屬性

active-class是vue-router模塊的router-link組件中的屬性瘪弓,用來做選中樣式的切換;

11.vue組件怎么獲得當前路由信息

template中直接route script中獲取this.route

12.動態(tài)加載路由

router.addRoutes(routes: Array(RouteConfig))

13.懶加載路由

var myComponent = () => import('../views/xxxx.vue');
const routes = [
  {
    path: '/xxxx',
    name: 'xxxx',
    component: myComponent
  }
]
const routes = [
  {
    path: '/xxxx',
    name: 'xxxx',
    component: ()=> import('../views/xxxx.vue'); 
  }
]
var myComponent = r => require.ensure([], ()=> r(requier('../views/xxxx.vue')),'');
const routes = [
  {
    path: '/xxxx',
    name: 'xxxx',
    component: myComponent
  }
]
const routes = [
  {
    path: '/xxxx',
    name: 'xxxx',
    component: resolve => require(['../views/xxxx.vue'],resolve);
  }  
]

14.從零開始寫一個路由

單獨創(chuàng)建一個router.js禽最,npm安裝vue-router,npm install vue-router

//引入vue和vue-router
import Vue from 'vue'
import VueRouter from 'vue-router'

// 可引入組件
import xxxx from '../views/xxxx.vue'

//使用vue-router
Vue.use(VueRouter)
//定義路由變量
const xxx = ()=> import('../views/xxx.vue');
//定義路由表
const routes = [
  {
    path: '/',
    redirect: '/index'
  },
  {
    path: '/index',
    name: 'index',
    component: xxxx,
    children: []
  }
],
//需要向外面暴露一個實例
const router = new VueRouter({
  // 模式
  mode: 'history',
  // 環(huán)境
  base: process.env.BASE_URL,
  // 傳入路由表
  routes
})
// 此處還可以寫登陸攔截之類的
router.beforeEach((to,from,next) => {
  const isLogin = localStorage.eleToken ? true : false;
  if(to.path === '/login' || to.path === '/register'){
    next();
  }else{
    isLogin ? next() : next('/login');
  }
})
export default router;

main.js中引用

import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h=>h(App)
}).$.mount('#app')

在app.vue中就可以使用

<router-view/>

15.導航完整解析流程

  1. 導航被觸發(fā)
  2. 在失活的組件里調(diào)用beforeRouteLeave守衛(wèi)
  3. 調(diào)用全局beforeEach守衛(wèi)
  4. 在復用的組件里調(diào)用beforeRouteUpdate守衛(wèi)
  5. 調(diào)用路由配置里的beforeEnter守衛(wèi)
  6. 解析異步路由組件
  7. 在被激活的組件里滴啊用beforeRouteEnter守衛(wèi)
  8. 調(diào)用全局beforeResolve守衛(wèi)
  9. 導航被確認
  10. 調(diào)用全局afterEach鉤子
  11. DOM更新
  12. 將創(chuàng)建好的實例調(diào)用beforeRouteEnter守衛(wèi)中傳給next回調(diào)函數(shù)

16.路由之間是怎么跳轉(zhuǎn)的腺怯?有哪些方式?

  1. router-link
<!--不帶參-->
<router-link :to="{name: 'home'}"></router-link>
<!--帶參數(shù)-->
<router-link :to="{name: 'home', params: {id: 1}}"></router-link>
 <!--params傳參數(shù) (類似post)-->
 <!--路由配置 path: "/home/:id" 或者 path: "/home:id" -->
 <!--不配置path ,第一次可請求,刷新頁面id會消失-->
 <!--配置path,刷新頁面id會保留-->
<router-link :to="{name: 'home}, query: {id: 1}"></router-link>
 <!--query傳參數(shù) (類似get,url后面會顯示參數(shù))-->
 <!--路由可不配置-->
 
 <!--html 取參  $route.query.id-->
 <!--script 取參  this.$route.query.id-->
  1. this.$router.push()(函數(shù)里面調(diào)用)
//不帶參
this.$router.push('/home');
this.$router.push({name: 'home'});
this.$router.push({path: '/home'})

//帶參數(shù)
this.$router.push({name:'home',query: {id:'1'}})
this.$router.push({path:'/home',query: {id:'1'}})
 
// html 取參  $route.query.id
// script 取參  this.$route.query.id
 
params傳參
 
this.$router.push({name:'home',params: {id:'1'}})  // 只能用 name
 
// 路由配置 path: "/home/:id" 或者 path: "/home:id" ,
// 不配置path ,第一次可請求,刷新頁面id會消失
// 配置path,刷新頁面id會保留
 
// html 取參  $route.params.id
// script 取參  this.$route.params.id
  1. this.$router.replace()同上

  2. this.$router.go(n)

his.$router.go(n) 向前或者向后跳轉(zhuǎn)n個頁面川无,n可為正整數(shù)或負整數(shù)

區(qū)別:

  • this.$router.push 跳轉(zhuǎn)到指定url路徑呛占,并想history棧中添加一個記錄,點擊后退會返回到上一個頁面

  • this.$router.replace 跳轉(zhuǎn)到指定url路徑懦趋,但是history棧中不會有記錄晾虑,點擊返回會跳轉(zhuǎn)到上上個頁面 (就是直接替換了當前頁面)

  • this.$router.go(n) 向前或者向后跳轉(zhuǎn)n個頁面,n可為正整數(shù)或負整數(shù)

17.vue-router使用history模式部署時需注意什么

服務器的404頁面需要重定向到index.html
nginx
try_files uriuri/ /index.html;

18.route和router有什么區(qū)別

route是當前路由對象
router是vue實例的路由實例

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仅叫,一起剝皮案震驚了整個濱河市走贪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惑芭,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件继找,死亡現(xiàn)場離奇詭異遂跟,居然都是意外死亡,警方通過查閱死者的電腦和手機婴渡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門幻锁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人边臼,你說我怎么就攤上這事哄尔。” “怎么了柠并?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵岭接,是天一觀的道長。 經(jīng)常有香客問我臼予,道長鸣戴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任粘拾,我火速辦了婚禮窄锅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰雇。我一直安慰自己入偷,他們只是感情好追驴,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疏之,像睡著了一般殿雪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上体捏,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天冠摄,我揣著相機與錄音,去河邊找鬼几缭。 笑死河泳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的年栓。 我是一名探鬼主播拆挥,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼某抓!你這毒婦竟也來了纸兔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤否副,失蹤者是張志新(化名)和其女友劉穎汉矿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體备禀,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洲拇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曲尸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赋续。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖另患,靈堂內(nèi)的尸體忽然破棺而出纽乱,到底是詐尸還是另有隱情,我是刑警寧澤昆箕,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布鸦列,位于F島的核電站,受9級特大地震影響鹏倘,放射性物質(zhì)發(fā)生泄漏敛熬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一第股、第九天 我趴在偏房一處隱蔽的房頂上張望应民。 院中可真熱鬧,春花似錦、人聲如沸诲锹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽归园。三九已至黄虱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庸诱,已是汗流浹背捻浦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桥爽,地道東北人朱灿。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像钠四,于是被迫代替她去往敵國和親盗扒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 這是一篇集合了從如何查看 vue-router源碼(v3.1.3)缀去,到 vue-router源碼解析侣灶,以及擴展了相...
    尤小小閱讀 5,510評論 2 14
  • SPA單頁應用 傳統(tǒng)的項目大多使用多頁面結(jié)構(gòu)咏雌,需要切換內(nèi)容的時候我們往往會進行單個html文件的跳轉(zhuǎn)伪阶,這個時候受網(wǎng)...
    視覺派Pie閱讀 11,816評論 1 55
  • 目錄 - 1.vue-router 動態(tài)路由匹配 - 2.router-link組件及其屬性 - 3.vue-ro...
    我跟你蔣閱讀 1,118評論 0 7
  • 那這次呢?我決定直接就先放一個小小demo上來 其實我們在引入vue-router插件那一刻,我們的網(wǎng)頁就已經(jīng)附帶...
    看物看霧閱讀 803評論 0 1
  • 回憶: 我們知道,h5的history或者hash幫助我們解決了处嫌,變化url跳轉(zhuǎn)頁面不發(fā)送請求,并且我們能監(jiān)聽到u...
    LoveBugs_King閱讀 3,636評論 0 5