組件之間的通訊是面試中極爲常見的問題,也是在實際工做中會常常遇到的問題,因此今天來總結一下關於組件通訊方面的知識點。vue
注: 雖然能夠經過ref來獲取子組件的實例或DOM,可是在實際項目中,並不推薦這樣作。React和Vue優化的本質就是經過操做虛擬DOM,來避免操做真實DOM,提升性能。而使用ref違背了這樣的初衷。react
子組件中:
this.$emit('hello', 'helloWorld');
父組件中:
<child @hello="sayHello" />
複製代碼
// 父組件
<Child hello={this.hello} />
// 子組件
static propsTypes = {
hello: Proptypes.func
}
render() {
return {
<button onClick={this.props.hello}>hello</button>
}
}
複製代碼
// 兄弟組件1
this.$parent.$on('hello',handle);
// 兄弟組件2
this.$parent.$emit('hello')
複製代碼
// 父組件
<A setValue={this.setValue}/>
<B value={this.state.value} /> 複製代碼
// 祖先組件
provide() {
return {hello: 'hello'}
}
// 後代組件
inject: ['hello']
複製代碼
// React.createContext 建立Context對象的API
const StatusContext = React.createContext({
disabled: false
});
// 祖先組件
<StatusContext.Provider value={{disabled: true}}>
<Children />
</StatusContext.Provider>
// 後代組件
<StatusContext.Consumer>
{context => (
<button disabled={context.disabled}>
hello
</button>
)}
</StatusContext.Consumer>
複製代碼
注:面試
對於後代向祖先之間的通訊,其實vue和react採用的方法本質上是同樣的,都是子組件一級一級向上通知。不一樣vue的實現相比於react的要簡單的多。vuex
// 後代組件
function dispatch(eventName, data){
let parent = this.$parent
while (parent) {
parent.$emit(eventName,data)
parent = parent.$parent
}
}
<button @click="dispatch('hello', 'hello,world')">
{{ msg }}
</button>
// 祖先組件
this.$on('hello', this.sayHello)
複製代碼
// main.js
Vue.prototype.$bus = new Bus()
// 組件A
this.$bus.$on('hello', handle)
// 組件B
this.$bus.$emit('hello')
複製代碼
事件總線的方式雖然能夠實現任意組件中的通訊,可是在實際開發中,使用的很是少。由於當項目較大時,可能會涉及到不少組件中的通訊,使用$bus,會讓你的代碼很是雜亂。redux
以上就是React和Vue中常見的組件通訊,若是有錯誤的地方,但願各位大神多多指正。bash