Vue App

  • 每個(gè)Vue會(huì)應(yīng)用通過(guò)new Vue()方法創(chuàng)建一個(gè)根Vue實(shí)例,創(chuàng)建Vue實(shí)例時(shí)可傳入一個(gè)選項(xiàng)對(duì)象。
  • Vue雖然并未完全遵循MVVM模型,但Vue設(shè)計(jì)也受它啟發(fā)。
  • Vue應(yīng)用通過(guò)new Vue()創(chuàng)建的根Vue實(shí)例,以及可選的嵌套的、可復(fù)用的組件樹組成。
  • 所有Vue組件都是Vue實(shí)例,并接受相同的選項(xiàng)對(duì)象。
import Vue from "vue";
const vm = new Vue(options={});

選項(xiàng)對(duì)象options

選項(xiàng)對(duì)象的屬性涉及到的參數(shù)可劃分為五類,分別是數(shù)據(jù)、DOM、生命周期鉤子、資源、組合、其它。

數(shù)據(jù)

數(shù)據(jù) 描述
data Vue實(shí)例的數(shù)據(jù)對(duì)象
props 用于接收來(lái)自父組件的數(shù)據(jù)
propsData 創(chuàng)建Vue實(shí)例時(shí)傳遞給props的參數(shù),方便測(cè)試。
computed 計(jì)算屬性,會(huì)被混入到Vue實(shí)例中。
methods 方法,將被混入到Vue實(shí)例中。
watch 對(duì)象,鍵是需要觀察的表達(dá)式,值是對(duì)應(yīng)的回調(diào)函數(shù)。

data

當(dāng)Vue實(shí)例被創(chuàng)建時(shí),它向Vue的響應(yīng)式系統(tǒng)中加入了data對(duì)象中能找到的所有屬性。當(dāng)屬性發(fā)生改變時(shí),視圖產(chǎn)生響應(yīng),即匹配更新為新值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
    </div>
    <script>
        //數(shù)據(jù)對(duì)象
        var user = {username:'alice'};
        //將數(shù)據(jù)對(duì)象添加到Vue實(shí)例中
        var vm = new Vue({
            data:user
        });
        console.log(vm.username === user.username);

        //設(shè)置屬性會(huì)影響到原始數(shù)據(jù),反之亦然。
        vm.username = 'ben';
        console.log(user.username);
    </script>
</body>
</html>

當(dāng)數(shù)據(jù)改變時(shí),視圖重渲染。只有當(dāng)實(shí)例被創(chuàng)建時(shí)data中存在的屬性才是響應(yīng)式的。即若添加新屬性則它的改動(dòng)不會(huì)觸發(fā)任何視圖的更新。

若你之后需某屬性,之前定義時(shí)設(shè)置初始值即可。

var vm = new Vue({
    data:{
        error:null,
        list:[],
        count:0,
    }
});

唯一的例外是使用Object.freeze(),會(huì)阻止修改現(xiàn)有屬性,也意味著響應(yīng)系統(tǒng)無(wú)法再追蹤變化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <button @click="data.message='world'">change</button>
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data(){
                return {data};
            }
        });
    </script>
</body>
</html>

除了數(shù)據(jù)屬性,Vue實(shí)例還暴露了一些有用的實(shí)例屬性和方法。它們都有前綴$,以便與用戶自定義的屬性區(qū)分。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <input type="text" v-model="data.message">
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data:data
        });
        //Vue實(shí)例實(shí)例屬性
        console.log(vm.$el===document.getElementById('app'));//output:true
        console.log(vm.$data===data);//output:true
        //Vue實(shí)例方法
        vm.$watch('message', function(newVal, oldVal){
            console.log('message change');//回調(diào)將在vm.message改變后調(diào)用
        });
    </script>
</body>
</html>

DOM

DOM 描述
el 已存在的頁(yè)面DOM元素的CSS選擇器或HTMLElement實(shí)例,作為Vue實(shí)力的掛載目標(biāo)。
render 字符串模板代替方案

el

如果在Vue實(shí)例化時(shí)存在el選項(xiàng),Vue實(shí)例將立即進(jìn)入編譯過(guò)程。否則需要顯示調(diào)用vm.$mount()方法手動(dòng)開啟編譯。

const vm = new Vue({
  el:"#app"
});
const vm = new Vue();
vm.$mount("#app");

Vue實(shí)例對(duì)象vm提供了$muont生命周期方法,如果vm對(duì)象在實(shí)例化時(shí)沒(méi)有收到el選項(xiàng),則會(huì)處于“未掛載”的狀態(tài),即沒(méi)有關(guān)聯(lián)的DOM元素。此時(shí)可使用vm.$mount(elementOrSelector)方法手動(dòng)掛載一個(gè)尚未掛載的實(shí)例。若沒(méi)有提供elementOrSelector參數(shù),模板將被渲染為文檔之外的元素。

例如:入口文件main.js

import Vue from 'vue';
import Axios  from "axios";

import App from './App.vue';
import router from "./router.js";

Vue.config.productionTip = false;
Vue.prototype.axios = Axios;

//創(chuàng)建vue應(yīng)用實(shí)例并掛在到#index元素上
const vm = new Vue({render:h=>h(App), router:router});//未掛載狀態(tài)
//手工掛載vm實(shí)例
vm.$mount('#index');

$mount方法會(huì)返回vm實(shí)力自身,因此可鏈?zhǔn)秸{(diào)用其他實(shí)例方法。

render

render作為字符串模板的替代方案,render渲染函數(shù)接收一個(gè)createElement方法作為第一個(gè)參數(shù)用來(lái)創(chuàng)建VNode節(jié)點(diǎn)。若組件是一個(gè)函數(shù)組件則render渲染函數(shù)還會(huì)接收一個(gè)額外的context上下文參數(shù),為沒(méi)有實(shí)例的函數(shù)組件提供上下文信息。

生命周期鉤子

每個(gè)Vue實(shí)例在被創(chuàng)建時(shí)都要經(jīng)過(guò)一系列初始化過(guò)程--例如,需設(shè)置數(shù)據(jù)監(jiān)聽、編譯、模板、將實(shí)例掛載到DOM并在數(shù)據(jù)變化時(shí)更新DOM等。同時(shí)在這個(gè)過(guò)程中也會(huì)運(yùn)行一些叫做生命周期鉤子的函數(shù),這給用戶在不同階段添加自己的代碼的機(jī)會(huì)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{data.message}}</p>
        <input type="text" v-model="data.message">
    </div>
    <script>
        var data = {message:'hello'};
        var vm = new Vue({
            el:'#app',
            data:data,
            created:function(){
                console.log('created', this.message);
            },
            mounted:function(){
                console.log('mounted', this.message);
            },
            updated:function(){
                console.log('updated', this.message);
            },
            destroyed:function(){
                console.log('destroyed', this.message);
            }
        });
    </script>
</body>
</html>

created鉤子可用來(lái)在實(shí)例被創(chuàng)建后執(zhí)行代碼,其他鉤子在實(shí)例生命周期不同階段被調(diào)用,如mounted、updateddestroyed。生命周期鉤子的this上下文指向調(diào)用它的Vue實(shí)例。

不要在選項(xiàng)屬性或回調(diào)上使用箭頭函數(shù),比如created:()=>console.log(this.message)。因?yàn)榧^函數(shù)是和父級(jí)上下文綁定在一起的,this不會(huì)是如你所期待的Vue實(shí)例,經(jīng)常導(dǎo)致Uncaught TypeError: Cannot read property of undefinedUncaught TypeError: this.method is not a function之類的錯(cuò)誤。

Vue實(shí)例生命周期
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近一直在忙,近期一個(gè)月更加會(huì)馬不停蹄,根本無(wú)時(shí)間經(jīng)營(yíng)自己的小博客,有很多簡(jiǎn)友留言和評(píng)論要資料,我也沒(méi)時(shí)間發(fā),等我...
    范小飯_閱讀 4,115評(píng)論 4 20
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,168評(píng)論 0 29
  • Vue 框架的入口就是 Vue 實(shí)例,其實(shí)就是框架中的 view model ,它包含頁(yè)面中的業(yè)務(wù) 處理邏輯、數(shù)據(jù)...
    云中一樵夫閱讀 1,161評(píng)論 0 1
  • 我再也不想離開你,哪怕面對(duì)千軍萬(wàn)馬。 超視距的戰(zhàn)斗屏幕上滿目瘡痍,經(jīng)過(guò)AL的渲染,仿佛還能感覺(jué)到一艘母艦被摧毀...
    云幼閱讀 320評(píng)論 0 0
  • 你知道嗎?在這個(gè)世界上,有一個(gè)人,在偷偷喜歡著你。不是因?yàn)槟阌卸嗝疵利悾膊皇且驗(yàn)槟阌卸嗝磧?yōu)秀。對(duì)你的喜歡,日久生...
    黃天浩閱讀 396評(píng)論 0 0

友情鏈接更多精彩內(nèi)容