1. 程式人生 > 其它 >Vue學習筆記與常用操作

Vue學習筆記與常用操作

腳手架檔案結構

​ 在原始碼目錄中建立如下結構:

- App.vue:是所有元件的父元件

- main.js: 是整個專案的入口

- assets:用於存放靜態資原始檔

- components:用於存放Vue功能元件

- views:用於存放Vue檢視元件

- router:用於存放vue-router配置

關於不同版本的Vue:

  1.vue.js與vue.runtime.xxx.js的區別:
        (1).vue.js是完整版的Vue,包含:核心功能+模板解析器。
        (2).vue.runtime.xxx.js是執行版的Vue,只包含:核心功能;沒有模板解析器。
  2.因為vue.runtime.xxxjs沒有模板解析器,所以不能使用template配置項,需要使用 render函式接收到的createElement函式去指定具體內容。


ref屬性

    1.被用來給元素或子元件註冊引用資訊(id的替代者)
    2.應用在htm1標籤上獲取的是真實DOM元素,應用在元件標籤上是元件例項物件(vc)
    3.使用方式:
        打標識:<h1 ref="xxx">.....</h1> 或<School ref="xxx"></School>
        獲取:this.$refs.xxx

配置項props

功能:讓元件接收外部傳過來的資料

(1)傳遞資料:

     <Demo name="xxx"/>
     
(2).接收資料:

     第一種方式(只接收):
         props:['name']
        
     第二種方式(限制類型):
        props:{
            name:Number
            }
            
     第三種方式(限制類型、限制必要性、指定預設值):
        props:{ 
           name:{
                    type:String,//型別
                    required:true,//必要性 
                    default:老王//預設值
                  }
                }
備註:props是隻讀的,Vue底層會監測你對props的修改,如果進行了修改,就會發出警告,

外掛

功能:用於增強Vue
        本質:包含instal1方法的一 個物件,instal1的第一個參 數是Vue,第二個以後的引數是外掛使用者傳遞的資料。
        定義外掛:
            物件.install = function (Vue, options) {
                // 1.新增全域性過濾器
                Vue . filter(....)
                // 2.新增全域性指令
                Vue . directive(....)
                // 3.配置全域性混入(合)
                Vue . mixin(....)
                // 4.新增例項方法
                Vue . prototype . $myMethod = function () {...}
                Vue . prototype . $myProperty = xxxx
     使用外掛: Vue.use()

scoped樣式

1.作用:讓樣式在區域性生效,防止衝突
2.寫法:<style scoped>

總結TodoList案例

參考程式碼

1.元件化編碼流程:

        (1).拆分靜態元件:元件要按照功能點拆分,命名不要與html元素衝突。

        (2).實現動態元件:考慮好資料的存放位置,資料是一個元件在用, 還是一 些元件在用: 

                1).一個元件在用:放在元件自身即可。

                2).一些元件在用: 放在他們共同的父元件.上(狀態提升)。
                
                (3).實現互動:從繫結事件開始。

2. props適用於:

         (1).父元件==>子元件通訊

         (2).子元件==>父元件通訊(要求父先給子-一個函式)

3.使用v-modelI時要切記: v-model繫結的值不能是props傳過來的值,因為props是不可以修改的!

4. props傳過來的若是物件型別的值,修改物件中的屬性時Vue不會報錯,但不推薦這樣做。

webStorage(本地儲存和會話技術)

    1.儲存內容大小一般支援5MB左右(不同瀏覽器可能還不一樣)
    2.瀏覽器端通過WindowsessionStorage和WindowlocalStorage屬性來實現本地儲存機制。
    3.相關API:
        1.xxxxxStorage.setItem('key','value');
            該方法接受一個鍵和值作為引數,會把鍵值對新增到儲存中,如果鍵名存在,則更新其對應的值。
        
        2.xxxxxStorage.getItem('person');
            該方法接受一個鍵名作為引數,返回鍵名對應的值。
        3.xxxxxStorage.removeItem('key');
            該方法接受一個鍵名作為引數,並把該鍵名從儲存中刪除。
        4.*xxxxStorage.clear()
            該方法會清空儲存中的所有資料。
    4.備註:
        1.SessionStorage儲存的內容會隨著瀏覽器視窗關閉而消失。
        2.LocalStoraae儲存的內容,需要手動清除才會消失。
        3.xxxxxStorage.getItem(xxx)如果xxx對應的value獲取不到,那麼getltem的返回值是null
        4.JSON.parse(null)的結果依然是null

元件的自定義事件

##元件的自定義事件

    1.一種元件間通訊的方式,適用於:子元件==>父元件

    2.使用場景:A是父元件,B是子元件,B想給A傳資料,那麼就要在A中給B繫結自定義事件(事件的回撥在A中)。

    3.繫結自定義事件:
            1.第一種方式,在父元件中:<Demo @atguigu="test"/>或<Demo v-on:atguigu="test"/>
            2.第二種方式,在父元件中:
                <Demo ref="demo"/>
                    .....
                    mounted(){
                    this.$refs.xxx.$on('atguigu',this.test)

            3.若想讓自定義事件只能觸發一次,可以使用once修飾符,或$once方法。
        
    4.觸發自定義事件:this.$emit('atguigu,資料)

    5.解綁自定義事件this.$off('atguigu')

    6.元件上也可以繫結原生DOM事件,需要使用native修飾符。

    7.注意:通過this.$refs.xxx.$on(atguigu,回撥)繫結自定義事件時,回撥要麼配置在methods中,要麼用箭頭函式,否則this指向會出問題!

全域性事件匯流排(GlobalEventBus)

##全域性事件匯流排(GlobalEventBus)
        1.一種元件間通訊的方式,適用於任意元件間通訊。
        
        2.安裝全域性事件匯流排:
            new Vue({
              beforeCreate(){
                Vue.prototype.$bus=this//安裝全域性事件匯流排,$bus就是當前應用的vm},
             })
        3.使用事件匯流排:
              1.接收資料:A元件想接收資料,則在A元件中給$bus繫結自定義事件,事件的回撥留在A元件自身。
                    methods(){
                    demo(data){......}}
                    
                    mounted(){
                    this.$bus.$on('xxxx',this.demo)
                    
                    
              2.提供資料:this.$bus.$emit(xxxx,資料)
              
        4.最好在beforeDestroy鉤子中,用$off去解綁當前元件所用到的事件

訊息訂閱與釋出(pubsub)

npm i pubsub-js
##訊息訂閱與釋出(pubsub)
        1.一種元件間通訊的方式,適用於任意元件間通訊。
        
        2.使用步驟:
            1.安裝pubsub:npm i pubsub-js
            2.引入: import pubsub from 'pubsub-js'
            3.接收資料:A元件想接收資料,則在A元件中訂閱訊息,訂閱的回撥留在A元件自身。
                    methods(){
                    demo(data){......}}
                    
                    ....
                    mounted(){
                    this.pid=pubsub.subscribe(xxxthisdemo)//訂閱訊息   I  

            4.提供資料:pubsub.publish('xxx,資料)
            5.最好在beforeDestroy鉤子中,用PubSub.unsubscribe(pid)去取消訂閱

現在我學習過的,元件間的通訊

父傳>子 1. props ,

子>傳父 :1.自定義元件,2.props ,前提是父元件給子元件一個回撥函式

兄弟元件互傳 1.全域性事件匯流排 2.用第三方庫的,訊息釋出與訂閱

過渡動畫(外掛:Animate.css在vue中的使用)

vue中Animate.css的安裝和使用

安裝:

npm install animate.css --save
//或者
yarn add animate.css

引入

在main.js全域性引入

import animate from 'animate.css' // npm install animate.css --save安裝,在引入
 
Vue.use(animate)

選擇你要的樣式

開啟官網Animate.css

具體使用

1>基本的使用就是在過度元素上使用對應的name屬性

<transition-group name="fadeLeft" tag="ul">
    <li v-for="item in items" v-bind:key="item">
        {{ item }}
    </li>
</transition-group>

2>使用不同的載入載出動畫

第一種:使用custom-classes-transition,需要在不同的載入,載出動畫上加-enter和-leave字尾

<transition
  name="custom-classes-transition"
  enter-active-class="bounceLeft-enter"
  leave-active-class="bounceRight-leave"
>
  <p v-if="show">hello</p>
</transition>

第二種:使用in/out類名在動畫名後面加上In或者Out

<transition
  name="bounce"
  enter-active-class="bounceInLeft"
  leave-active-class="bounceOutRight"
>
  <p v-if="show">hello</p>
</transition>

案例:

<template>

    <transition
            appear
    name="animate__animated animate__bounce"
    enter-active-class="animate__backInLeft"
    leave-active-class="animate__backOutDown"
    >
    <div >
        <button @click="isShow = !isShow">顯示/隱藏</button>
        <h1 v-show="isShow" >你好啊!</h1>
    </div>
    </transition>
</template>

過渡動畫總結

寫法:
	1.準備好樣式:
		·元素進入的樣式:
            1v-enter:進入的起點
            2.v-enter-active:進入過程中
            3.v-enter-to:進入的終點
        .元素離開的樣式:
            1v-leave:離開的起點
            2v-leave-active離開過程中
            3.v-leave-to:離開的終點
	2.使用<transition>包裹要過度的元素,並配置name屬性:
        <transition name="hello">
        <h1v-show="isShow">你好啊!</h1>
        </transition>

	3.備註:若有多個元素需要過度,則需要使用:<transition-group>,且每個元素都要指定key值。

vue腳手架配置代理

方法一:
	在vueconfigjs中新增如下配置:
            devServer:{
            proxy:"http://localhost:5000

說明:
1.優點:配置簡單,請求資源時直接發給前端(8080)即可。
2.缺點:不能配置多個代理,不能靈活的控制請求是否走代理。
3.工作方式:若按照上述配置代理,當請求了前端不存在的資源時,那麼該請求會轉發給伺服器(優先匹配前端資源)
方法二
編寫vueconfigjs配置具體代理規則:
        module.exports={
        	devServer:{ 
        	proxy:{
                '/api1':{//匹配所有以/api1"開頭的請求路徑
                target:'http://localhost:5000',// 代理目標的基礎路徑 changeOrigin: true,
                pathRewrite:{'^/api1':''}},
                '/api2':{//匹配所有以/api2開頭的請求路徑
                target:'http://localhost:5001',//代理目標的基礎路徑 changeOrigin: true,
                pathRewrite:{'^/api2':''}
        }
        }}/*
        
changeOrigin設定為true日,伺服器收到的請求頭中的host為:localhost:5000 
changeOrigin設定為false時,伺服器收到的請求頭中的host為:localhost:8080
changeOrigin預設值為true*/
說明:
1.優點:可以配置多個代理,且可以靈活的控制請求是否走代理。
2.缺點:配置略微繁瑣,請求資源時必須加字首。

slot 插槽

\1. 預設插槽

\2. 命名插槽

\3. 作用域插槽

vuex 是什麼

  1. 概念:專門在 Vue 中實現集中式狀態(資料)管理的一個 Vue 外掛,對 vue 應

用中多個元件的共享狀態進行集中式的管理(讀/寫),也是一種元件間通訊的方

式,且適用於任意元件間通訊。

安裝Vuex

npm i vuex  //vuex4

npm i vuex@3  //vuex3

=====================================
vuex2中、要用vuex3版本

Vuex3中、要用vuex4版本

2022年2月後,預設自動安裝vuex4版本

配置:

//該檔案用於建立Vuex中最為核心的store

//引入vue
import Vue from 'vue'

//引入Vuex
import vuex from 'vuex'
Vue.use(vuex);


//準備action-用於響應元件中的動作
const action={}

//準備mutations-用於操作資料(state)
const mutations={}

//準備state-用於儲存資料
const state={}


//建立並暴露store
export default  new vuex.Store({
    action,
    mutations,
    state
})

引入:

............

//引入store
import store from './store'

.............


//建立vue的例項物件----(vm)
new Vue({
    el:'#app',
    render:h=>h(App),
    store

})

使用:

//該檔案用於建立Vuex中最為核心的store

//引入vue
import Vue from 'vue'

//引入Vuex
import vuex from 'vuex'
Vue.use(vuex);


//準備action-用於響應元件中的動作
const actions= {
    //響應元件中加的動作
    jia(context,value){
        console.log('action被呼叫了')
        context.commit('JIA',value)
    },

}
//準備mutations-用於操作資料(state)
const mutations={
    //執行加
    JIA(state,value){
        console.log('mutations中的JIA被呼叫了')
         state.sum += value
    },
 
}


//準備state-用於儲存資料
const state={
    sum:0, //當前和
}


//建立並暴露store
export default  new vuex.Store({
    actions,
    mutations,
    state
})

元件中讀取vuex中的資料:$store.state.sum

元件中修改vuex中的資料:$store.dispatch('action中的方法名',資料)或 $store.commit('mutations中的方法名,資料')

路由

vue-router 的理解

在2022年2月,預設版本都是,vue-router4,只能在vue3中使用

npm i  vue-router  //預設

npm i  vue-router@3  //降級

vue 的一個外掛庫,專門用來實現 SPA 應用

對 SPA 應用的理解

  1. 單頁 Web 應用(single page web application,SPA)。

  2. 整個應用只有一個完整的頁面

  3. 點選頁面中的導航連結不會重新整理頁面,只會做頁面的區域性更新。

  4. 資料需要通過 ajax 請求獲取。

路由的理解

1. 什麼是路由?

​ 1. 一個路由就是一組對映關係(key - value)

​ 2. key 為路徑, value 可能是 function 或 component

2. 路由分類

  1. 後端路由:

​ 1) 理解:value 是 function, 用於處理客戶端提交的請求。

​ 2) 工作過程:伺服器接收到一個請求時, 根據請求路徑找到匹配的函式

​ 來處理請求, 返回響應資料。

  1. 前端路由:

​ 1) 理解:value 是 component,用於展示頁面內容。

​ 2) 工作過程:當瀏覽器的路徑改變時, 對應的元件就會顯示。

總結: 編寫使用路由的 2 步

  1. 定義路由元件 ,暴露並註冊路由
//該檔案,專門用於建立整個應用的路由器
import VueRouter from "vue-router";


//引入元件
import MyAbout from "@/components/MyAbout"
import MyHome from "@/components/MyHome";


//建立並暴露一個路由器
export default new VueRouter({
      routes:[
          {
              path:'/about',
              component:MyAbout
          },
          {
              path:'/home',
              component:MyHome
          },
      ]
})

  1. 使用路由
 <!--原始html中我們使用的是a標籤實現頁面的跳轉-->
   <!--
     <a class="list-group-item active" href="./about.html">About</a>
     <a class="list-group-item" href="./home.html">Home</a>
    -->                
=======================================================================
<!--Vue藉助router-link標籤實現頁面的跳轉-->
<router-link class="list-group-item" active-class="active" to="/about">About</router-link>
<router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
                </div>

....
 <!--指定元件的呈現位置-->
      <router-view></router-view>
....

active-class:實現切換(可以配置高亮樣式)

router-view:指定展示位置

總結:注意事項

  1. 一般元件通常放在components檔案中,路由元件放在pages檔案中
  2. 通過切換,隱藏的路由元件和一般元件不一樣,使用完後,就被vue銷燬,如果再使用,就重新掛載
  3. 每個元件都有自己的$route屬性,裡面儲存著自己的路由資訊
  4. 整個應用只有一個router(路由器),可以通過元件的$router獲取到。

多級路由(巢狀路由)

1.路由配置規則,使用chlidren配置項

routes:[
    {
        path:'/about',
        component:MyAbout
    },
    {
        path:'/home',
        component:MyHome,
        children:[  //通過chliaren配置子路由
            {
            path:'homeMessage',  //此處一定不要帶 '/'
            component:HomeMessage,
        },
            {
                path:'homeNews',  //此處一定不要帶 '/'
                component:HomeNews,
            }
        ],

    },
]

2.跳轉路徑(要寫完整路徑):

<router-link to="/home/homeMessage">Message</router-link>

路由的query引數

1.傳遞引數

 <!--路由跳轉,攜帶query引數,to的字串寫法-->
 <router-link :to="`/home/homeMessage/homeMessageDetail?id=${m.id}&tit=${m.tit}`">{{m.tit}}</router-link>&nbsp;&nbsp;

<!--路由跳轉,攜帶query引數,to的物件寫法-->
<router-link
         :to="{
              path:'/home/homeMessage/homeMessageDetail',
              query:{id:m.id,tit:m.tit
              }
          }">{{m.tit}}</router-link>

2.接收引數

$route.query.id
$route.query.tit

name屬性簡化路由

我們可以通過在routes中,寫name屬性,去簡化路由

routes:[
    {
        name:'xxxx',  //命名
        path:'/about',
        component:MyAbout
    },
    {
        name:'xxxx',
        path:'/home',
        component:MyHome,
        children:[  //通過chliaren配置子路由
            {
            name:'xxxx',
            path:'homeMessage',  //此處一定不要帶 '/'
            component:HomeMessage,
        },
            {
                name:'xxxx',
                path:'homeNews',  //此處一定不要帶 '/'
                component:HomeNews,
            }
        ],

    },
]

2.簡化跳轉

 <!--原本的寫法-->
 <router-link :to="`/home/homeMessage/homeMessageDetail?id=${m.id}&tit=${m.tit}`">{{m.tit}}</router-link>&nbsp;&nbsp;

<!--路由跳轉,攜帶query引數,to的物件寫法-->
<router-link
         :to="{
             name:'xxxx', <!--這裡寫命名-->
              query:{id:m.id,tit:m.tit
              }
          }">{{m.tit}}</router-link>

路由的params引數

1.params

routes:[
          {
              path:'/about',
              component:MyAbout
          },
          {
              path:'/home',
              component:MyHome,
              children:[
                  {
                  path:'homeMessage',
                  component:HomeMessage,
                      children:[
                          {
                              name:'tang',
                              path:'homeMessageDetail/:id/:tit', //佔位符宣告接收params引數
                              component:HomeMessageDetail,
                          },
                      ]
              },

2.傳遞引數

 <!--路由跳轉,攜帶query引數,to的物件寫法-->
                <router-link
                        :to="{
                       name:'tang',
                       params:{id:m.id,tit:m.tit}
                       }">{{m.tit}}</router-link>

特別注意:路由器攜帶params引數時,若使用to的物件寫法,則不能使用path配置項,必須使用name配置!

3.接收引數

$route.params.id
$route.params.tit

程式設計式路由導航

1.作用:不依賴於實現路由跳轉,讓路由跳轉更靈活

2.具體編碼

//$router的2個API
               this.$router.push({
                    name:'tang',
                    params:{id:m.id,tit:m.tit}
                })
            },
       
               this.$router.replace({
                    name:'tang',
                    params:{id:m.id,tit:m.tit}
                })
            }

Vue UI:元件庫

7.1移動端常用UI元件庫

  1. Vant https://youzan.github.io/vant
  2. Cube Ul https://didi.github.io/cube-ui<
  3. Mint Ul http://mint-ui.github.io/#!/zh-cn

7.2PC端常用Ul元件庫

  1. Element Ul https://element.eleme.cn
  2. IView Ul https://www.iviewui.com

來源:3309064415