vue基礎

vue 是一個 構建用戶界面的漸進式的 javascript 框架

漸進式:逐漸增強,vue不強求你一次性在網(wǎng)站中運用學習所有的語法韭畸,可以學一點用一點

庫:本質上是一些方法的集合堰酿。每次調用方法,實現(xiàn)一個特定的功能 如 axios

框架:是一套完整的解決方案∥翟迹框架實現(xiàn)了大部分的功能坑赡,我們需要按照框架的規(guī)則寫代碼 如 vue

Vue是一個MVVM的框架 (MVVM:一種軟件架構模式)

是一種簡化用戶界面事件驅動的編程方式

M:model數(shù)據(jù)模型(ajax獲取到的數(shù)據(jù))

V:view視圖(頁面)

VM:ViewModel 視圖模型 (操作視圖+模型) 是mvvm的核心烙如,將數(shù)據(jù)和實圖進行雙向綁定

MVVM通過 數(shù)據(jù)雙向綁定 讓數(shù)據(jù)自動地雙向同步

V(修改視圖) -> M(數(shù)據(jù)自動同步)

M(修改數(shù)據(jù)) -> V(視圖自動同步)

一方面修改,另一方面跟著修改毅否,不用手動的操作dom元素

之前的思想亚铁,原生 dom驅動。無論修改什么頁面內容螟加,先找對象徘溢,操作dom。

現(xiàn)在的思想仰迁,vue 數(shù)據(jù)驅動甸昏。想更新視圖,直接操作數(shù)據(jù)即可徐许。數(shù)據(jù)變化施蜜,視圖自動更新

vue組件化思想

組件化:也就是vue頁面 一個組件會包含(HTML+CSS+JS) ,完整的頁面可以拆分成多個組件

組件化的優(yōu)點:

  1. 容易維護

  2. 便于復用(HTML+CSS+JS)

@vue/cli 腳手架的使用

  1. 傳統(tǒng)開發(fā)模式:基于html/css/js文件開發(fā) vue

  2. 工程化開發(fā)方式:在webpack環(huán)境中開發(fā)vue雌隅。(推薦翻默,學習+項目)

vue腳手架

@vue/cli 也叫 vue腳手架, @vue/cli 是vue官方提供的一個全局命令工具

這個命令可以幫助我們快速的創(chuàng)建一個vue項目的基礎架子

vue腳手架的好處

  1. 開箱即用

  2. 零配置(不用你配webpack)

  3. 內置babel等工具

vue腳手架的基本使用

  1. 全局安裝:(一次安裝之后直接創(chuàng)建文件)
    npm i @vue/cli -g 或 yarn global add @vue/cli

  2. 查看vue版本:
    vue --version

  3. 初始化一個vue項目:
    vue create 項目名(不能用中文)

  4. 啟動項目, 打包項目

     npm run serve
    
     npm run build
    

我們在項目無法找到webpack.config.js文件,因為vue把它隱藏了

如果需要覆蓋webpack的配置恰起,可以修改vue.config.js文件修械,覆蓋webpack配置

腳手架里的主要文件的作用

node_modules – 下載的第三方的包

public/index.html – 運行的瀏覽器網(wǎng)頁

src/main.js – webpack打包的入口

src/App.vue – vue頁面的入口

package.json – 依賴包列表文件

public/index.html不用動,提供一個最基礎的頁面

src/main.js不用動检盼, 渲染了App.vue組件

src/App.vue默認有很多的內容肯污,可以全部刪除

assets 文件夾 和 components 中的可以直接刪除

.vue文件

單文件組件:一個 .vue 文件就是一個組件

  1. 安裝插件 (語法高亮)vetur

  2. 一個單文件組件由三部分組成
    template: 結構 (有且只能一個根元素)
    script: js邏輯
    style: 樣式

  3. 讓組件支持 less
    (1) style標簽, lang=“l(fā)ess”吨枉,開啟less功能

    (2) 裝包: yarn  add  less-loader@7.2.1  less  -D
    

vue插值表達式

vue提供數(shù)據(jù)

  1. 通過 data 屬性可以提供數(shù)據(jù)蹦渣, data屬性必須是一個函數(shù)

  2. 這個函數(shù)需要返回一個對象,這個對象就代表vue提供的數(shù)據(jù)

export default {
  data(){
    return {
       name : "張三"
    }
  }
}

使用插值表達式貌亭,可以在模板中渲染數(shù)據(jù)

<template>
<div>
    {{ name }}
</div>
</template>

插值表達式: 小胡子語法 {{ }}

  1. 作用: 使用 data 中的數(shù)據(jù)渲染視圖(模板)

  2. 支持基本語法, 支持三元運算符 變量 對象.屬性 方法

  3. 注意點:
    (1)使用數(shù)據(jù)在 data 中必須存在
    (2)能使用表達式柬唯,但是不能使用語句 if for ...
    (3)不能在標簽屬性中使用 {{ }} 插值

vue指令

vue指令: 特殊的 html 標簽屬性, 特點: v- 開頭

每個 v- 開頭的指令, 都有著自己獨立的功能, 將來vue解析時, 會根據(jù)不同的指令提供不同的功能

vue指令-v-bind

說明:插值表達式不能用在html的標簽屬性上,想要動態(tài)的設置html標簽屬性圃庭,需要使用v-bind指令

作用: 動態(tài)的設置html的標簽屬性

語法: v-bind:屬性名="值"

簡寫: :屬性名="值"

<template>
<!-- template中只有一個根標簽 -->
<div>
  <!-- vue 的指令 v-bind: 開頭 -->
  <input type="text" v-bind:value = "value">
  <br>
  <input type="text" :value ="value">
  <br>
  <a v-bind:href = 'url'>點擊跳轉1</a>
  <br>
  <a :href = 'url'>點擊跳轉2</a>
</div>
</template>

<script>
export default {
  name : 'app', 
  // data必須是一個函數(shù)锄奢,并且必須要返回一個對象失晴,數(shù)據(jù)就在返回的對象里
  data(){
    return{
      value : '請輸入姓名',
      url : 'http://www.reibang.com/'
    }
  }
}
</script>

vue指令-v-on

作用:注冊事件

語法:

  1. v-on:事件名=“要執(zhí)行的少量代碼"

  2. v-on:事件名=“methods中的函數(shù)名"

  3. v-on:事件名=“methods中的函數(shù)名(實參)"

    注意:事件處理函數(shù)在methods中提供

簡寫:v-on 可以 簡寫 成 @

<template>
<!-- template中只有一個根標簽 -->
<div>
  <!-- 注冊事件 vue指令 v-on:事件名 = ‘要執(zhí)行的代碼’ -->
 <!-- 簡寫:v-on 可以 簡寫 成 @ -->
 <h3>{{ money }}</h3>
 <!-- 點擊加10 -->
 <button v-on:click = 'money+=10'>+10</button>
 <!-- 簡寫 -->
 <button @click = 'money+=10'>+10簡寫</button>
 <br>
 <!-- 點擊加100,使用方法 -->
 <button v-on:click = 'addmoney'>+100</button>
 <!-- 加100簡寫 -->
 <button @click = 'addmoney'>+100簡寫</button>
 <br>
 <!-- 多個不同的按鈕調用方法 -->
 <button @click = 'moneys(200)'>+200</button>
 <button @click = 'moneys(500)'>+500</button>
 <button @click = 'moneys(1000)'>+1000</button>
 <button @click = 'moneys(10000)'>+10000</button>
</div>
</template>

<script>
export default {
  name : 'app', 
  // data必須是一個函數(shù)拘央,并且必須要返回一個對象涂屁,數(shù)據(jù)就在返回的對象里
  data(){
    return{
      money : 10
    }
  },
  //   事件處理函數(shù)在methods中提供 
  methods: {
    // 在methods中引用data里的變量需要使用this
    addmoney(){
       this.money += 100
    },
    // 有參數(shù)的方法可以根據(jù)需求給多個標簽調用
    moneys(num){
       this.money += num
    },
  }
}
</script>

vue中阻止默認事件

正常阻止默認事件

語法:事件對象.preventDefault()

vue中獲取事件對象

(1) 沒有傳參, 通過形參接收 e

(2) 傳參了, 通過$event指代事件對象 e

<template>
<div>
<!-- 阻止事件默認行為 -->
<!-- 沒有參數(shù)時 -->
<a href="http://www.reibang.com/" @click = 'fn'>沒有參數(shù)</a>
<br>
<br>
<!-- 有參數(shù)時 -->
<a href="http://www.reibang.com/" @click="fns(10,$event)">有參數(shù)</a>
</div>
</template>
<script>
 methods: {    
    // 沒有傳參時,直接設置事件對象堪滨,然后阻止默認行為
    fn(e){
      e.preventDefault()
      console.log(e)
    },
    // 有傳參時胯陋,最后一個參數(shù)是事件對象,但是傳參必須傳 $event 固定語法 否則報錯
    fns(num,e){
      e.preventDefault()
      console.log(num)
    }
  }
}
</script>

修飾符

事件修飾符

事件修飾符:vue提供事件修飾符袱箱,可以快速阻止默認行為或阻止冒泡

.prevent 阻止默認行為遏乔, .stop 阻止冒泡

.once 程序運行期間,只能觸發(fā)一次事件處理函數(shù)

<template>
<!-- template中只有一個根標簽 -->
<div>
<!-- 阻止事件默認行為 事件名.prevent -->
<a  @click.prevent = 'fn'>點擊跳轉頁面</a>
<!-- 事件修飾符 事件名.stop 阻止事件冒泡-->
<div @click = 'father'>父親
  <div @click.stop = 'son'>孩子</div>
</div>
</div>
</template>

<script>
export default {
  // data必須是一個函數(shù)发笔,并且必須要返回一個對象盟萨,數(shù)據(jù)就在返回的對象里
  data(){
    return{   
    }
  },
  //   事件處理函數(shù)在methods中提供 
  methods: {
    fn(){
      console.log('阻止跳轉')
    },
    father(){
      console.log('父親')
    },
    son (){
      console.log('兒子')
    }
  }
}
</script>

按鍵修飾符

在監(jiān)聽鍵盤事件時,我們經(jīng)常需要判斷詳細的按鍵了讨∧砑ぃ可用按鍵修飾符

@keyup.enter – 只要按下回車才能觸發(fā)這個鍵盤事件函數(shù)

@keyup.esc 監(jiān)聽返回鍵

vue中內置有 .delete .enter .esc .tab 等

<template>
<!-- template中只有一個根標簽 -->
<div>
<!-- 按鍵修飾符 -->
<input type="text" placeholder="用戶名" @keyup.esc = 'down'>
<!-- 設置按鍵彈起時,只有在設置的輸入框獲取焦點時按才有效 -->
<input type="password" placeholder="密碼" @keyup.enter = 'fn'>
<button>登錄</button>
</div>
</template>

<script>
export default {
  name : 'app', 
  // data必須是一個函數(shù)前计,并且必須要返回一個對象胞谭,數(shù)據(jù)就在返回的對象里
  data(){
    return{   
    }
  },
  //   事件處理函數(shù)在methods中提供 
  methods: {
    down (){
      console.log('esc 返回')
    },
    fn () {
      console.log('enter彈起')
    }
  }
}
</script>

案例 :逆轉世界

當點擊時字符串翻轉

使用: 插值表達式

<template>
<!-- template中只有一個根標簽 -->
<div>
<!-- 逆轉世界 -->
<!-- 先靜態(tài)后動態(tài) -->
<h1>{{ msg }}</h1>
<button @click="reverseWorld">逆轉世界</button>
</div>
</template>

<script>
export default {
  data(){
    return {
      msg : 'Hello,World!'
    }
  },
  methods : {
     reverseWorld (){
      // 1.先將字符串分割  split
    const arr = this.msg.split('')
    // 2.再將分割形成的數(shù)組倒轉  reverse
    arr.reverse()
    // 3.最后將倒轉的數(shù)組重新拼接成字符串然后賦值給msg
    this.msg = arr.join('')
     }
  }
}
</script>

盒子的顯示隱藏

v-show 和 v-if 可以控制盒子的顯示隱藏

  1. v-show
    語法: v-show="布爾值" (true顯示, false隱藏)

    原理: 實質是在控制元素的 css 樣式, display: none;

  2. v-if
    語法: v-if="布爾值" (true顯示, false隱藏)

    原理: 實質是在動態(tài)的創(chuàng)建 或者 刪除元素節(jié)點

    應用場景:

     1. 如果是頻繁的切換顯示隱藏, 用 v-show   
         (v-show, 只是控制css樣式,而v-if, 頻繁切換會大量的創(chuàng)建和刪除元素, 消耗性能)
    
    1. 如果是不用頻繁切換, 要么顯示, 要么隱藏的情況, 適合于用 v-if

      (v-if 是惰性的, 如果初始值為 false, 那么這些元素就直接不創(chuàng)建了, 節(jié)省一些初始渲染開銷)

vue指令 - v-else 和 v-else-if

<template>
<!-- template中只有一個根標簽 -->
<div>
 <!-- 顯示隱藏  v-show  v-if   值都為布爾值 true顯示  false 隱藏-->
 <!-- v-show 的值為false時男杈,就是往其標簽的樣式上加display = none -->
 <div v-show="age >= 18">成年人的世界</div>
 <div v-show="age < 18">未成年人的世界</div>
 <!-- v-if 的值為true時 創(chuàng)建一個新的標簽丈屹,為false時就刪除 -->
 <div v-if="age >= 18">我想要</div>
 <div v-if="age < 18">孤勇者</div>
 <!-- v-if  v-else-if   v-else  用法和js中的if判斷一樣 -->
 <div v-if="num < 60">不及格</div>
 <div v-else-if="num < 80">及格</div>
 <div v-else-if="num < 90">優(yōu)秀</div>
 <div v-else-if="num < 100">頂尖</div>
 <div v-else>金色傳說</div>
</div>
</template>

<script>
export default {
  data(){
    return {
      age : 16,
      num : 12
    }
  },
  methods : {
    
  }
}
</script>

v-model

v-model作用:給表單元素使用, 雙向數(shù)據(jù)綁定

  1. 數(shù)據(jù)變化了, 視圖會跟著變

  2. 視圖變化了, 數(shù)據(jù)要跟著變

    語法: v-model='值'

vue指令 - v-model - 處理其他表單元素

例如:
select 綁定的是選中的選項值
checkbox 綁定的是是否選中 的一個布爾值
textarea 綁定的是value屬性 用戶輸入的值

注意:v-model 會 忽略掉表單元素原本的value, checked等初始值

v-model修飾符

語法: v-model.修飾符="Vue數(shù)據(jù)變量"

.number 轉數(shù)字,以parseFloat轉成數(shù)字類型
.trim 去除首尾空白字符
.lazy 在change時觸發(fā)而非inupt時

<template>
<!-- template中只有一個根標簽 -->
<div>
<!-- v-model 修飾符  -->
<!-- .number轉數(shù)字伶棒,以浮點型轉成數(shù)字類型然后賦值給變量 -->
<input type="text" v-model.number="age" placeholder="數(shù)字類型">
<br>
<!-- .trim 將用戶輸入的數(shù)據(jù)前后空格去除然后賦值給變量 -->
<input type="text" v-model.trim="add" placeholder="去除前后空格">
<br>
<!-- .lazy 在輸入框失去焦點時才觸發(fā)旺垒,將用戶輸入的數(shù)據(jù)賦值給變量 -->
<input type="text" v-model.lazy="sall" placeholder="失去焦點時觸發(fā)">
</div>
</template>

<script>
export default {
  data(){
    return {
      age : "",
      add : "",
      sall : "",
    }
  }
}
</script>

vue指令-v-text和v-html

作用:更新元素的innerText/innerHTML

語法:

v-text="值"
v-html="值"

區(qū)別:
v-text 不解析標簽
v-html 解析標簽

使用v-text和v-html的標簽元素中不應寫內容,會被覆蓋

<template>
<!-- template中只有一個根標簽 -->
<div>
<!-- v-text和 v-html -->
<!-- v-text 相當于 innerText  textContent -->
<!-- v-html相當于 innerHTML -->
<!-- v-text 只能解析變量中的文本肤无,會將變量的數(shù)據(jù)以字符串的方式顯示在標簽元素中 -->
<!-- 使用v-text和v-html之后  標簽元素中的插值會被覆蓋 -->
<h1 v-text="msg">{{666}}</h1>
<!-- v-html 可以解析標簽 先蒋,會將解析的html標簽顯示在標簽元素中 -->
<h1 v-html="msg"></h1>
</div>
</template>

<script>
export default {
  data(){
    return {
     msg : "<button>按鈕</button>"
    }
  }
}
</script>

綜合案例--文章標題編輯

<template>
  <div>
    <!-- 標題部分 -->
    <!-- 2.當點擊編輯時,標題和編輯隱藏宛渐,編輯內容顯示  給編輯綁定點擊事件 -->
    <!-- 3.當點擊編輯時竞漾,標題隱藏 -->
    <h1 class="title" v-show="!show">
      {{ title }}
      <span class="tag">{{ option }}</span>
      <!--5.點擊編輯的時候,要初始化表單顯示  -->
      <a class="edit-btn" @click="fn">編輯</a>
    </h1>

    <!-- 編輯內容 -->
    <!-- 1.在最開始時窥翩,下面編輯框會隱藏 -->
    <div v-show="show">
      <div class="input-group">標題:<input type="text" v-model="edtitle" /></div>
      <div class="input-group">
        頻道:<select v-model="edoption">
          <option value="前端">前端</option>
          <option value="測試">測試</option>
          <option value="Java">Java</option>
        </select>
      </div>
      <div class="operation">
        <!-- 4.點擊取消或者確認回到原來的狀態(tài) -->
        <button class="cancel" @click="show = false">取消</button>
        <button class="confirm" @click="ret">確認</button>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data(){
    return {
      show : false,
      title : '從入門到崩潰',
      option : "前端",
      edtitle : '',
      edoption : '',
    }
  },
  methods: {
    // 點擊編輯的事件
    fn(){
      this.show = true
      // 將title的值賦值給編輯輸入框
      this.edtitle = this.title
      this.edoption = this.option
    },
    // 點擊確認要執(zhí)行的
    ret(){
      this.show = false
      // 點擊確認之后將將修改后的edtitle賦值給title
      this.title = this.edtitle
      this.option = this.edoption
    }
  }
};
</script>

<style>
.title {
  display: flex;
  align-items: center;
}

.tag {
  margin-left: 8px;
  padding: 3px 6px;
  border-radius: 8px;
  background-color: green;
  font-size: 0.6em;
  color: #fff;
}

.edit-btn {
  margin-left: 32px;
  font-size: 0.8em;
  color: lightskyblue;
}

.input-group {
  margin-top: 16px;
  font-size: 28px;
}

.input-group input,
.input-group select {
  width: 300px;
  border-color: #ddd;
  font-size: 28px;
}

.operation {
  margin-top: 16px;
}

.cancel {
  margin-left: 85px;
  background-color: #ddd;
}

.cancel,
.confirm {
  padding: 8px 24px;
  border: 0;
  border-radius: 4px;
}

.confirm {
  margin-left: 16px;
  background-color: #006699;
  color: #fff;
}
</style>

v-for

作用:可以遍歷 數(shù)組 或者 對象 或者數(shù)字畴蹭,用于渲染結構 可以遍歷循環(huán)結構

遍歷數(shù)組語法:

v-for="item in 數(shù)組名"

v-for="(item, index) in 數(shù)組名"

遍歷對象語法:

v-for = "(value, key) in 對象名"

遍歷數(shù)字

v-for = "item in 數(shù)字"

 v-for優(yōu)先級高于v-if
    如果同時出現(xiàn)v-for和v-if,無論判斷條件是否成立鳍烁,都會執(zhí)行一遍v-for循環(huán),這樣浪費性能繁扎,所以要盡可能的避免兩者一起使用幔荒。

v-for就地更新

vue會盡量復用上一次渲染的dom

當需要重新渲染時糊闽,vue會先對比緩存在內存里的的dom結構,然后只更新變化的結構

新舊DOM產(chǎn)生后對比, 然后決定是否復用真實DOM/更新內容

Vue會盡可能的就地(同層級爹梁,同位置)右犹, 對比虛擬dom,復用舊dom結構姚垃,進行差異化更新

可以復用舊的dom結構念链,更新高效

虛擬dom

html 渲染出來的 真實dom樹,是個樹形結構(復雜)积糯。每個標簽掂墓,都只是樹的某個節(jié)點

虛擬dom:本質就是 保存節(jié)點信息, 描述真實dom的 JS 對象

一個緩存在內存的js對象,可以用最少的屬性結構看成,描述真實的dom

可以更高效的對比變化的地方君编,只更新改變的地方,減少dom操作

v-for中的key屬性

在沒有提供key的時候或是使用索引作為key的值時就使用就地更新

在使用key時川慌,就根據(jù)key的值進行對比吃嘿,提示對比和更新性能

key的值的要求是:唯一不重復的字符串或數(shù)字

key值 : 有id用id 沒有用索引

可以配合虛擬DOM提高更新的性能

動態(tài)修改樣式

style

用 v-bind 動態(tài)設置標簽的 style 行內樣式

語法 :style="對象/數(shù)組"

對象

:style = '{屬性名:"屬性值"}' // 屬性值帶引號

數(shù)組

:style = '[]' // 數(shù)組里可以是多個對象,多個值

樣式的屬性名帶橫線

1.使用小駝峰命名

2.給屬性名加上引號

class

用 v-bind 動態(tài)設置標簽的 class 類名

語法 :class="對象/數(shù)組"

    對象:如果鍵值對的值為true梦重,那么就有這個類兑燥,否則沒有這個類

   對象中可以使用表達式判斷

類名有橫線 : 加引號

    數(shù)組:數(shù)組中所有的類,都會添加到盒子上

    數(shù)組中的所有元素都要加上引號        

v-bind 對于類名操作的增強, 注意點 :class 不會影響到原來的 class 屬性

計算屬性

計算屬性默認情況下只能獲取琴拧,不能修改降瞳。

要給計算屬性賦值,就必須寫計算屬性的完整寫法艾蓝!

作用: 根據(jù)一些數(shù)據(jù)算出來的屬性 (用的時候不加括號)

聲明在computed對象中 computed和data methods 同級

簡寫 : 聲明為一個函數(shù)

computed : {
   age(){
     
   }
}

完整寫法:

computed : {
 age: {
      get() {
        // 獲取計算屬性的值
        const date = new Date();
        return date.getFullYear() - this.year;
      },
      set(newAge) {
        //  更新計算屬性的值
        // 本質上就是更新變量的值 改變之后觸發(fā)set屬性
        const date = new Date();
        this.year = date.getFullYear() - newAge;
      },
    },
}

set里的參數(shù)是age的狀態(tài)或數(shù)據(jù)力崇,當age更新時觸發(fā)set,然后執(zhí)行set里面的代碼赢织,將新的數(shù)據(jù)更新給變量亮靴,然后又觸發(fā)get

偵聽器

watch: 可以偵聽到 data/computed 屬性值的改變

簡寫

watch:{
  被偵聽的屬性名(newVal,oldVal){
   newVal 是新值
   oldVal 是舊值
}

完整寫法

可以用于監(jiān)聽數(shù)據(jù)變化,然后同步到本地

 // 偵聽數(shù)據(jù)的變化
  // 偵聽器完整寫法  相當于input時間
  // 可以偵聽復雜數(shù)據(jù)類型 也可以立即執(zhí)行
  watch: {
    list: {
      // immediate: true,   立即執(zhí)行一次
      deep: true, // 深度偵聽 常用于數(shù)組或對象
      handler(newVal) {  // 數(shù)據(jù)變化觸發(fā)的函數(shù)
        console.log(newVal.name);
      },
    },
  },
};

組件

組件概念

組件是可復用的 Vue 實例, 封裝標簽, 樣式和JS代碼

組件化 :封裝的思想于置,把頁面上 可重用的部分 封裝為 組件茧吊,從而方便項目的 開發(fā) 和 維護

一個頁面, 可以拆分成一個個組件八毯,一個組件就是一個整體

每個組件可以有自己獨立的 結構 樣式 和 行為(html, css和js)

前端組件化開發(fā)的好處:

1.提高了 復用性和靈活性

2.提升了 開發(fā)效率 和 后期可維護性

組件的注冊使用

App.vue 是根組件, 這個比較特殊, 是最大的一個根組件搓侄。其實里面還可以注冊使用其他小組件

使用組件的四步:
1.創(chuàng)建組件, 封裝要復用的標簽, 樣式, JS代碼
2.引入組件
3.注冊組件
全局注冊 – main.js中 – 語法如圖
局部注冊 – 某.vue文件內 – 語法如圖
4.使用組件:組件名當成標簽使用即可
<組件名></組件名>

注意點:組件名不能和內置的html名同名

創(chuàng)建組件

創(chuàng)建一個vue文件

封裝要復用的結構 ,樣式 话速, 和js代碼

引入組件

import 組件對象  from  vue文件路徑
import {組件對象} from  vue文件路徑

當導入部分或導入非原組件默認導出的組件時讶踪,需要加大括號

導入默認導出的組件或者將整個模塊作為單一的對象進行導入,不需要加大括號泊交,該模塊的所有導出都會作為對象的屬性存在

注冊組件

全局注冊

Vue component('組件名',組件對象)

局部注冊

export default {
  components : {
   '組件名' : 組件對象
  }
}

使用組件

<組件名></組件名>

組件名的命名方式

在進行組件的注冊時乳讥,定義組件名的方式有兩種

  1. 注冊使用短橫線命名法柱查,例如 hm-header 和 hm-main

使用時 <hm-button> </hm-button>

Vue.component('hm-button',HmButton)
  1. 注冊使用大駝峰命名法,例如 HmHeader 和 HmMain

使用時 <HmButton> </HmButton><hm-button> </hm-button> 都可以

Vue.component('HmButton',HmButton)

推薦1: 定義組件名時, 用大駝峰命名法, 更加方便

推薦2: 使用組件時云石,遵循h(huán)tml5規(guī)范, 小寫橫杠隔開(可選)

組件在 開發(fā)者工具中 顯示的名字唉工,可以通過name進行修改

在注冊組件期間,除了可以直接提供組件的注冊名稱之外汹忠,還可以把組件的 name 屬性作為注冊后組件的名稱

<script>
    export default {
        name : 'HmButton'
    }
</script>

name寫在要組冊的組件中

注冊可以全局注冊或者局部注冊

Vue.component(HmButton.name,HmButton)

組件之間的樣式?jīng)_突 scoped

默認情況下淋硝,寫在組件中的樣式會 全局生效,因此很容易造成多個組件之間的樣式?jīng)_突問題宽菜。

  1. 全局樣式: 默認組件中的樣式會作用到全局

  2. 局部樣式: 可以給組件加上 scoped 屬性, 可以讓樣式只作用于當前組件

scoped原理

(1)當前組件內標簽都被添加 data-v-hash值 的屬性

(2)css選擇器都被添加 [data-v-hash值] 的屬性選擇器

最終效果: 必須是當前組件的元素, 才會有這個自定義屬性, 才會被這個樣式作用到

scoped會在元素上添加唯一的屬性(data-v-x形式)谣膳,css編譯后也會加上屬性選擇器,從而達到限制作用域的目的

組件通信--父傳子

父組件給子組件傳值

被引入的組件是子組件

父組件 : App.vue

子組件:被引入的組件

父傳子語法:

  1. 父組件通過給子組件加屬性傳值
    <Son price="100" title="不錯" :info="msg"></Son>

  2. 子組件中, 通過props屬性接收

     props: ['price', 'title', 'info']
    

父組件

<template>
  <div>
    <h1>父組件</h1>
    <a-package :strs="str"></a-package>
  </div>
</template>

<script>
import A from "./components/a-package.vue";
export default {
  components: {
    "a-package": A,
  },
  data() {
    return {
      str: "這是父組件傳給子組件的值",
    };
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <h1>{{ strs }}</h1>
  </div>
</template>

<script>
export default {
  props: ["strs"],
};
</script>

<style>
</style>

注意點:

1.父傳子之前需要先將子組件引入父組件中使用

2.給子組件傳值的屬性等于值需要寫在子組件在父組件的標簽中

3.子組件需要使用props接收父組件傳過來的值赋焕,傳過來的值要用引號

4.props中接收的是寫在父組件中子組件標簽中的屬性 参歹,所對應的值可以直接在子組件中使用,但不能改變

v-for遍歷組件

父組件

<template>
  <div>
    <h1>v-for遍歷組件</h1>
    <a-package
      v-for="item in list"
      :key="item.id"
      :username="item.name"
      :ages="item.age"
    ></a-package>
  </div>
</template>

<script>
import A from "./components/a-package.vue";
export default {
  components: {
    "a-package": A,
  },
  data() {
    return {
      list: [
        { id: 1, name: "唐僧", age: 20 },
        { id: 1, name: "悟空", age: 600 },
        { id: 1, name: "八戒", age: 1800 },
        { id: 1, name: "沙僧", age: 1500 },
      ],
    };
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <h1>{{ username }}</h1>
    <h2>{{ ages }}</h2>
  </div>
</template>

<script>
export default {
  props: ["username", "ages"],
};
</script>

<style>
</style>

單向數(shù)據(jù)流

在vue中需要遵循單向數(shù)據(jù)流原則: (從父到子的單向數(shù)據(jù)流動, 叫單向數(shù)據(jù)流)

  1. 父組件的數(shù)據(jù)變化了隆判,會自動向下流動影響到子組件

  2. 子組件不能直接修改父組件傳遞過來的 props犬庇, props是只讀的

組件通訊--子傳父

子傳父的基本語法:

  1. 子組件可以通過 this.$emit('自定義事件名', 參數(shù)1, 參數(shù)2, ...) 觸發(fā)事件的同時傳參的
  2. 父組件可以給子組件注冊對應的自定義事件
  3. 父組件并提供對應的函數(shù)接收參數(shù)

子組件觸發(fā)事件之后的方法給父組件傳值

this.$emit('ok',參數(shù))

父組件在子組件標簽上監(jiān)聽該事件侨嘀,當子組件觸發(fā)該事件時臭挽,調用方法

<子組件 @ok = 'fn'></子組件>

<script>
export default {
   methods: {
      fn(e){
        console.log(e)
      }
   }
}
</script>

當子組件傳參只有一個時,父組件監(jiān)聽的事件觸發(fā)的方法默認第一個就是子組件的傳參

當父組件也有傳參時咬腕,$event則是子組件的默認傳參

<子組件 @ok = 'fn(item,$event)'></子組件>

<script>
export default {
   methods: {
      fn(item,e){
        console.log(item)
        console.log(e)
      }
   }
}
</script>

props校驗

props 是父傳子, 傳遞給子組件的數(shù)據(jù), 為了提高 子組件被使用時 的穩(wěn)定性, 可以進行props校驗欢峰, 驗證傳遞的數(shù)據(jù)是否符合要求

默認的數(shù)組形式, 不會進行校驗, 如果希望校驗, 需要提供對象形式的 props

props: {
    // 基礎的類型檢查 (`null` 和 `undefined` 會通過任何類型驗證)
    propA: Number,
    // 多個可能的類型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 帶有默認值的數(shù)字
    propD: {
      type: Number,
      default: 100
    },
    // 帶有默認值的對象
    propE: {
      type: Object,
      // 對象或數(shù)組默認值必須從一個工廠函數(shù)獲取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定義驗證函數(shù)
    propF: {
      validator: function (value) {
        // 這個值必須匹配下列字符串中的一個
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }

v-model語法糖

語法糖:v-model本質上是 value屬性和input事件的一層包裝

v-model的作用:提供數(shù)據(jù)的雙向綁定

1.數(shù)據(jù)發(fā)生了改變,頁面會自動變 v-bind:value

2.頁面輸入改變 涨共, 數(shù)據(jù)會自動變化 v-on:input

v-model流程

1.先是在父組件中聲明數(shù)據(jù)

2.然后在父組件中的子組件的標簽使用v-model 等于 數(shù)據(jù)

3.子組件在props中接收父組件傳過來的參數(shù)必須為value

4.在子組件中使用value 然后在觸發(fā)事件時將要改變的數(shù)據(jù)作為參數(shù)傳給父組件 傳參定義的事件默認為input

5.父組件因為使用v-model 纽帖,默認監(jiān)聽input事件,所有傳過來的數(shù)據(jù)默認修改 举反,然后傳給子組件

以上是v-model實現(xiàn)組件數(shù)據(jù)的雙向綁定的步驟

父組件

<template>
  <div>
    <a-package v-model="num"></a-package>
  </div>
</template>

<script>
import A from "./components/a-package.vue";
export default {
  data() {
    return {
      num: 10,
    };
  },
  components: {
    "a-package": A,
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <button @click="$emit('input', value - 1)">--</button>
    {{ value }}
    <button @click="$emit('input', value + 1)">++</button>
  </div>
</template>

<script>
export default {
  props: ["value"],
};
</script>

<style>
</style>

注意:

當子組件傳數(shù)據(jù)給父組件時

在script中使用 this.$emit('自定義事件名'懊直,參數(shù))

在template中不需要使用this

ref和$refs

作用:利用 ref 和 $refs 可以用于 獲取 dom 元素, 或者組件實例

1.獲取dom標簽

給要獲取的標簽添加ref屬性

然后通過this.$refs.屬性值 ,獲取目標標簽

<h1 ref='my'><h1>
console.log(this.$refs.my)

2.獲取組件實例

給Demo組件目標組件, 添加ref屬性-名字隨意

恰當時機, 通過 this.$refs.xxx 獲取組件對象, 可調用組件對象里方法等

<組件名 ref= 'my'></組件名>
this.$refs.my.方法或屬性

$nextTick

$nextTick:等DOM更新后, 才會觸發(fā)執(zhí)行此方法里的函數(shù)體

methods:{
   this.show = true
   this.$nextTick(() =>{
     console.log(this.$refs.my)
   })
}

小案例

點擊按鈕火鼻,顯示輸入框獲取焦點

<template>
  <div>
    <input type="text" v-show="show" ref="inp" />
    <button v-show="!show" @click="fn">點擊顯示</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      show: false,
    };
  },
  methods: {
    fn() {
      this.show = !this.show;
      console.log(this.$refs.inp);
      this.$nextTick(() => {
        this.$refs.inp.focus();
      });
    },
  },
};
</script>

<style>
</style>

動態(tài)組件

動態(tài)組件是可以改變的組件室囊,可以解決多組件同一位置,切換顯示的問題

基本語法

component 組件(位置) + is 屬性 (哪個組件)

修改 is 屬性綁定的值 => 切換組件

  1. 準備被切換的 3個組件, 并引入注冊

  2. 準備變量來承載要顯示的"組件名"

  3. 設置掛載點<component>, is屬性設置要顯示的組件 ( component + is )

  4. 點擊按鈕 – 修改name變量里的"組件名" ( 修改 is 的值)

父組件

<template>
  <div>
    <button @click="name = 'a-package'">老虎</button>
    <button @click="name = 'b-package'">??</button>
    <button @click="name = 'c-package'">貓</button>
    <!-- <a-package></a-package>
    <b-package></b-package>
    <c-package></c-package> -->
    <component :is="name"></component>
  </div>
</template>

<script>
import A from "./components/a-package.vue";
import B from "./components/b-package.vue";
import C from "./components/c-package.vue";
export default {
  components: {
    "a-package": A,
    "b-package": B,
    "c-package": C,
  },
  data() {
    return {
      name: "a-package",
    };
  },
};
</script>

<style>
</style>

子組件中分別是三種對應按鈕的圖片

當點擊對應的按鈕時顯示對應的圖片

注意:當使用動態(tài)組件時魁索,不要再使用子組件標簽

只需要切換:is的值就可以切換組件

使用v-if 的顯示隱藏也可以達到類似的效果

自定義指令

自定義指令:自己定義指令, 封裝dom操作融撞,擴展額外功能

局部注冊

color是指令名

// 局部注冊自定義指令
  directives: {
    color: {
      //  當指令所在的標簽插入到dom樹中,下面方法會被執(zhí)行
      inserted(dom) {
        dom.style.color = "red";
      },
    },
  },

全局注冊

bold是指令名

// 全局注冊自定義指令
Vue.directive("bold", {
  inserted(dom) {
    dom.style.fontSize = "50px";
  },
});

自定義指令傳參

語法:在綁定指令時粗蔚,可以通過“等號”的形式為指令綁定具體的參數(shù)值

通過 binding.value 可以拿到指令值尝偎,指令值修改會觸發(fā) update 函數(shù)

自定義指令主要是對dom的操作來做一些額外操作

App.vue

<template>
  <div>
    <p v-color="red" v-bold="'100px'">自定義指令</p>
    <p v-color v-bold>自定義指令</p>
    <p v-color v-bold>自定義指令</p>
    <button @click="fn">點擊</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      red: "red",
      blue: "blue",
      pink: "pink",
    };
  },
  // 局部注冊自定義指令
  directives: {
    color: {
      //  當指令所在的標簽插入到dom樹中,下面方法會被執(zhí)行
      inserted(dom) {
        dom.style.color = "red"; // value = red
      },
      // update 在指令的值改變時觸發(fā)鹏控,將修改后的值傳參然后重新賦值修改
      // binding.value是傳給自定義指令的值
      update(dom, binding) {
        dom.style.color = binding.value;
      },
    },
  },
  methods: {
    fn() {
      this.red = "green";
    },
  },
};
</script>

<style>
</style>

main.js

import Vue from "vue";
import App from "./App.vue";

Vue.config.productionTip = false;

// 全局注冊自定義指令
Vue.directive("bold", {
  inserted(dom) {
    dom.style.fontSize = "50px";
  },
  update(dom, binding) {
    dom.style.fontSize = binding.value;
  },
});

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

keep-alive--緩存組件

keep-alive是緩存組件冬念,不會重復創(chuàng)建銷毀

    <button @click="names = 'a-name'">a-a</button>
    <button @click="names = 'b-name'">b-b</button>
    <keep-alive>
      <component :is="names"></component>
    </keep-alive>

兩個生命周期

export default {
  //在緩存激活的時候觸發(fā)
  activated() {
    console.log("b激活了");
  },
  //在緩存失活的時候觸發(fā)
  deactivated() {
    console.log("b失活了");
  },
};

插槽

默認插槽

插槽基本語法:

  1. 組件內用<slot></slot>占位
  2. 使用組件時<組件名></組件名>夾著的地方, 傳入標簽替換slot

父組件

<template>
  <div>
    <slot-a>
      <img
        src="https://ts3.cn.mm.bing.net/th?id=OIP-C.S3QOsgnlzrpbpAdOXF4YMAHaEo&w=316&h=197&c=8&rs=1&qlt=90&o=6&dpr=1.25&pid=3.1&rm=2"
        alt=""
      />
    </slot-a>
  </div>
</template>

<script>
import slotA from "./components/slot-a.vue";
export default {
  components: {
    "slot-a": slotA,
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <h1>插槽</h1>
    <slot></slot>
    <p>這是通過插槽傳遞結構</p>
  </div>
</template>

<script>
export default {};
</script>

<style>
</style>

插槽 - 后備內容(默認值)

插槽后備內容:封裝組件時趁窃,可以為預留的 <slot> 插槽提供后備內容(默認內容)

語法: 在<slot>標簽內放置內容, 作為默認顯示內容

效果:

外部使用組件時,不傳東西急前,則slot會顯示后備內容 (slot標簽內的結構)

外部使用組件時,傳東西了瀑构,則slot整體會被換掉

<slot>
    <p>這是默認內容</p>
</slot>

插槽 - 具名插槽

一個組件內有多處裆针,需要外部傳入標簽,進行定制

語法:

多個slot使用name屬性區(qū)分名字 <slot name="content"></slot>

template配合v-slot:名字來分發(fā)對應標簽寺晌,根據(jù)對應的名字傳給不同的插槽對應的結構或內容

v-slot:可以簡化成#

父組件

<template>
  <div>
    <slot-a>
      <template #header>
        <p>這是插槽的標題</p>
      </template>
      <template #body>
        <p>這是插槽的內容</p>
      </template>
      <template #footer>
        <p>這是插槽的底部</p>
      </template>
    </slot-a>
  </div>
</template>

<script>
import slotA from "./components/slot-a.vue";
export default {
  components: {
    "slot-a": slotA,
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <p>
      <slot name="header"><button>標題</button></slot>
    </p>
    <p>
      <slot name="body"><button>內容</button></slot>
    </p>
    <p>
      <slot name="footer"><button>底部</button></slot>
    </p>
  </div>
</template>

<script>
export default {};
</script>

<style>
</style>

插槽 - 作用域插槽

作用域插槽: 定義 slot 插槽的同時, 是可以傳值的世吨。給插槽上可以綁定數(shù)據(jù),將來使用組件時可以用

基本步驟:

1.給slot標簽以添加屬性的方式傳值

2.所有添加的屬性都會被添加到一個對象中呻征,然后傳給父組件的對應的地方

3.在template中 耘婚,接收子組件傳過來的對象

匿名的就是 v-slot =‘自定義的對象名’

具名的就是 v-slot= 插槽名 = ‘自定義的對象名’

匿名插槽傳參

父組件

<template>
  <div>
    <!-- 接收子組件傳過來的對象 -->
    <slot-a v-slot="obj">
      <!--  子組件插槽傳過來的值  obj:{user:{name:'張三',age:18}} -->
      <h1>{{ obj.user.name }}</h1>
      <h1>{{ obj.user.age }}</h1>
    </slot-a>
  </div>
</template>

<script>
import slotA from "./components/slot-a.vue";
export default {
  components: {
    "slot-a": slotA,
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <slot :user="user"></slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        name: "張三",
        age: 18,
      },
    };
  },
};
</script>

<style>
</style>

具名插槽傳參

父組件

<template>
  <div>
    <slot-a>
      <template #head="obj">
        <p>{{ obj.title }}</p>
      </template>
      <template #body="obj">
        <p>{{ obj.content }}</p>
      </template>
    </slot-a>
  </div>
</template>

<script>
import slotA from "./components/slot-a.vue";
export default {
  components: {
    "slot-a": slotA,
  },
};
</script>

<style>
</style>

子組件

<template>
  <div>
    <slot name="head" :title="user.title">標題</slot>
    <slot name="body" :content="user.content">內容</slot>
  </div>
</template>

<script>
export default {
  data() {
    return {
      user: {
        title: "這是一個標題",
        content: "這是內容",
      },
    };
  },
};
</script>

<style>
</style>

生命周期

vue組件生命周期:從創(chuàng)建 到 銷毀 的整個過程就是 – Vue實例的 - 生命周期

生命周期-鉤子函數(shù)概述

生命周期函數(shù):是由 vue 框架提供的內置函數(shù),會伴隨著組件的生命周期陆赋,自動按次序執(zhí)行

作用: 特定的時間點沐祷,執(zhí)行特定的操作

比如: 組件創(chuàng)建完畢后,可以在created 生命周期函數(shù)中發(fā)起Ajax 請求攒岛,從而初始化 data 數(shù)據(jù)

分類: 三大階段赖临,8個方法

  • 組件初始化階段的生命周期函數(shù)
  • 組件運行階段的生命周期函數(shù)
  • 組件銷毀階段的生命周期函數(shù)

八大生命周期鉤子函數(shù):

1.beforeCreate:data數(shù)據(jù)初始化之前,組件還沒有數(shù)據(jù)

2.created: data數(shù)據(jù)初始化之后灾锯,可以獲取到組件的數(shù)據(jù)

3.beforeMount:DOM渲染之前兢榨,DOM還沒渲染

4.mounted:DOM渲染之后,可以操作DOM了

5.beforeUpdate: 數(shù)據(jù)更新顺饮,DOM更新前

6.updated: 數(shù)據(jù)更新吵聪,DOM更新后

7.beforeDestroy: 組件銷毀前

8.destroyed: 組件銷毀后

路由

單頁面應用程序

SPA - Single Page Application

單頁面應用(SPA): 所有功能在一個html頁面上實現(xiàn) 例如網(wǎng)易云音樂

(多頁面應用程序MPA)

優(yōu)點:

不整個刷新頁面,每次請求僅獲取需要的部分兼雄,用戶體驗更好

數(shù)據(jù)傳遞容易, 開發(fā)效率高

缺點:

開發(fā)成本高(需要學習專門知識 - 路由)

首次加載會比較慢一點吟逝。不利于seo

路由

路由就是路徑地址和組件的映射關系

vue的路由是 vue-router ,是vue官方提供的一個插件君旦,專門負責出來路由

其中v3 對應的是vue2.0

   v4 對應的是vue3.0

vue的組件分類說明

組件分類: .vue文件分2類, 一個是頁面組件, 一個是復用組件

src/views文件夾

頁面組件 - 頁面展示 - 配合路由用

src/components文件夾

復用組件 - 展示數(shù)據(jù) - 常用于復用

配置路由的步驟

1.下包

npm i vue-router@3   // @后面是對應的版本

2.引入路由

import VueRouter from "vue-router";

3.創(chuàng)建組件

4.引入組件

5.導入 注冊路由

Vue.use(VueRouter); //使用Vue注冊之前要先引入Vue

6.定義路由

const routes = [
  {
    path: "/head-name",  // 地址
    component: headName, // 組件
  },
]

7.實例化路由

routes這個是固定的 屬性名 改變后路由地址改變無法跳轉頁面

const router = new VueRouter({
  routes, //縮寫
});

8.導出路由

export default router;

9.在main.js中引入路由澎办,然后掛載到vue實例上面去

// 引入路由
import router from "./router/index";

new Vue({
  // 將路由掛載到vue實例上
  router, //簡寫
  render: (h) => h(App),
}).$mount("#app");

10.在App.vue上使用 <router-view></router-view> 來渲染路由

聲明式導航

組件router-link 替代 a標簽,能跳轉金砍,能高亮

  1. vue-router提供了一個全局組件 router-link

  2. router-link實質上最終會渲染成a鏈接 to屬性等價于提供 href屬性(to無需#)

  3. router-link提供了聲明式導航高亮的功能(自帶類名)

<template>
  <div>
    <router-link to="/head-name">1</router-link><span>|</span>
    <router-link to="/body-name">2</router-link><span>|</span>
    <router-link to="/foot-name">3</router-link>
    <router-view></router-view>
  </div>
</template>

<script>
export default {};
</script>

<style scoped>
.router-link-active {
  color: red;
}
</style>

聲明式導航 - 兩個類名

router-link 會自動給當前導航添加兩個類名

router-link-active: 激活的導航鏈接 模糊匹配

可以匹配開始一致的路徑

router-link-exact-active: 激活的導航鏈接 精確匹配

只能匹配完全一致的路徑

可以修改默認高亮的類名

const router = new VueRouter({
  routes局蚀,
  linkActiveClass = 'aa'
  linkExactActiveClass = 'bb'
});

聲明式導航 - 跳轉傳參

跳轉路由時, 可以給路由對應的組件內傳值

在router-link上的to屬性傳值, 語法格式如下

/path?參數(shù)名=值 當參數(shù)對頁面不是必須的,通常放在問號后面

/path/值 – 需要路由對象提前配置 path: “/path/:參數(shù)名” 參數(shù)對應頁面來說是必須的恕稠,就將參數(shù)嵌套在url里面

對應頁面組件接收傳遞過來的值

在對應的組件中創(chuàng)建后可以接收到

this.$route 代表當前的頁面信息

查詢參數(shù)

this.$route.query.參數(shù)名 問號后面

this.$route.params.參數(shù)名 嵌套url

1.問號后面非必要傳參

<!-- 對象屬性琅绅,path是要跳轉的路徑,query是問號后面的參數(shù) -->
<router-link :to="{ path: '/bar', query: { name: 'jack', age: 18 } }">bar</router-link>

在對應頁面可以查到對應的參數(shù)信息

created() {
    console.log(this.$route.query.name);
  },

2.內嵌url 對頁面必要性傳參

當需要傳遞內嵌到路徑里的參數(shù)的時候

/路徑/:參數(shù)名 來聲明內嵌式參數(shù) 在定義路徑和組件的映射關系中

路由文件

 {
    path: "/foot-name/:id",
    component: footName,
  },

App.vue

<router-link :to="`/foot-name/${user.id}`">3</router-link>

對應的組件可以查到傳入的參數(shù)

export default {
  created() {
    console.log(this.$route.params.id);
  },
};

想要用對象的方式傳參鹅巍, path不能和params一起傳參 千扶,如果非要用對象的方式傳參料祠,需要給對應的路由取一個名字,用name和params一起傳參

{
    name: "aa",
    path: "/body-name/:id",
    component: bodyName,
  },
<router-link :to="{ name: 'aa', params: { id: 66 } }">2</router-link>

對應組件一樣可以查看傳的參數(shù)

export default {
  created() {
    console.log(this.$route.params.id);
  },
};

重定向

重定向:匹配path后, 強制跳轉path路徑

網(wǎng)頁打開url默認hash值是/路徑

redirect是設置要重定向到哪個路由路徑

// 重定向
  {
    path: "/", // 默認根組件
    // 當為根地址是重定向為新的地址
    redirect: "/head-name",
  },

vue路由--404

404:當找不到路徑匹配時澎羞,給個提示頁面

路由最后, path匹配*(任意路徑) – 前面不匹配就命中最后這個

// 模糊匹配要放在任意一個
  {
    // *代表任意路徑
    path: "*",
    //組件使用路由先要引用
    component: noneName,
  },

路由模式設置 - 修改路由髓绽,在地址欄的模式

hash路由例如: http://localhost:8080/#/home

history路由例如: http://localhost:8080/home (以后上線需要服務器端支持)

const router = new VueRouter({
  routes, //縮寫
  // 路由模式
  mode: "history",  // 這就是設置路由模式
});

編程式導航

編程式導航:用JS代碼來進行跳轉

this.$router 有push方法,可以推入頁面妆绞,壓下上一個頁面顺呕,也可以傳參

1.可以直接傳路徑

2.可以傳對象,里面有路徑和參數(shù) path和query括饶,或者name和params (path和params不能在一起)

<button @click="$router.push('/head-name')">編程式導航</button>

編程式導航 - 路由傳參

query傳:$route.query.xxx 接收

params傳:$route.params.xxx 接收

區(qū)別:

params傳參:是在內存中傳參株茶,刷新會丟失

query傳參:是在地址欄傳參,刷新還在

<button @click="$router.push({ path: '/head-name', query: { age: 55 } })">
<button @click="$router.push({ name: 'aa', params: { id: 2983193 } })">

過濾器--vue3.0已經(jīng)廢棄

和methods方法一樣图焰,filters

只能用在插值表達式和動態(tài)綁定屬性中启盛,用 | 表明

<template>
  <div>
    <h1>{{ str | split | res | join }}</h1>
  </div>
</template>

<script>
export default {
  data() {
    return {
      str: "123456",
    };
  },
  filters: {
    split(str) {
      return str.split("");
    },
    res(str) {
      return str.reverse();
    },
    join(str) {
      return str.join("");
    },
  },
};
</script>

<style>
</style>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市技羔,隨后出現(xiàn)的幾起案子僵闯,更是在濱河造成了極大的恐慌,老刑警劉巖堕阔,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍厂,死亡現(xiàn)場離奇詭異,居然都是意外死亡超陆,警方通過查閱死者的電腦和手機牺弹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來时呀,“玉大人张漂,你說我怎么就攤上這事〗髂龋” “怎么了航攒?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長倦卖,這世上最難降的妖魔是什么壹瘟? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任杂靶,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾敢,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著簇抵,像睡著了一般庆杜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碟摆,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天晃财,我揣著相機與錄音,去河邊找鬼典蜕。 笑死拓劝,一個胖子當著我的面吹牛,可吹牛的內容都是我干的嘉裤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼栖博,長吁一口氣:“原來是場噩夢啊……” “哼屑宠!你這毒婦竟也來了?” 一聲冷哼從身側響起仇让,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤典奉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丧叽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卫玖,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年踊淳,在試婚紗的時候發(fā)現(xiàn)自己被綠了假瞬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡迂尝,死狀恐怖脱茉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情垄开,我是刑警寧澤琴许,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站溉躲,受9級特大地震影響榜田,放射性物質發(fā)生泄漏。R本人自食惡果不足惜锻梳,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一箭券、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唱蒸,春花似錦邦鲫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古今。三九已至,卻和暖如春滔以,著一層夾襖步出監(jiān)牢的瞬間捉腥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工你画, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抵碟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓坏匪,卻偏偏與公主長得像拟逮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子适滓,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350