Vue全局API(下)

組件

什么是組件?我所理解的組件,是和視圖相關(guān)的,比如一個(gè)頁面,可以分成多個(gè)模塊,那么每一個(gè)模塊就可以看成是一個(gè)組件,當(dāng)然了,每個(gè)組件中有各自的功能。

組件分為全局組件和局部組件。

全局組件:

全局組件是在構(gòu)造器外部定義的

<div id="app">
    <nav-bar></nav-bar>
</div>
//定義全局組件
Vue.component('nav-bar', {
    template: "<div>我是子組件</div>"
})

new Vue({
    el: "#app",
    data: {
        title: "全局組件"
    }
})

局部組件

局部注冊(cè)的組件,只能在局部作用域中注冊(cè)使用,其他作用域沒用。

<div id="app">
    <h2>{{ title }}</h2>
    <nav-bar></nav-bar>
</div>
new Vue({
    el: "#app",
    data: {
        title: "局部組件"
    },//注冊(cè)局部組件components是加‘s’的
    components: {
        'nav-bar':{
            template: "<div>這是局部組件</div>"
        } 
    }
})

父子組件之間的傳值

父傳子通過props屬性

組件的作用域是獨(dú)立的,我們不能夠在子組建中直接使用父組件中的值。要使用父組件的值,需要通過props屬性傳遞數(shù)據(jù)。

在父組件中自定義一個(gè)屬性,并將要傳遞的值賦值給該屬性(相當(dāng)于一個(gè)載體),在子組件中通過props接受,數(shù)組中就是相應(yīng)的‘載體’

<div id="app">
    <h1>{{ title }}</h1>
    <nav-bar address="China"></nav-bar>
</div>
//定義組件
var navBar = {
    template: "<div>我來自{{ address }}</div>",
    //接受父組件傳遞過來的值
    props: ['address']
}

new Vue({
    el: "#app",
    data: {
        title: '父組件向子組件傳值'
    },
    components: {
        navBar
    }
})

屬性中帶‘—’的情況

比如:

<div id="app">
    <nav-bar my-name="cuiliang"></nav-bar>
</div>

在子組件中通過props接受的時(shí)候,需要轉(zhuǎn)換成駝峰式命名。

var navBar = {
    template: "<div>我叫{{ myName }}</div>",
    props: ['myName']
}

new Vue({
    el: "#app",
    components: {
        navBar
    }
})

有坑,盡量少用或不用!

動(dòng)態(tài)的props

在子組件中接收父組件動(dòng)態(tài)的數(shù)據(jù),需要用v-bind綁定,當(dāng)父組件的值變化時(shí),子組件相應(yīng)的跟著變化。

在父組件中綁定message屬性

<div id="app">
    <input v-model = 'message'>
    <nav-bar v-bind:message = 'message'></nav-bar>
</div>
var navBar = {
    template: "<div>你好啊怎么說:{{message}}</div>",
    props:['message']
}

new Vue({
    el: "#app",
    data: {
        message: '雷猴啊'
    },
    components: {
        navBar
    }
})

字面量

<!-- 傳遞了一個(gè)字符串 "1" -->
<nav-bar count="1"></nav-bar>

因?yàn)樗且粋€(gè)字面 prop ,值是字符串 "1" 而不是number。如果想傳遞一個(gè)實(shí)際的number,需要使用 v-bind ,從而讓它的值被當(dāng)作 JavaScript 表達(dá)式計(jì)算:

<!-- 傳遞了一個(gè)字符串 "1" -->
<nav-bar :count="1"></nav-bar>

子傳父

父組件通過props傳值,那子組件怎么傳給父,使用自定義事件。

父組件中通過v-on接收

<div id="app">
    <h2>{{ title }}</h2>
    <div>{{ count }}</div>
    <hr>
    <!--count自定義事件接收-->
    <nav-bar v-on:getnum='result'></nav-bar>
</div>

子組件中通過$emit發(fā)射事件

//定義子組件
var navBar = {
        template: "<div>我是子組件<div>{{ num }}</div><button @click = 'add'>add</button></div>",
        //這里是data函數(shù)
        data(){
            return{
                num: 0
            }  
        },
        methods: {
            add(){
                this.num ++
                this.$emit('getnum', this.num)//參數(shù)2是傳遞的值
            }
        }
    }

    new Vue({
        el: "#app", 
        data: {
            title: "子組件向父組件傳值",
            count: 0
        },
        components: {
            navBar
        },
        methods: {
            //參數(shù)是傳遞過來的值
            result(val){
                this.count = val
            }
        }
    })

component標(biāo)簽

<component></component>是vue框架自定義的標(biāo)簽,作用就是讓我們可以根據(jù)不同的狀態(tài)選擇不同的組件。

1、在模板中的component標(biāo)簽中綁定一個(gè)‘is’屬性,通過點(diǎn)擊按鈕改變select屬性的值,進(jìn)而選擇不同的組件。

<div id ="#app">
    <component :is = 'select'></component>
    <button @click = 'changeComponent'>點(diǎn)擊改變組件</button> 
</div>

2、定義三個(gè)組件

var componentA = {
    template: "<div>這是組件A</div>"
}
var componentB = {
    template: "<div>這是組件B</div>"
}
var componentC = {
    template: "<div>這是組件C</div>"
}

new Vue({
    el: "#app",
    data: {
        select: componentA
    },
    methods: {
        changeComponent(){
            let select = this.select;
            if(select==componentA){
                select = componentB
            } else if (select == componentB){
                select = componentC
            } else {
                select = componentA
            }
        }
    },//注冊(cè)組件
    components: {
        componentA, 
        componentB,
        componentC
    }
})

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,176評(píng)論 0 29
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,371評(píng)論 0 6
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,297評(píng)論 4 129
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 此文基于官方文檔,里面部分例子有改動(dòng),加上了一些自己的理解 什么是組件? 組件(Component)是 Vue.j...
    陸志均閱讀 3,945評(píng)論 5 14

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