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

组件间的传值方式

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

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

父子之间

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

Vue和React组件之间的传值方式相关推荐

  1. Vue 组件之间的传值方式有哪些?

    Vue 组件之间的传值方式有哪些? 在平常写Vue项目时,组件传值必不可少,今天我们就要总结一下有哪些种方式呢? 1.父组件向子组件传值(用props) 子组件 <template>< ...

  2. Vue案例:组件之间的传值问题

    案例最终效果如下: 主要解决父子组件之间的传值,以及子组件如何"修改"父组件data的问题.主要代码片段如下: <!-- 父组件 --> <div id=&quo ...

  3. React组件之间传值

    前言 今天群里面有很多都在问关于 React 组件之间是如何通信的问题,之前自己写的时候也遇到过这类问题.下面是我看到的一篇不错英文版的翻译,看过我博客的人都知道,我翻译可能不会按部就班,会尽可能用中 ...

  4. vue父子组件及非父子组件之间的传值

    一.父组件向子组件传值 在vue中通常使用props向子组件传递数据 1.创建子组件,在src/components/文件夹下新建一个Child.vue 2.Child.vue的中创建props,然后 ...

  5. vue父子组件之间的传值,及互相调用父子组件之间的方法

    场景:父子组件之间的传值方法,以及调用他们的内部的方法         *** 父组件给子组件传值是通过属性绑定的方法         *** 子组件给父组件传值是通过绑定对应的方法将自身的值传递给父 ...

  6. vue组件之间互相传值:父传子,子传父

    vue组件之间互相传值:父传子,子传父 为什么要用到组件间传值? 答:组件实例的作用域是孤立的.这意味着不能 (也不应该) 在子组件的模板内直接引用父组件的数据,也不能直接将子组件的数据传到父组件里面 ...

  7. Vue父子组件之间的传值

    1.vue是如何进行父子组件之间的传值的 a.父子组件之间通过props b.子父组件之间通过$emit 2.简单demo描述    父组件包含一个点击按钮,用于改变子组件的显示与隐藏: 子组件只有一 ...

  8. vue、bus 使用遇到的坑,组件之间无法传值;vue、bus 第一次获取不到值,后面再点击重复执行

    vue.bus 使用遇到的坑,组件之间无法传值:vue.bus 第一次获取不到值,后面数据叠加 问题定位: 出现无法传值的情况,检查传值过程中组件是否还没有渲染:可能出现的情况是:组件被if,在你使用 ...

  9. vue兄弟组件之间的传值,bus运用,beforeDestroy销毁,Bus.$off

    vue兄弟组件之间的传值 1.建立一个单独的文件bus.js import Vue from 'vue' export default new Vue() 2.传递事件 // 传递事件 import ...

最新文章

  1. linuxquot;/quot;分区名称,linux分区,磁盘系统的管理,文件系统制作
  2. 问问大家作为大数据总监,刚刚到一家新单位,怎么开展工作比较好?
  3. 【杂谈】我在有三AI从学生到老师
  4. 生产服务器环境最小化安装后Centos 6.5优化配置备忘
  5. 我在阿里招前端,我该怎么帮你?
  6. 如何制作计算机启动盘,一款U盘启动盘制作小工具
  7. Android面试收集录4 Fragment详解
  8. vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法
  9. 用html5点击消失,input点击后placeholder中的提示消息消失
  10. python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...
  11. signature pad java_2020-07-08 JSsignature_pad 无纸化电子签名
  12. 快过年了,分享 25 个 JS 实用技巧送给大家吧
  13. Quartz2D使用(截屏)
  14. python中0x3f_Python学习笔记(一):基本数据类型
  15. conda:Could not find a version that satisfies the requirement XXX
  16. Luogu1712 [NOI2016] 区间
  17. STM32最小系统使用FlyMcu烧写步骤
  18. Git以及Githup的使用
  19. sklearn中多种编码方式——category_encoders(one-hot多种用法)
  20. 实时系统vxWorks - 配置多网口

热门文章

  1. mysql 删除 修改密码_MySQL新建用户,授权,删除用户,修改密码
  2. 一步一步手绘Spring AOP运行时序图(Spring AOP 源码分析)
  3. [Java] 蓝桥杯 BASIC-7 基础练习 特殊的数字
  4. [Python] L1-004. 计算摄氏温度-PAT团体程序设计天梯赛GPLT
  5. 蓝桥杯 ADV-162 算法提高 题目1 最大最小值
  6. 【操作系统】输入输出系统(下下)-思维导图0.0
  7. Linux中main和初启函数,main 中的 argv和argc 到底是个啥意思?
  8. python是一种代表简单主义思想的语言_setuptools-36.6.0
  9. AC日记——独木桥 洛谷 p1007
  10. eclipse中提示“java application configureation name i”