Vue父組件與子組件之間通信

一、父組件向子組件傳遞信息

  1. 利用props(這種比較基礎(chǔ),就不細(xì)寫了)
// 父組件:
<template>
    <div>
        <child :message="message"></child>
    </div>
</template>
<script>
import child from 'child.js'

export default {
    components: {
        child
    },
    data() {
      return {
        message: 'message'
      }
    }
}
</script>


// 子組件:
<template>
    <div>
        {{ message }}
    </div>
</template>
<script>
export default {
    name: 'child',
    props: {
        message: {
            type: String
        }
    }
}
</script>
  1. 利用refs API
    首先來看看refs是什么,官方給出的描述:一個對象,持有注冊過 ref attribute 的所有 DOM 元素和組件實例,也就是說只要我們給子組件注冊ref屬性,之后便可以通過refs這個API獲得到子組件的DOM元素和Vue組件實例,也就可以調(diào)用子組件的方法。
// 父組件:
<template>
    <div>
        <child ref="child"></child>
        <button @click="clear()">Clear</button>
    </div>
</template>
<script>
import child from 'child.js'

export default {
    components: {
        child
    },
    method: {
        clear() {
            this.$refs.clear();
        }
    }
}
</script>

// 子組件:
<template>
    <div>
        {{ message }}
    </div>
</template>
<script>
export default {
    name: 'child',
    data() {
      return {
        message: 'message'
      }
    },
    methods: {
        clear() {
            this.message = '';
        }
    }
}
</script>

二、子組件向父組件傳遞信息

回想我們在開發(fā)中,用element-ui、iview等這類組件時,數(shù)據(jù)是如何“綁定”到組件上的?v-model。

  1. $emit API
    首先還是來看看官方的說明emit,觸發(fā)當(dāng)前實例上的事件。附加參數(shù)都會傳給監(jiān)聽器回調(diào),然后在父組件里使用v-on監(jiān)聽處理這個事件。
    Vue.component('welcome-button', {
      template: `
        <button v-on:click="$emit('welcome')">
          Click me to be welcomed
        </button>
      `
    })
    
    <div id="emit-example-simple">
      <welcome-button v-on:welcome="sayHi"></welcome-button>
    </div>
    
    new Vue({
      el: '#emit-example-simple',
      methods: {
        sayHi: function () {
          alert('Hi!')
        }
      }
    })
    
  2. v-model
    v-model本質(zhì)上是一個語法糖,它包含一個prop和一個event,默認(rèn)這個prop是value、event是input,先來看看下面的例子:
    // 子組件
    <template>
        <input :value="value" @input="handleInput" @change="handleChange"/>
    </template>
    
    <script>
    export default {
        name: 'Input',
        props: {
            value: [String, Number],
        },
        methods: {
            handleInput(event) {
                this.$emit('input', event.target.value);
            },
            handleChange(event) {
                this.$emit('input', event.target.value);
            },
        }
    }
    </script>
    
    // 父組件
    <Input v-model="value"/>
    
    <script>
    export default {
        data() {
            return {
                value: ''
            }
            }
        }
    }
    </script>
    
    子組件就是一個簡單的input框,使用v-on監(jiān)聽綁定input和change事件(均為原生事件),在其value發(fā)生變化時調(diào)用this.$emit('input', event.target.value);,告訴父組件“我這里發(fā)生了input事件,我的value已經(jīng)改變了,現(xiàn)在的值是event.target.value”,而在父組件上只要對input事件進(jìn)行監(jiān)聽和處理即可,v-model其實就是在監(jiān)聽到input事件的時候,將子組件中的value prop賦值給綁定的參數(shù)。
    再來看看官方的例子:
    Vue.component('base-checkbox', {
      model: {
        prop: 'checked',
        event: 'change'
      },
      props: {
        checked: Boolean
      },
      template: `
        <input
          type="checkbox"
          v-bind:checked="checked"
          v-on:change="$emit('change', $event.target.checked)"
        >
      `
    })
    
    <base-checkbox v-model="lovingVue"></base-checkbox>
    
    最開始這個lovingVue的值會傳給子組件的chekced變量,而當(dāng)checked的值發(fā)生改變之后就會觸發(fā)input的change事件(這里的change是HTML input原生的事件),進(jìn)而調(diào)用v-on:change綁定的$emit('change', $event.target.checked)將事件傳遞給父組件,同時把改變后的值一并傳過去,所以
    <base-checkbox v-model="lovingVue"></base-checkbox>
    其實就等同于
    <base-checkbox v-bind:checked="lovingVue" v-on:change="changeValue"></base-checkbox>
    
    <script>
    export default {
        data() {
          return {
              lovingVue: true
          }
        },
        methods: {
            changeVlaue(value) {
                this.lovingVue = value;
            }
        }
    }
    </script>
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • Vue組件之間通信的七種方式 使用Vue也有很長一段時間,但是一直以來都沒對其組件之間的通信做一個總結(jié),這次就借此...
    豆豆_4edc閱讀 671評論 0 2
  • 概念 雙向數(shù)據(jù)流:父組件數(shù)據(jù)能傳遞到子組件,子組件接收數(shù)據(jù),進(jìn)行展示;此外子組件可以修改父組件中的數(shù)據(jù) 雙向數(shù)據(jù)綁...
    squidbrother閱讀 451評論 0 0
  • 之前說過,可以使用 props 將數(shù)據(jù)從父組件傳遞給子組件。其實還有其它種的通信方式,下面我們一一娓娓道來。 1 ...
    deniro閱讀 3,375評論 2 27
  • 一般來說,組件可以有以下幾種關(guān)系: 如上圖所示,A 和 B、B 和 C、B 和 D 都是父子關(guān)系,C 和 D 是兄...
    moofyu閱讀 394評論 0 1
  • 一 父組件向子組件通過props傳遞數(shù)據(jù) 在組件中,使用選項props來聲明需要從父級接收到的數(shù)據(jù)。props的值...
    名字是亂打的閱讀 249評論 0 1

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