为了账号安全,请及时绑定邮箱和手机立即绑定

请问一下React 组件之间通信有哪些方式?

/ 猿问

请问一下React 组件之间通信有哪些方式?

皈依舞 2019-08-19 17:13:55

React 组件之间通信有哪些方式


查看完整描述

3 回答

?
青春有我

1. 父组件 -> 前几层子组件: props

2. 父组件 -> 非常深入的子组件(比如从最顶层到第5层以后): context
这种情况几乎很少见,除非写框架或者工具,最好是只用props,清晰明了

3. 子组件 -> 父组件:callback

4. 子组件时间: 严格意义上不存在这种情况,如果出现这样的需求,说明你的写法是错误的,
数据的流向始终都应该是从顶至下。例如root -> (A,B,C) 所以A组件改变,需要让B改变时,A调用root以props传来的callback从而导致root的state发生变化,这样B就能得到更新

5.

当APP复杂的可能特殊情况:在使用pureRenderMixin来提升渲染速度的时候,非常里层的子组件需要一些参数来计算显示的值,但是你又不需要
当这个值改变的时候重新渲染这个组件而且也不想用context的时候, 在Root中定义this.getAllState= () =>
this.state, 然后将这个getAllState作为props传递给子组件; 这种情况很少出现,慎用

6.使用某种Flux,让局部组件链接一个自己的store,同时接受来自父组件的各种callback props, 通过这些callback实现 小组件的store改变时,通知父组件

在一个实际的APP中的实际情况是如何设计store和props的呢?
其实重点,我认为是store和store之间是如何交流数据的。
这里我斗胆地拿我在家写的一个编辑器来做一些分析:编辑器端Flommox, 播放器向redux迁移中
整个编辑器网站分成了不同的页面,每个页面(例如/course:id, /editor/:id, /quizs)对应一个Action分组+一个Store, 有的复杂页面可能需要很多歌store整个编辑器网站分成了不同的页面,每个页面(例如/course:id, /editor/:id, /quizs)对应一个Action分组+一个Store, 有的复杂页面可能需要很多歌store


个编辑器使用了不止一个store,在初次渲染是先隐藏了『资源弹出框』『习题弹出框』他们分别有自己的store,但是他们是否显示是由父组件的
store控制的,具体的数据交流第6点已经简单的说明了。有些flux框架可以让一个函数作为Action,那么这个就可以作为callback进行数
据交流了。

更好的方式:直接在Action里传递Promise, 甚至Observable

更更好的方式:使用Redux 的middleware, 在一个Action发送途中去做异步请求其他store的数据,Redux的Action中也可以传递thunk, promise,Observable ,function等,尽量少用callback,让整个APP更加functional programming, 更好管理



查看完整回答
反对 回复 2019-08-24
?
慕的地8271018

1. 父组件 -> 前几层子组件: props 2. 父组件 -> 非常深入的子组件(比如从最顶层到第5层以后): context 这种情况几乎很少见,除非写框架或者工具,最好是只用props,清晰明了 3. 子组件 -> 父组件:callback 4. 子组件时间: 严格意义上不存在...

查看完整回答
反对 回复 2019-08-24
?
开满天机

四大组件以及通讯机制:
activity
(1)一个Activity通常就是一个单独的屏幕(窗口)。
(2)Activity之间通过Intent进行通信。
(3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity。
service
(1)service用于在后台完成用户指定的操作。service分为两种:
(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。
(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
(2)startService()与bindService()区别:
(a)started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。
(b)使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
(3)开发人员需要在应用程序配置文件中声明全部的service,使用<service></service>标签。
(4)Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
content provider
(1)android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
(2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
(3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
(4)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
(5)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。
broadcast receiver
(1)你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
(2)广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
(3)动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。



查看完整回答
反对 回复 2019-08-24

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信