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 相关文章推荐
arguments对象
Nov 20 Javascript
Mozilla 表达式 __noSuchMethod__
Apr 05 Javascript
Jvascript学习实践案例(开发常用)
Jun 25 Javascript
javascript动态加载实现方法一
Aug 22 Javascript
JS画5角星方法介绍
Sep 17 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
Extjs4中Form的使用之本地hiddenfield
Nov 26 Javascript
JavaScript类型系统之基本数据类型与包装类型
Jan 06 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
Vue.js实现移动端短信验证码功能
Mar 29 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
基于thinkPHP3.2实现微信接入及查询token值的方法
2017/04/18 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
javascript 函数速查表
2010/02/07 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
json的使用小结
2016/06/08 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
vue移动端屏幕适配详解
2019/04/30 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
学校介绍信范文
2014/01/14 职场文书
幼儿园义卖活动方案
2014/01/17 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
企业承诺书格式
2014/05/21 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
公司给客户的感谢信
2015/01/23 职场文书
邀请函怎么写
2015/01/30 职场文书
社区低保工作总结2015
2015/07/23 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS