天天看點

vue+webpack+vue-router+vuex+ssr全解析筆記

添加小程式,兌換各種視訊教程/資料資源。

vue+webpack+vue-router+vuex+ssr全解析筆記
vue+webpack+vue-router+vuex+ssr全解析筆記

1、vue基礎知識:

    1.1 執行個體化vue:

方法1:

new Vue({

    el: '#app',        //html中被替換的的标簽,即挂載到html中#app标簽裡面

    components: { App },

    template: '<App/>'

})

方法2:

const root=new Vue({

    components: { App },

    template: '<App/>',

    data:{

          text:0,

          obj:{email:"123"}

    }

})

root.$mount("#app");    //html中被替換的的标簽,即挂載到html中#app标簽裡面

執行個體化vue屬性:

root.text=12;          //擷取執行個體化vue的data的資料,并改變其值,也可用root.$data.text=12一樣。

root.$data;          // 執行個體化vue的data資料組成的對象;

root.$props;            // 執行個體化vue的prop自定義屬性傳值的對象,前提是要先聲明自定義屬性傳值。

root.$el;                 // 執行個體化vue在html中#app标簽節點下所有的标簽及内容。

root.$options;       //執行個體化vue裡面傳入的所有屬性及值,以及其執行個體化預設的屬性及值。注意:通過

                                root.$options.$data.text給text指派,需要等到下一次資料更新時才能其作用。

root.$root===root;   //目前元件樹的根 Vue 執行個體。如果目前執行個體沒有父執行個體,此執行個體将會是其自己。

root.$children ;         //root元件下的直接子标簽/元件;  

root.$parent;         //父執行個體,如果有的話。

root.$slots;

root.$scopedSlots;

root.$refs;      //快速的查找到html節點或元件執行個體,<div ref="div"></div> ,<v-item ref="item"></v-item>

root.$isServer;     //在服務端渲染時,才用,不常用

執行個體vue方法、資料

root.$watch;   //監聽資料變化,const unWatch=root.$watch("text",(newText,oldText)=>{ 

                                console.log(`${newText}:${oldText}`)

                        })     然後調用unWatch()即可登出watch監聽事件,避免記憶體溢出,在元件裡面watch:{

                                text (newText,oldText){

                                     console.log(`${newText}:${oldText}`)

                                }

                        }    監聽完自動登出watch監聽

root.$emit("text",val);   //綁定一個自定義事件(函數)名為text的事件,常用于子元件向父元件傳遞方法

root.$on("text",(val)={      //監聽了這個事件并觸發了,root.$once("text"),表示隻監聽觸發一次,如定時器中僅執行一次。

    console.log("text事件被觸發了"+val+“是自定義事件傳遞過來的參數”)

})

root.$off("text");     // 如果沒有提供參數,則移除所有的事件監聽器;如果隻提供了事件,則移除該事件所有的監聽器;如果同時提供了事件與回調,則隻移除這個回調的監聽器。

root.$set(root.obj,"name","Tom");   //為obj對象新添加屬性name,并為其指派Tom,然後obj.name的值就可以直接渲染在

 視圖中。

root.$delete(root.obj,"email");    //删除obj對象的email屬性,并且同步通知到視圖中。

root.$nextTick(()=>{

            // 這是DOM渲染完,資料加載完之後執行的函數體,如重新添加了dom标簽,從背景擷取資料完成之後。

})

執行個體vue生命周期:在某個時間點,會自動執行的函數,執行順序如下

beforeCreate(){}    //new Vue()執行個體化的時候即建立前後,this.$el在建立生命周期前後(beforeCreate,created)是underfined

created(){}

beforeMount(){}   //el:"#app"或root.$mount("#app")即挂載前後的生命周期,如果沒有el:"#app"或root.$mount("#app")則不執行挂載前後的生命周期,this.$el在挂載生命周期前beforeMount是<div id="app"></div>,在挂載生命周期後mounted是替換掉<div id="app"></div>的部分。

mounted(){}    //是以常對dom有關的操作在mounted裡面,對資料有關的操作可以在created或者mounted裡面

beforeUpdate(){}    //資料更新時執行,如定時器裡data裡面的text+=1時執行資料更新前後的生命周期

updated(){}

activated(){}

deactivated(){}

beforeDestroy(){}      //銷毀執行個體化vue前後執行的生命周期

defstroyed(){}   

errorCaptured((h,err)=>{     //捕獲到該元件及其子元件下的所有錯誤,可以阻止子元件錯誤向父元件冒泡傳遞。

    return h("div",{},err.stack)

}){}     

vue+webpack+vue-router+vuex+ssr全解析筆記

vue的資料綁定:

<any v-bind:屬性名="表達式"></any>

<any :屬性名="表達式"></any>

<any v-bind:class="{類名:true/false條件表達式}" class="類名"></any>

<any :style="style"></any>

vue的資料計算屬性computed:對于任何複雜邏輯,都應當使用計算屬性。計算屬性隻有在它的相關資料變量發生改變時才會重新求值。這就意味着隻要 

message

 還沒有發生改變,則計算屬性會緩存message的值,多次通路算屬性會立即傳回之前的計算結果,而不必再次執行函數。

computed:{          //計算屬性寫法1:計算資料的改變,常用于資料需要計算後渲染到視圖中。

    message(){

        return "計算屬性message值改變時,才會執行該函數"

    }

},

computed:{          //計算屬性寫法2:計算資料的改變,常用于資料需要計算後渲染到視圖中。

    message:{

         get:function(){},      //擷取計算資料message時執行get()

         set:function(){}        //修改計算資料message時執行set()

    }

},

methods:{

    handle(){

        return "方法函數每次重新渲染時無論message值是否改變,都會執行該函數"

    }

}

vue的監聽屬性watch: 監聽資料改變前後的值,常用于向背景發生資料。

watch:{                  //方法1:該寫法,在初始化時,不會執行,隻有資料改變時,才會執行裡面的函數。

    val:function(newVal,oldVal){

         console.log(newVal,oldVal)

    }

}

watch:{                  //方法2:該寫法,在初始化及資料改變時,都會執行裡面的函數。

    val:{

          handler(newVal,oldVal){

                  console.log(newVal,oldVal)

            },

            immediate:true,

            deep:true   // 是否深入觀察,即如果val是對象,當不需要深入觀察時,handler隻是當val變化時才執行,當需要

                            深入觀察時,當val裡面的屬性隻,或者val對象裡面屬性對象裡面的屬性值...改變時都會觸發handler執行。

    }

}

注意:computed和watch裡盡量不要修改原資料值,避免出現無限循環,如data(){return {a:0 }},不要在computed和watch裡面做a+=1之類的,會出現無限循環,computed裡面是通過原資料計算結果并指派給新的變量,watch裡面監聽資料改變前後的值。

vue的指令:

  • v-text      :目前标簽下的文本内容,和{{}}功能一樣。
  • v-html     :目前标簽下的html内容。能識别字元串裡面的标簽。
  • v-show    :是否顯示目前标簽,即display:none/block;
  • v-if          : 是否挂載目前标簽,即動态增删标簽節點。
  • v-else      
  • v-else-if
  • v-for       :周遊循環對象、數組,渲染在視圖。
  • v-on       :給目前标簽綁定事件。
  • v-bind    :給目前标簽綁定屬性。:value="1",與value="1",後者1是字元串,前者1是數字。
  • v-model  :在input、select、textarea裡面雙向綁定資料,與value可以用于單選多選框中。
  • <input v-model="message" >
  • <textarea v-model="message" ></textarea>
  • <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
     <input type="checkbox" id="john" value="John" v-model="checkedNames">
     <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
               
    data: {
        checkedNames: []
      }
               
  • <input type="radio" id="one" value="One" v-model="picked">
      <input type="radio" id="two" value="Two" v-model="picked">
               
    data: {
        picked: ''
      }
               
  • <select v-model="selected">
        <option disabled value="">請選擇</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
      </select>
               
    data: {
        selected: ''   //selected:[]
      }
               
  • <!-- 當選中時,`picked` 為字元串 "a" -->
    <input type="radio" v-model="picked" value="a">
    
    <!-- `toggle` 為 true 或 false -->
    <input type="checkbox" v-model="toggle">
    
    <!-- 當選中第一個選項時,`selected` 為字元串 "abc" -->
    <select v-model="selected">
      <option value="abc">ABC</option>
    </select>
               
  • 在預設情況下,v-model 在每次 input 事件觸發後将輸入框的值與資料進行同步 (除了上述輸入法組合文字時)。你可以添加 lazy修飾符,
               
    進而轉變為使用 change事件進行同步:
               
    <!-- 在“change”時而非“input”時更新 -->
    <input v-model.lazy="msg" >
               
    在 type="number"時,HTML 輸入元素的值也總會傳回字元串 如果想自動将使用者的輸入值轉為數值類
               
    <input v-model.number="age" type="number">
               
    如果要自動過濾使用者輸入的首尾空白字元
               
    <input v-model.trim="msg">    
               
  • v-once   :該标簽隻渲染一次,後面重新渲染會跳過該标簽。

vue的模闆文法:{{}},v-text,v-html,其中{{}}和v-text一樣,不會識别标簽。

vue+webpack+vue-router+vuex+ssr全解析筆記

注意:以v-開始的指令,其值如name為js表達式(如js變量);{{fun()}}仍然可以執行函數方法渲染函數的結果在頁面,但是不推薦,推薦放在計算屬性中。

vue的元件的定義:

1. 局部元件:

    const com={              

        template:` <div></div>`,

        data(){

            return {}

        }

    }

    Vue.component("CompOne",com)      //定義局部元件

   <comp-one></comp-one>                //調用局部元件

2. 全局元件:

      new Vue({

        components:{CompOne},                   //調用全局、局部元件

        template:`   <comp-one></comp-one>  `,     //模闆

        data(){

            return {}

        }

    })

vue的props屬性的父向子元件傳值:可以是數組或對象,用于接收來自父元件的資料。單向下行綁定:父級 prop 的更新會向下流動到子元件中,但是反過來則不行。props接受的父元件的資料可以和data裡面的一樣,用于直接渲染在視圖,用this.props裡面的資料名直接進行計算屬性,在vue的方法,生命周期中調用。但是不能直接修改props裡面的值,可以在data裡面定義一個變量初始化為props裡面傳遞過來的資料值,然後在直接修改data裡面這個變量的值。

    子修改父元件props傳遞過來的值:通過子元件觸發的事件告訴父元件,要修改props傳遞過來的值。

方法1:通過父元件傳遞過來一個方法事件onChange,子元件通過觸發該方法事件,告訴父元件,在父元件中修改propOne的值。

    const com={              //子元件

        props:{              //父元件傳遞過來的propOne資料

               propOne:String,

               name:{

                    type: Number,    //傳遞過來的資料類型

                    required:true,    //該資料必須傳遞過來,不然報錯

                    default:0              //預設值,可以是個對象default(){return},通常和required不同時出現

               },

               onChange:Function

        },

        template:` <div>

                        <span @click="sonHandle">{{propOne}}</span>

                         <input type="text" ></input>

                    </div>`,

        data(){

            return {}

        },

        methods:{

            sonHandle(){

                this.onChange();    //子元件點選事件觸發父元件傳遞過來的onChange事件,在父元件中執行該onChange事件的函數,即修改傳遞給子元件的資料

               //或者通過 this.$emit("change");  子元件自定義change事件,不需要在props接受 父元件傳遞的

                onChange:Function,父元件 <comp-one  @change="handleChange" :prop-one="prop1"></comp-one>

            }

        }

    }

    Vue.component("CompOne",com)    

     new Vue({                        //父元件

        template:`   <comp-one  @on-change="handleChange" :prop-one="prop1"></comp-one>  `,     //模闆

        data(){

            return {

                prop1:"這是要傳遞給子元件的資料"

            }

        },

        methods:{

            handleChange(){

                this.prop1="這是子元件觸發了父元件傳遞給子元件的onChange事件執行父元件的handleChange函數,在父元件 

                                       修改傳遞給子元件的propOne資料值"

            }

        }

    })

vue的元件的繼承:繼承的時候,需要propsData{}接受父元件傳遞的參數,新定義的data資料會覆寫原com元件資料,方法周期等會先執行com元件的,再執行compVue裡的。

   const com={           

        props:{            

               propOne:String,                     

        },

        template:` <div>

                        <span >{{propOne}}</span>

                         <input type="text" ></input>

                    </div>`,

        data(){

            return {

                text:0

            }

        },     

    }

繼承的方法1:

const compVue=Vue.extend(com);

new compVue({

    el:"#root",

    propsData:{

           propOne:'這是繼承com元件的新compVue元件'

    }

})

繼承的方法2:

const compVue2={

    extends:com,

    data(){return{}}

}

vue的props屬性的子向父元件傳值:

        在父元件調用子元件時<son @自定義事件="自定義事件處理函數"></son>

        在父元件中定義一個methods方法,處理自定義事件處理函數接受到的子元件的資料

        在子元件中定義一個方法觸發this.$emit("自定義事件名",要傳遞的資料)

2、vuex:

簡化版vuex的應用:

    步驟1:在項目檔案目錄指令行下npm i vuex -S;

    步驟2:建立store檔案夾->store.js檔案

    步驟3:在store.js裡面:

vue+webpack+vue-router+vuex+ssr全解析筆記

    步驟4:在vue的入口檔案,如main.js裡面:全局store

vue+webpack+vue-router+vuex+ssr全解析筆記

    步驟5:在.vue元件檔案中通過this.$store擷取全局store對象,即可使用store其屬性方法API;

vue+webpack+vue-router+vuex+ssr全解析筆記

子產品化vuex的應用:

    步驟1:在項目檔案目錄指令行下npm i vuex -S;

    步驟2:建立store檔案夾->store.js檔案