淺談Vue模板的那些事兒

圖片描述

接觸過vue的童鞋都知道,組件的模板通常都是在template選項內定義的,如:javascript

1 Vue.component('child-component', {
2 
3     template:  '<h3>我是閏土大叔</h3>'
4 
5 })

這個用法都是老生常談了,今天來聊聊Vue的內聯模板。看過vue文檔的同窗都知道,Vue提供了一個內聯模板的功能,在使用組件時,給組件標籤使用inline-template特性,組件就會把它的內容當作模板,而不是把它當成內容分發,這樣作的好處是,讓模板更靈活。html

介紹完內聯模板的概念後,接下來我要分享一個我在工做中碰到的bug,關於內聯模板,以及我debug的過程。vue

先來貼出案發現場的代碼片斷:java

<div id="app">
    <child-component inline-template>
        <div>
            <h2>在父組件中定義子組件的模板</h2>
            <p>{{message}}</p>
            <p>{{msg}}</p>
        </div>
    </child-component>
</div>
<script src="js/vue.js"></script>
<script>
    Vue.component('child-component',{
        data:function(){
            return {
                msg: '在子組件聲明的數據'
            }
        }
    });

    var app = new Vue({
        el:'#app',
        data:{
            message: '在父組件聲明的數據'
        }
    })
</script>

渲染後的理想結果本應該是:webpack

1 <div id="app">
 2 
 3     <div>
 4 
 5         <h2>在父組件中定義子組件的模板</h2>
 6 
 7         <p>在父組件聲明的數據</p>
 8 
 9         <p>在子組件聲明的數據</p>
10 
11     </div>
12 
13 </div>

可在Chrome裏顯示的DOM節點倒是這樣的:web

圖片描述

不只第一個P標籤內的插值沒有渲染出來,並且在控制檯裏還報了一個錯誤:gulp

圖片描述

說什麼Property or method "message" is not defined on the instance but referenced during render.(屬性或方法「message」不是在實例上定義的,而是在呈現過程當中引用的。)segmentfault

這個報錯讓我一臉懵逼,我但是照着書上的代碼敲的,來來回回看了N遍,如出一轍啊。並且書內說起 「 在父組件中聲明的數據message和子組件中聲明的數據msg,兩個均可以渲染。」app

相信不少剛接觸vue的新人童鞋都有這種體會,照着書上的代碼敲了一遍,結果運行出錯,與書上說的結果不一致。當你仔仔細細地檢查了半天仍是沒發現哪錯了的時候,你會不會心裏抓狂到懷疑人生?工具

別急,這個時候你必定要有本身的判斷,盡信書則不如無書。這句話出自於孟子,釋義是讀書時應該加以分析,不能盲目的去相信書中所言,必定要辯證的看待問題。萬一這本書在排版的時候小編大意寫錯了呢?也有可能吧。咱們對所謂的技術書籍,在尊敬做者的前提下,也要有批判精神。

其實,console控制檯裏的錯誤提示信息,就給你指明瞭debug的方向。通讀一遍代碼,咱們能夠分析一下,屬性message是定義在父組件中的data選項內的,而調用的時候是在子組件裏面調用,首先在沒有任何干涉的狀況下,父子組件是沒有互通有無的功能的。因此,這時候你應該會想到,父子組件間傳遞數據用props啊!有了思路後,那就趕忙把代碼敲起來吧:

圖片描述

運行一遍後,果真如你所願,第一個P標籤裏的插值順利地渲染出來了。

除了內聯模板,Vue還提供了另外一種效率比較高的定義模板的方式,就是x-template。若是你以前沒有使用過webpack、gulp等構件工具,試想下你的組件template的內容很冗長很複雜,若是都在javascript裏拼接字符串,效率是很低的,由於不能像寫html那麼舒服(除非你用ES6裏面的模板字符串)。

Vue提供了另外一種定義模板的方式,在<script>標籤裏使用text/template類型,而且指定一個id,將這個id賦給template,舉個栗子:

<div id="app">
    <my-component></my-component>
    <script type="text/x-template" id="my-component">
        <div>這是組件的內容</div>
    </script>
</div>
<script src="js/vue.js"></script>
<script>
    Vue.component('my-component',{
        template:'#my-component'
    });

    var app = new Vue({
        el:'#app'
    })
</script>

這樣,在<script>標籤裏,你能夠愉快地寫html代碼了,不用考慮換行等問題。

不少剛接觸Vue開發的新手會很是喜歡這個功能,由於用它,再加上組件知識,就能夠很輕鬆地完成交互相對複雜的頁面和應用了。若是再配合一些構件工具(gulp)組織好代碼結構,開發一些中小型產品是沒有問題的。

不過Vue的初衷並非濫用它,由於它將模板和組件的其餘定義隔離了。在以後的文章裏,我會介紹如何使用webpack來編譯.vue的文件,從而優雅地解決html書寫的問題。

今天的文章就分享到這裏。

做者:閏土大叔
連接:https://segmentfault.com/a/11...來源:segmentfault著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索