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 - HTML的request类
Jul 15 Javascript
javascript字符串拼接的效率问题
Dec 25 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
基于JS实现textarea中获取动态剩余字数的方法
May 25 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
javascript编写简易计算器
May 06 Javascript
代码分析vue中如何配置less
Sep 28 Javascript
Vue 递归多级菜单的实例代码
May 05 Javascript
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
使用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
Protoss兵种对照表
2020/03/14 星际争霸
php简单创建zip压缩文件的方法
2016/04/30 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
javascript 模式设计之工厂模式详细说明
2010/05/10 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
jQuery关键词说明插件cluetip使用指南
2015/04/21 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
Python+django实现文件上传
2016/01/17 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Python os模块常用方法和属性总结
2020/02/20 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
Python Selenium库的基本使用教程
2021/01/04 Python
开放系统互连参考模型
2016/06/29 面试题
某公司C#程序员面试题笔试题
2014/05/26 面试题
会计专业应届生求职信
2013/11/24 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python