Vue和React组件之间的传值方式

在现代的三大框架中,其中两个Vue和React框架,组件间传值方式有哪些?html

组件间的传值方式

组件的传值场景无外乎如下几种:vue

  1. 父子之间
  2. 兄弟之间
  3. 多层级之间(孙子祖父或者更多)
  4. 任意组件之间

父子之间

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,只是遵循框架开发者的建议,以及适应开发的比较好的实践而已。

相关文章
相关标签/搜索