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 相关文章推荐
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
jquery弹出框的用法示例(2)
Aug 26 Javascript
jQuery动态添加、删除元素的方法
Jan 09 Javascript
JS实现1000以内被3或5整除的数字之和
Feb 18 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
JS中判断null的方法分析
Nov 21 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
Apr 26 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
微信小程序扫描二维码获取信息实例详解
May 07 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 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
PHP 裁剪图片成固定大小代码方法
2009/09/09 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
Python批量修改文件后缀的方法
2014/01/26 Python
Python selenium如何设置等待时间
2016/09/15 Python
python实现决策树分类算法
2017/12/21 Python
python实现学生信息管理系统源码
2021/02/22 Python
戴尔加拿大官网:Dell加拿大
2016/09/17 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
家居设计专业个人自荐信范文
2013/11/26 职场文书
工程班组长岗位职责
2013/12/30 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
2013年军训通讯稿
2014/02/05 职场文书
暑期培训班策划方案
2014/08/26 职场文书
计生个人工作总结
2015/02/28 职场文书
特此通知格式
2015/04/27 职场文书
学前教育见习总结
2015/06/23 职场文书
商务信函英语问候语
2015/11/10 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
python可视化大屏库big_screen示例详解
2021/11/23 Python