父子組件的訪問方式

我們得弄清楚一個(gè)是父子組件的通訊型奥,另一個(gè)是父子組件的訪問,兩個(gè)概念不能混淆碉京。

有時(shí)候我們需要父組件直接訪問子組件定義的某個(gè)方法或?qū)傩韵嵝冢咏M件也有時(shí)候出現(xiàn)要直接訪問父組件,或者是子組件訪問根組件的情況谐宙。

父組件訪問子組件:

1.使用$children
2.使用$refs (中文翻譯是引用的意思烫葬,是references的縮寫)

子組件訪問父組件

使用$parent
使用$root

關(guān)于父組件使用$children去訪問子組件

this.$children是一個(gè)數(shù)組類型,它包含所有子組件對(duì)象凡蜻,
這句話是說搭综,父組件下面有n個(gè)子組件,
父組件下面放了很多個(gè)子組件划栓。
(我們一般通過遍歷取出所有子組件的狀態(tài))

父組件通過this.$children訪問單個(gè)子組件里面的showMessage方法.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- Vue根實(shí)例模板(父組件) -->
    <div id="app">
        <!-- 調(diào)用已經(jīng)注冊(cè)的子組件 -->
        <div>
            <mycom></mycom>
            <button @click="btnClick">button</button>
        </div>
    </div>
    
    <!-- 子組件模板 -->
    <template id="com">
        <div>
            <p>我是子組件</p>
        </div>
    </template>
    <script>  
        //將Vue實(shí)例作為父組件
        const app = new Vue({
            el: '#app',
            data() {
                return {
                    message: 'hello '
                }  
            },
            methods: {
                btnClick () {
                    console.log(this.$children)
                    //this.$children[0].showMessage
                    console.log(this.$children[0].showMessage)
                }
            },

            //子組件
            components: {
                mycom: {
                    template: '#com',
                    methods: {
                        showMessage () {
                            console.log('showMessage');
                        }
                    },
                }
            }
        })
    </script>
</body>
</html>

多個(gè)子組件的場(chǎng)景兑巾,調(diào)用多次子組件測(cè)試。


我們可以看到有了4個(gè)同名的子組件忠荞。
上面我們通過根組件使用this.$children訪問子組件里面定義的showMessage方法蒋歌,已經(jīng)測(cè)試過,是可以成功的委煤。

下面我們?cè)谧咏M件里面定義一個(gè)屬性name


因?yàn)槲覀冇?個(gè)同名的子組件

Vue實(shí)例的根組件想訪問子組件下面定義的name屬性堂油,我們需要用到遍歷。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- Vue根實(shí)例模板(父組件) -->
    <div id="app">
        <!-- 調(diào)用已經(jīng)注冊(cè)的子組件 -->
        <div>
            <mycom></mycom>
            <mycom></mycom>
            <mycom></mycom>
            <mycom></mycom>
            <button @click="btnClick">button</button>
        </div>
    </div>
    
    <!-- 子組件模板 -->
    <template id="com">
        <div>
            <p>我是子組件</p>
        </div>
    </template>
    <script>  
        //將Vue實(shí)例作為父組件
        const app = new Vue({
            el: '#app',
            data() {
                return {
                    message: 'hello '
                }  
            },
            methods: {
                btnClick () {
                    console.log(this.$children);
                    for (let c of this.$children) {
                        console.log(c.name);
                        c.showMessage();
                    }
                }
            },

            //子組件
            components: {
                mycom: {
                    template: '#com',
                    data() {
                        return {
                            name: '我是組件的name'
                        }
                    },
                    methods: {
                        showMessage () {
                            console.log('showMessage');
                        }
                    },
                }
            }
        })
    </script>
</body>
</html>

但實(shí)際開發(fā)中碧绞,根組件下面擁有很多子組件,
我們一般不會(huì)使用$children府框,去訪問子組件的屬性或方法的,
子組件過多時(shí)讥邻,我們不推薦使用$children
因?yàn)橐褂?children[索引]去找到對(duì)應(yīng)的組件迫靖,修改起來非常的不利索。

比如我們某天又多了一個(gè)需求计维,多了幾個(gè)組件插進(jìn)來袜香,而我們本身想獲取索引是3的組件,現(xiàn)在挪了位置到第5位去了鲫惶,我們又得手動(dòng)去修改method蜈首。



所以遇到這種場(chǎng)景,我們是通過另外一個(gè)父組件訪問子組件的方式,$refs,它的作用類似給每個(gè)子組件終身綁定一個(gè)唯一的識(shí)別身份key欢策,一一對(duì)應(yīng)吆寨。

當(dāng)子組件沒有綁定ref的時(shí)候,控制臺(tái)輸出的$refs是一個(gè)默認(rèn)的空對(duì)象踩寇。



上面的代碼再修改成這樣啄清,就能訪問到<mycom ref="reference"></mycom>子組件的name屬性了




完整代碼:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- Vue根實(shí)例模板(父組件) -->
    <div id="app">
        <!-- 調(diào)用已經(jīng)注冊(cè)的子組件 -->
        <div>
            <mycom></mycom>
            <mycom></mycom>
            <mycom ref="reference"></mycom>
            <mycom></mycom>
            <button @click="btnClick">button</button>
        </div>
    </div>
    
    <!-- 子組件模板 -->
    <template id="com">
        <div>
            <p>我是子組件</p>
        </div>
    </template>
    <script>  
        //將Vue實(shí)例作為父組件
        const app = new Vue({
            el: '#app',
            data() {
                return {
                    message: 'hello '
                }  
            },
            methods: {
                btnClick () {
                    console.log(this.$refs.reference.name);
                   
                }
            },

            //子組件
            components: {
                mycom: {
                    template: '#com',
                    data() {
                        return {
                            name: '我是組件的name'
                        }
                    },
                    methods: {
                        showMessage () {
                            console.log('showMessage');
                        }
                    },
                }
            }
        })
    </script>
</body>
</html>

子組件訪問父組件

1.使用$parent
2.使用$root
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- Vue根實(shí)例模板(父組件) -->
    <div id="app">
        <!-- 調(diào)用已經(jīng)注冊(cè)的子組件 -->
        <div>
            <mycom></mycom>
        </div>
    </div>
    
    <!-- 子組件模板 -->
    <template id="com">
        <div>
            <p>我是子組件</p>
            <button @click="btnClick">button</button>
        </div>
    </template>
    <script>  
        //將Vue實(shí)例作為父組件
        const app = new Vue({
            el: '#app',
            data() {
                return {
                   
                }  
            },

            //子組件
            components: {
                mycom: {
                    template: '#com',
                    data() {
                        return {
                           
                        }
                    },
                    methods: {
                        btnClick () {
                            //1.訪問父組件$parent
                            console.log(this.$parent)
                        }
                    },
                }
            }
        })
    </script>
</body>
</html>

當(dāng)$parent遇上組件層層嵌套的層級(jí)關(guān)系的情形。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

</head>

<body>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- Vue根實(shí)例模板(父組件) -->
    <div id="app">
        <!-- 調(diào)用已經(jīng)注冊(cè)的子組件 -->
        <div>
            <mycom></mycom>
        </div>
    </div>

    <!-- 子組件模板 -->
    <template id="com">
        <div>
            <p>我是組件mycom</p>
            <mycom2></mycom2>
        </div>
    </template>

    <template id="mycom2">
        <div>
            <p>我是子組件mycom2</p>
            <button @click="btnClick">button</button>
        </div>
    </template>
    <script>
        //將Vue實(shí)例作為父組件
        const app = new Vue({
            el: '#app',
            data() {
                return {

                }
            },

            //子組件
            components: {
                mycom: {
                    template: '#com',
                    data() {
                        return {
                            name:'我是組件mycom的name'
                        }
                    },
                    components: {
                        mycom2: {
                            template: '#mycom2',
                            methods: {
                                btnClick() {
                                    //1.訪問父組件$parent
                                    console.log(this.$parent.name)
                                }
                            }
                        }
                    }
                }
            }
        })
    </script>
</body>
</html>

使用$parent,父組件和子組件的耦合度太高俺孙,組件復(fù)用性的太低且太亂辣卒,用的少。

$root打印


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睛榄,一起剝皮案震驚了整個(gè)濱河市荣茫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌场靴,老刑警劉巖啡莉,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異旨剥,居然都是意外死亡咧欣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門轨帜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魄咕,“玉大人,你說我怎么就攤上這事阵谚〔侠瘢” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵梢什,是天一觀的道長(zhǎng)奠蹬。 經(jīng)常有香客問我,道長(zhǎng)嗡午,這世上最難降的妖魔是什么囤躁? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮荔睹,結(jié)果婚禮上狸演,老公的妹妹穿的比我還像新娘。我一直安慰自己僻他,他們只是感情好宵距,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吨拗,像睡著了一般满哪。 火紅的嫁衣襯著肌膚如雪婿斥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天哨鸭,我揣著相機(jī)與錄音民宿,去河邊找鬼。 笑死像鸡,一個(gè)胖子當(dāng)著我的面吹牛活鹰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播只估,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼志群,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仅乓?” 一聲冷哼從身側(cè)響起赖舟,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蓬戚,失蹤者是張志新(化名)和其女友劉穎夸楣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體子漩,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豫喧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幢泼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紧显。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缕棵,靈堂內(nèi)的尸體忽然破棺而出孵班,到底是詐尸還是另有隱情,我是刑警寧澤招驴,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布篙程,位于F島的核電站,受9級(jí)特大地震影響别厘,放射性物質(zhì)發(fā)生泄漏虱饿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一触趴、第九天 我趴在偏房一處隱蔽的房頂上張望氮发。 院中可真熱鬧,春花似錦冗懦、人聲如沸爽冕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颈畸。三九已至前塔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間承冰,已是汗流浹背华弓。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留困乒,地道東北人寂屏。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娜搂,于是被迫代替她去往敵國(guó)和親迁霎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子做院,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350