在现代的三大框架中,其中两个Vue和React框架,组件间传值方式有哪些?html
组件的传值场景无外乎如下几种:vue
Vuereact
Vue是基于单项数据流设计的框架,可是提供了一些的语法,指令去实现一些操做api
父->子:经过props进行传递数据给子组件
子->父:经过emit向父组件传值框架
同时,还有一些其余进行父子组件通讯的方式,经过$parent和$children获取组件的父或者子组件的实例,以后经过实例对象去修改组件的属性。在表单控件中,使用v-model实现了双向数据绑定,其实这里v-model是一个语法糖,内部实现仍是监听了表单控件的change事件,而后将数据传递给组件修改数据,从而实现了双向数据绑定。ide
React函数
父->子:经过props将数据传递给子组件
子->父:经过父组件向子组件传递函数,而后子组件中调用这些函数,利用回调函数实现数据传递this
Vue设计
在Vue中,能够经过查找父组件下的子组件实例,而后进行组件进行通讯。如this.$parent.$children
,在$children
中,能够经过组件的name找到要通讯的组件,进而进行通讯。code
React
在React中,须要现将数据传递给父组件,而后父组件再传递给兄弟组件。
Vue
在多层级的组件中,固然能够经过不断的获取$parent
找到须要传递的祖先级组件,而后进行通讯,可是这样繁琐易错,并不推荐。Vue在2.2.0 新增提供了provide/inject的方式进行传递数据。即在祖先组件提供数据,在须要使用的组件中,注入数据,这样就能够在子组件中使用数据了。provide/inject文档
// 父级组件提供 'foo' var Provider = { provide: { foo: 'bar' }, // ... } // 子组件注入 'foo' var Child = { inject: ['foo'], created () { console.log(this.foo) // => "bar" } // ... }
React
在React中,提供了一个和Vue相似的处理多层级组件通讯的方式——context
,这里会提供一个生产者和一个消费者,会在父组件中生产数据,在子组件中消费数据。从使用上来讲,只须要将子组件包裹在生产者的Provider
中,在须要用到数据的子组件中,经过Consumer
包裹,就能够拿到生产者的数据。context文档
// Theme context, default to light theme const ThemeContext = React.createContext('light'); class App extends React.Component { render() { const {signedInUser, theme} = this.props; // App component that provides initial context values return ( <ThemeContext.Provider value={theme}> <Layout /> </ThemeContext.Provider> ); } } function Layout() { return ( <div> <Sidebar /> <Content /> </div> ); } // A component may consume multiple contexts function Content() { return ( <ThemeContext.Consumer> {theme => ( <ProfilePage theme={theme} /> )} </ThemeContext.Consumer> ); }
Vue
对于任意组件,简单的能够使用EventBus,对于更为复杂的建议使用Vuex。
React
简单的使用EventBus,复杂的使用Redux
固然,组件间的传值是灵活的,能够有多种途径,父子组件一样能够使用EventBus,Vuex或者Redux,只是遵循框架开发者的建议,以及适应开发的比较好的实践而已。