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


Posted in Javascript onJanuary 31, 2019

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

组件间的传值方式

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

  • 父子之间
  • 兄弟之间
  • 多层级之间(孙子祖父或者更多)
  • 任意组件之间

父子之间

Vue

Vue是基于单项数据流设计的框架,但是提供了一些的语法,指令去实现一些操作

  • 父->子:通过props进行传递数据给子组件
  • 子->父:通过emit向父组件传值

同时,还有一些其他进行父子组件通信的方式,通过$parent和$children获取组件的父或者子组件的实例,之后通过实例对象去修改组件的属性。在表单控件中,使用v-model实现了双向数据绑定,其实这里v-model是一个语法糖,内部实现还是监听了表单控件的change事件,然后将数据传递给组件修改数据,从而实现了双向数据绑定。

React

  • 父->子:通过props将数据传递给子组件
  • 子->父:通过父组件向子组件传递函数,然后子组件中调用这些函数,利用回调函数实现数据传递

兄弟之间

Vue

在Vue中,可以通过查找父组件下的子组件实例,然后进行组件进行通信。如this.$parent.$children,在$children中,可以通过组件的name找到要通信的组件,进而进行通信。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript使用prototype定义对象类型(转)[
Dec 22 Javascript
在JavaScript中使用inline函数的问题
Mar 08 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
Mar 25 Javascript
用JSON做数据传输格式中的一些问题总结
Dec 21 Javascript
jquery mobile changepage的三种传参方法介绍
Sep 13 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
jQuery Validate表单验证深入学习
Dec 18 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
input file上传 图片预览功能实例代码
Oct 25 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
bootstrap table合并行数据并居中对齐效果
Oct 17 Javascript
layui文件上传控件带更改后数据传值的方法
Sep 23 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 #Javascript
async/await优雅的错误处理方法总结
Jan 30 #Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 #Javascript
JavaScript之解构赋值的理解
Jan 30 #Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
Jan 30 #Javascript
JS实现的新闻列表自动滚动效果示例
Jan 30 #Javascript
谈谈为什么你的 JavaScript 代码如此冗长
Jan 30 #Javascript
You might like
adodb与adodb_lite之比较
2006/12/31 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
javascript回调函数详解
2018/02/06 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
详解Vue-axios 设置请求头问题
2018/12/06 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
2019/02/27 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
python3中rank函数的用法
2019/11/27 Python
python实现翻译word表格小程序
2020/02/27 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
毕业生自荐书
2014/02/02 职场文书
聘用意向书范本
2014/04/01 职场文书
2014年化验员工作总结
2014/11/18 职场文书
房产公证书格式
2015/01/26 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
深入理解go slice结构
2021/09/15 Golang