vue自定義組件&插槽&第三方組件庫

一、自定義組件

每一個(gè)組件就是一個(gè)小型的vue實(shí)例已烤。除了不能設(shè)置el選項(xiàng)鸠窗。其他選項(xiàng)都有。
使用template:``選項(xiàng)定義組件的模板胯究。模板中必須包含一個(gè)根標(biāo)簽稍计。相當(dāng)于el
自定義組件一共有兩種方法:

1、局部定義組件裕循。

(1)臣嚣、命名。屬性名如果用特殊符號(hào)剥哑。需要用''包裹起來硅则。

(2)、定義組件的屬性株婴。props:['自定義名稱','自定義名字'].

寫在vue實(shí)例里面怎虫,data后面.

語法:

        components:{
            '自定義名字': {
                template: `
                // 組件的模板
                `,
                // 必須定義組件的屬性才能在頁面中使用。
                props:['',''],
                data() {
                    return {             
                    }
                },
            }
        }

此處的data不可以是對(duì)象困介,只能是方法

使用

(1).直接在容器內(nèi)輸入自定義名字大审。
(2)、用:data里面定義的屬性名綁定方可使用座哩。

舉例:

 new Vue({
            // 指定vue實(shí)例掛載的容器
            el: '#app',
            // 定義數(shù)據(jù)
            data: {
                list: [
                    {
                        title: '奔馳',
                        content: '心所向, 馳以恒徒扶。梅賽德斯 - 奔馳, 創(chuàng)新激情永不滅谋作。作為汽車發(fā)明者, 我們從未停下腳步, 探索, 創(chuàng)造, 顛覆, 革新, 為心中所向, 馳之以恒!'
                    },
                    {
                        title: '寶馬',
                        content: '寶馬作為高端汽車品牌锅铅,不僅在國內(nèi)的新車市場(chǎng)占有較高的市場(chǎng)占有率和知名度,而且在二手車領(lǐng)域也均推出了品牌二手車服務(wù)——寶馬“尊選”,寶馬尊選二手車是寶馬集團(tuán)于2003年在全球豪華品牌中首推的全球統(tǒng)一的二手車認(rèn)證項(xiàng)目囚巴。2005年12月擎勘,寶馬在中國啟動(dòng)了寶馬尊選二手車認(rèn)證項(xiàng)目痘昌。'
                    },
                    {
                        title: '奧迪',
                        content: '奧迪公司是1899年August Horch創(chuàng)立A Horch汽車公司弧呐,后來與合伙人意見不合另外又創(chuàng)立August Horch汽車公司,但因公司名稱雷同被控告士败,所以改用Horch(德文聽覺的意思)的拉丁文Audi為公司名稱闯两。'
                    },
                ]
            },
            // 定義局部組件.
            components: {
                'b-box': {
                    template: `<div class="box">
                                <h2 class="title">{{title}}</h2>
                                <div class="content">
                                    {{content}}
                                </div>
                            </div>`,
                    // 定義組件的數(shù)據(jù)
                    // data() {
                    //     return {
                    //         title: '奔馳',
                    //         content: '心所向, 馳以恒。梅賽德斯 - 奔馳, 創(chuàng)新激情永不滅谅将。作為汽車發(fā)明者, 我們從未停下腳步, 探索, 創(chuàng)造, 顛覆, 革新, 為心中所向, 馳之以恒!'
                    //     }
                    // },
                    // 定義組件的屬性
                    props: ['title', 'content']
                }
            }
        })

使用:

    <div id="app">
        <b-box :title="item.title" :content="item.content" v-for="(item, index) in list" :key="index"></b-box>
    </div>

2漾狼、 props選項(xiàng)。用于定義組件的屬性饥臂。有兩種方式:1逊躁、定義數(shù)組。2隅熙、定義對(duì)象稽煤。props是只讀不改。
要是想修改props里面定義的屬性.需要在data函數(shù)里面重新接收props里面?zhèn)鞯臄?shù)囚戚。然后在頁面中調(diào)用新的屬性名

 Vue.config.productionTip = false
        new Vue({

            el: '#app',
            data: {
                list: [
                    {
                        label: '衣服',
                        count: 5
                    },
                    {
                        label: '褲子',
                        count: 5
                    },
                    {
                        label: '鞋子',
                        count: 5
                    },
                    {
                        label: '襪子',
                        count: 5
                    },
                ],
            },

            methods: {
                synccount(index, e) {
                    console.log(index, e);
                    // 更新數(shù)據(jù)
                    this.list[index].count = e
                }
            },
            // 定義組件
            components: {
                'b-input': {
                    template: `
                    <div class="counter">
                     <div class="label">{{label}}</div>
                        <div class="btns">
                            <button @click="myCount--" :disabled="myCount===minCount">-</button>
                           <input class="text" type="text" readonly :value="myCount">
                         <button @click="myCount++" :disabled="myCount===maxCount">+</button>
                        </div>
                     </div>
                    `,
                    // props: ['label', 'count']
                    props: {
                        // 文本
                        label: {
                            type: String,
                            // 允許為空
                            required: false
                        },
                        // 數(shù)量
                        count: {
                            type: Number,
                            // 非空
                            required: true
                        },
                        // 最大值
                        maxCount: {
                            type: Number,
                            default: 999
                        },
                        // 最小值
                        minCount: {
                            type: Number,
                            default: 1
                        }
                    },
                    // 定義數(shù)據(jù)
                    data() {
                        return {
                            // 將props接收到的count給myCount
                            myCount: this.count,
                        }
                    },
                    watch: {
                        myCount(val) {
                            // 觸發(fā)一個(gè)自定義事件酵熙。事件名稱是syncCount。將count的最新值作為事件對(duì)象傳出去驰坊。
                            // 自定義事件名稱不能有大寫匾二。
                            this.$emit('synccount', val)
                        }
                    }
                }
            }
        })

使用:

    <div id="app">
        <ul>
            <li v-for="(item, index) in list" :key="index">{{item.label}}--{{item.count}}</li>
        </ul>
        <b-input v-for="(item, index) in list" :key="index" :label='item.label' :count='item.count'
            @synccount="synccount(index,$event)">
        </b-input>

    </div>

2、注冊(cè)全局組件

語法:Vue.compent('自定義名稱',函數(shù){
函數(shù)里面的寫法和定義局部組件的方式一樣
模板
template: ``
})
同樣需要中轉(zhuǎn)props傳進(jìn)來的value值拳芙。
例子:

 Vue.component('b-star', {
            // 模板
            template: `
            <div class="star">
            <div class="label">{{title}}</div>
            <div>
                <i v-for="item in 10" :key="item" class="iconfont" :class="item<=myValue?'icon-xingxing':'icon-star'" @mouseenter="enter(item)" @mouseleave="leave(item)"  @click="okValue=item"></i>
            </div>
        </div>
            `,
            // props選項(xiàng)察藐。用于定義組件的屬性
            props: {
                title: {
                    type: String,
                    required: false
                },
                value: {
                    type: Number,
                    default: 0
                }
            },
            // 數(shù)據(jù)
            data() {
                return {
                    // 中轉(zhuǎn)props傳進(jìn)來的value值
                    myValue: this.value,
                    // 定義一個(gè)確定值
                    okValue: true
                }
            },
            // 方法
            methods: {
                enter(val) {
                    this.myValue = val
                },
                leave(val) {
                    this.myValue = this.okValue
                }
            },
            // 監(jiān)聽器
            watch: {
                okValue(val) {
                    this.$emit('syncvalue', val)
                }
            }
        })
        Vue.config.productionTip = false
        new Vue({
            el: '#app',
            data: {
                list: [
                    {
                        title: '產(chǎn)品質(zhì)量',
                        value: 5
                    },
                    {
                        title: '物流速度',
                        value: 7
                    },
                    {
                        title: '客服態(tài)度',
                        value: 2
                    },
                ]
            },
            methods: {
                syncvalue(index, e) {
                    this.list[index].value = e
                }
            },

        })

引用:

<div id="app">
        <ul class="list">
            <li v-for="(item, index) in list" :key="index">{{item.title}}--{{item.value}}</li>
        </ul>
        <b-star v-for="(item, index) in list" :key="index" :title="item.title" :value="item.value" @syncvalue="syncvalue(index,$event)"></b-star>
    </div>

二、插槽

插槽:<slot></slot>
如果不使用插槽的話舟扎,自定義組件內(nèi)是不可以寫內(nèi)容的分飞。
把插槽放在自定義組件內(nèi),就可以隨意添加內(nèi)容了
例子:

 Vue.component('b-tab', {
            // slot代表插槽
            template: `
            <div class="tab">
                <slot></slot>
            <ul class="titles">
                <li @click="activeIndex=index" :class="{active:activeIndex===index}" v-for="(item, index) in list"
                    :key="index">{{item.title}}</li>

            </ul>
            <ul class="contents">
                <li v-show="activeIndex===index" v-for="(item, index) in list" :key="index">{{item.content}}</li>

            </ul>
        </div>`,
            props: ['list', 'active'],
            data() {
                return {
                    activeIndex: this.active
                }
            },
        })
        new Vue({
            el: "#app",
            data: {
                // 高亮索引
                activeIndex: 0,
                list: [
                    {
                        title: '北京',
                        content: '北京的糖葫蘆真好吃'
                    },
                    {
                        title: '南京',
                        content: '南京的鹽水鴨真好吃'
                    },
                    {
                        title: '武漢',
                        content: '武漢的熱干面真好吃'
                    },
                    {
                        title: '長沙',
                        content: '長沙的臭豆腐真好吃'
                    },
                ]
            }
        })

引用:

   <div id="app">
        <b-tab :list="list" :active="activeIndex">
            <h2>拽而有禮睹限,拽而不狂</h2>
            <img src="https://img1.baidu.com/it/u=4250017269,4275607819&fm=26&fmt=auto" alt="" width="100px">
        </b-tab>
    </div>

三譬猫、第三方組件庫

組件庫的選擇看具體的情況而定。
常用的組件庫有:

1邦泄、Element組件庫.

2删窒、iview組件庫。

3顺囊、組件庫:https://www.antdv.com/docs/vue/introduce-cn/ 。此組件庫需要特定的環(huán)境使用蕉拢。

4特碳、Vant組件庫诚亚。開發(fā)小程序。

使用第三方組件庫的步驟午乓。

1站宗、需要在body之前,先引入組件庫的css樣式.

<link
rel="stylesheet"

/>

2益愈、在引入第三方組件庫進(jìn)來,把vue引入進(jìn)來梢灭。

<script src='https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js'></script>

3、最后引入需要使用的第三方組件庫蒸其。

<script src="https://cdn.jsdelivr.net/npm/vant@2.12/lib/vant.min.js"></script>

4敏释、在頁面中直接復(fù)制需要用的組件代碼以及vue代碼。

注意:使用iview組件庫的時(shí)候摸袁,在頁面中使用組件代碼時(shí)钥顽,需要在組件前面+i-然后把大寫變?yōu)樾?/p>

<i-button type="success">成功</i-button>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市靠汁,隨后出現(xiàn)的幾起案子蜂大,更是在濱河造成了極大的恐慌,老刑警劉巖蝶怔,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奶浦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡踢星,警方通過查閱死者的電腦和手機(jī)澳叉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩狱,“玉大人耳高,你說我怎么就攤上這事∷唬” “怎么了泌枪?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秕岛。 經(jīng)常有香客問我碌燕,道長,這世上最難降的妖魔是什么继薛? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任修壕,我火速辦了婚禮,結(jié)果婚禮上遏考,老公的妹妹穿的比我還像新娘慈鸠。我一直安慰自己,他們只是感情好灌具,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布青团。 她就那樣靜靜地躺著譬巫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪督笆。 梳的紋絲不亂的頭發(fā)上芦昔,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音娃肿,去河邊找鬼咕缎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛料扰,可吹牛的內(nèi)容都是我干的凭豪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼记罚,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼墅诡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桐智,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤末早,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后说庭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然磷,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年刊驴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姿搜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捆憎,死狀恐怖舅柜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躲惰,我是刑警寧澤致份,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站础拨,受9級(jí)特大地震影響氮块,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诡宗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一滔蝉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塔沃,春花似錦蝠引、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边坤。三九已至名扛,卻和暖如春谅年,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肮韧。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工融蹂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弄企。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓超燃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拘领。 傳聞我的和親對(duì)象是個(gè)殘疾皇子意乓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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