vue.js原生組件化開發(fā)(一)——組件開發(fā)基礎(chǔ)

前言

vue作為一個(gè)輕量級(jí)前端框架盾似,其核心就是組件化開發(fā)。我們一般常用的是用腳手架vue-cli來進(jìn)行開發(fā)和管理,一個(gè)個(gè)組件即為一個(gè)個(gè)vue頁面零院,這種叫單文件組件溉跃。我們?cè)谝媒M件之時(shí)只需將組件頁面引入,再注冊(cè)即可使用告抄。那么不用腳手架撰茎,如何進(jìn)行組件開發(fā)呢,本文先介紹一下基礎(chǔ)知識(shí)吧打洼。

組件使用流程

1.組件構(gòu)建

1.1 extend構(gòu)建法

調(diào)用Vue.extend()方法龄糊,構(gòu)建一個(gè)名字為myCom的組件

var myCom = Vue.extend({
    template: '<div>這是我的組件</div>'
})

其中template定義模板的標(biāo)簽,模板的內(nèi)容需寫在該標(biāo)簽下

1.2 template標(biāo)簽構(gòu)建法

template標(biāo)簽構(gòu)建募疮,需在標(biāo)簽上加id屬性用以后期注冊(cè)

<template id="myCom">
    <div>這是template標(biāo)簽構(gòu)建的組件</div>
</template>

1.3 script標(biāo)簽構(gòu)建法

script標(biāo)簽同樣需加id屬性炫惩,同時(shí)還得加type="text/x-template",加這個(gè)是為了告訴瀏覽器不執(zhí)行編譯里面的代碼

<script type="text/x-template" id="myCom1">
    <div>這是script標(biāo)簽構(gòu)建的組件</div>
</script>

2.注冊(cè)組件

(1)全局注冊(cè):一次注冊(cè)阿浓,可在多個(gè)vue實(shí)例中使用他嚷,需調(diào)用Vue.component()方法,這個(gè)方法需傳2個(gè)參數(shù)搔扁,第一個(gè)參數(shù)為組件名稱爸舒,第二個(gè)參數(shù)為組件構(gòu)造時(shí)定義的變量蟋字。

我們先用全局注冊(cè)注冊(cè)上面例子中創(chuàng)建的myCom組件

Vue.component('my-com',myCom)

還有一種不需構(gòu)建直接注冊(cè)的寫法——注冊(cè)語法糖

Vue.component('my-com',{
    'template':'<div>這是我的組件</div>'
})

'my-com'為給組件自定義的名字稿蹲,在使用時(shí)會(huì)用到,后面myCom對(duì)應(yīng)的就是上面構(gòu)建的組件變量鹊奖。

注意命名規(guī)范苛聘,一般組件名字以短橫線分隔或一個(gè)小寫單詞。
例:footer-nav忠聚,footernav

如果是用template及script標(biāo)簽構(gòu)建的組件设哗,第二個(gè)參數(shù)就改為它們標(biāo)簽上的id值

Vue.component('my-com',{
    template: '#myCom'
})

(2)局部注冊(cè):只能在注冊(cè)該組件的實(shí)例中使用

var app = new Vue({
    el: '#app',
    components: {
        'my-com': myCom
    }
})

注冊(cè)語法糖

var app = new Vue({
    el: '#app',
    components: {
        'my-com': {
           template: '<div>這是我的組件</div>'
        }
    }
})

template及script構(gòu)建的組件

var app = new Vue({
    el: '#app',
    components: {
        'my-com': {
           template: '#myCom'
        }
    }
})

3.調(diào)用組件

我們只需在需要調(diào)用組件的地方寫上組件名字的標(biāo)簽即可

<div>
    /*調(diào)用組件*/
    <my-com></my-com>
</div>

4.例子

4.1 全局注冊(cè)

新建一個(gè)html文件,引入vue.js两蟀,并且定義2個(gè)vue實(shí)例app1和app2

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue組件</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app1">
        <my-com></my-com>
    </div>
    <div id="app2">
        <my-com></my-com>
    </div>

    <script>
        /*構(gòu)建組件*/
        var myCom = Vue.extend({
            template: '<div>這是我的組件</div>'
        });
        /*全局注冊(cè)組件*/
        Vue.component('my-com',myCom);

        /*定義vue實(shí)例app1*/
        var app1 = new Vue({
            el: '#app1'
        });

        /*定義vue實(shí)例app2*/
        var app2 = new Vue({
            el: '#app2'
        });
    </script>
</body>
</html>

打開瀏覽器查看效果


可以看到全局注冊(cè)的組件在實(shí)例app1和實(shí)例app2中都可以被調(diào)用

一次注冊(cè)网梢,多處使用

4.2 局部注冊(cè)

修改上面例子的html代碼,將全局注冊(cè)的組件改為局部注冊(cè)赂毯,注冊(cè)到實(shí)例app1下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue組件</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app1">
        <my-com></my-com>
    </div>
    <div id="app2">
        <my-com></my-com>
    </div>

    <script>
        var myCom = Vue.extend({
            template: '<div>這是我的組件</div>'
        });

        // Vue.component('my-com',myCom);
        /*局部注冊(cè)組件*/
        var app1 = new Vue({
            el: '#app1',
            components:{
                'my-com':myCom
            }
        });

        var app2 = new Vue({
            el: '#app2'
        });
    </script>
</body>
</html>

打開瀏覽器查看效果


可以看到只渲染了app1實(shí)例下的組件战虏,app2實(shí)例雖然調(diào)用了該組件,但是因?yàn)檫@個(gè)組件沒有在其內(nèi)部注冊(cè)党涕,也沒有全局注冊(cè)烦感,所以報(bào)錯(cuò)說找不到該組件。

一次注冊(cè)膛堤,一處使用

4.3 template及script標(biāo)簽構(gòu)建組件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue組件</title>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app1">
        <my-com></my-com>
        <my-com1></my-com1>
    </div>

    <template id="myCom">
        <div>這是template標(biāo)簽構(gòu)建的組件</div>
    </template>

    <script type="text/x-template" id="myCom1">
        <div>這是script標(biāo)簽構(gòu)建的組件</div>
    </script>

    <script>
        Vue.component('my-com1',{
            template: '#myCom1'
        });

        var app1 = new Vue({
            el: '#app1',
            components:{
                'my-com':{
                    template: '#myCom'
                }
            }
        });
    </script>
</body>
</html>

打開瀏覽器查看效果


異步組件

當(dāng)項(xiàng)目比較大型手趣,結(jié)構(gòu)比較復(fù)雜時(shí),我們一般選用vue-cli腳手架去構(gòu)建項(xiàng)目肥荔。因?yàn)関ue-cli集成了webpack環(huán)境绿渣,使用單文件組件朝群,開發(fā)更簡(jiǎn)單,易上手中符,尤其是在對(duì)組件的處理上潜圃。對(duì)于原生vue.js,我們就得將組件構(gòu)建在同一個(gè)html的script標(biāo)簽下或者h(yuǎn)tml的外部js中舟茶,所有組件集中在一塊谭期,不容易管理,這也是原生vue,js的一點(diǎn)不便之處吧凉。
當(dāng)然隧出,在不使用腳手架的情況下想將一個(gè)個(gè)組件分別獨(dú)立成一個(gè)個(gè)html文件,再去引用注冊(cè)它們阀捅,也是可以實(shí)現(xiàn)的胀瞪,但一般不推薦這樣做。
vue.js可以將異步組件定義為一個(gè)工廠函數(shù)饲鄙。
例子
新建一個(gè)head.html

<div>
    這是頭部
</div>

在index.html中異步引入head.html作為組件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue組件</title>
    <script src="js/vue.js"></script>
    <script src="js/jquery.min.js"></script>
</head>
<body>
    <div id="app1">
        <head-com></head-com>
    </div>
    <script>
        Vue.component('head-com', function (resolve, reject) {
            $.get("./head.html").then(function (res) {
                resolve({
                    template: res
                })
            });
        });

        var app1 = new Vue({
            el: '#app1'
        });

    </script>
</body>
</html>

當(dāng)然要注意一點(diǎn)凄诞,使用$.get獲取本地文件是會(huì)跨域的,所以我們要把項(xiàng)目部署到服務(wù)器環(huán)境中忍级。

我這里用的是xampp集成環(huán)境帆谍,將項(xiàng)目文件夾component放置在xampp/htdocs下,然后訪問localhost/component/index.html轴咱,
效果如下


可以看到在index.html中引入的head.html里的內(nèi)容已經(jīng)被添加進(jìn)去

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汛蝙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子朴肺,更是在濱河造成了極大的恐慌窖剑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戈稿,死亡現(xiàn)場(chǎng)離奇詭異西土,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鞍盗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門需了,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橡疼,你說我怎么就攤上這事援所。” “怎么了欣除?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵住拭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)滔岳,這世上最難降的妖魔是什么杠娱? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮谱煤,結(jié)果婚禮上摊求,老公的妹妹穿的比我還像新娘。我一直安慰自己刘离,他們只是感情好室叉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著硫惕,像睡著了一般茧痕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恼除,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天踪旷,我揣著相機(jī)與錄音,去河邊找鬼豁辉。 笑死令野,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徽级。 我是一名探鬼主播气破,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼灰追!你這毒婦竟也來了堵幽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤弹澎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后努咐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苦蒿,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年渗稍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佩迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竿屹,死狀恐怖报强,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拱燃,我是刑警寧澤秉溉,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響召嘶,放射性物質(zhì)發(fā)生泄漏父晶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一弄跌、第九天 我趴在偏房一處隱蔽的房頂上張望甲喝。 院中可真熱鬧,春花似錦铛只、人聲如沸埠胖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽押袍。三九已至,卻和暖如春凯肋,著一層夾襖步出監(jiān)牢的瞬間谊惭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工侮东, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圈盔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓悄雅,卻偏偏與公主長(zhǎng)得像驱敲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宽闲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容