React独立组件间通信联动

React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而没有给出独立组件间通信的解决方案。这里我介绍一种不错的实现方式——signals.

第一步,我们要建立两个简单的react组件——一个进度条和一个输入框。

组件——进度条:

 var ProcessBar=React.createClass({
           getInitialState:function(){
                return {
                    initValue:0, //初始值
                    endValue:0,  //终值
                    totalValue:100 , //总值
                   };
            },
            render:function(){
                var barStyle={
                    width:this.getPer(),
                };
                return(
                     <div className="progress">
                         <div className="progress-bar" style={barStyle}>{this.getPer()}</div>

                     </div>
                    );
              }
         });

       这个进度条的实现依赖于Bootstrp的进度条组件样式及特效,可以移步:http://v3.bootcss.com/components/#progress 查看。

组件——input框:

  var Input=React.createClass({

            getEndValue:function(){
                    var curValue=this.refs.endValue.value;
                    if(curValue <= 0) curValue=0;
                    if(curValue >=100) curValue=100;
                   },
            render:function(){

                return (
                     <div>
                         <input type="text"  ref="endValue" placeholder="请输入值" onChange={this.getEndValue}/>
                     </div>
                    );
             }
             });

      两个独立的简单的组件已经完成了,下面就来看看如何使它们可以紧密联系,当input框中的值变化时,进度条可以实时变化。

在此,你可以借鉴另一篇博客了解解决独立组件间通信的几种策略——http://www.tuicool.com/articles/AzQzEbq

这里,我主要介绍signals解决的方案。我们简单看下signals的github上的介绍:http://millermedeiros.github.io/js-signals/,看它给出的应用基本实例:

//custom object that dispatch a `started` signal
var myObject = {
  started : new signals.Signal()
};
function onStarted(param1, param2){
  alert(param1 + param2);
}
myObject.started.dispatch(‘foo‘, ‘bar‘); //dispatch signal passing custom parameters
myObject.started.add(onStarted); //add listener
myObject.started.remove(onStarted); //remove a single listener

  我们会发现,signals应用很简单,步骤为:

1:先创建一个signals.Signal的实例对象。

2:该对象通过dispatch()方法发布数据。

3:该实例对象提供add(function(data){})方法监听到数据,data默认为发布的数据。

4:如果需要,可以通过remove()关闭连接。

这里要提一下,就是因为发布和监听只能建立一个,所以我们的数据可以集中为一个数据对象,这样就可以大量传递数据了。

好,现在我们来应用到我们的组件中看看能不能解决我们的问题。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>processBar</title>
    <link rel="stylesheet" href="../../public/css/bootstrap-theme.min.css"/>
    <link rel="stylesheet" href="../../public/css/bootstrap.min.css"/>
    <script src="../../public/js/react-0.14.0.js"></script>
    <script src="../../public/js/react-dom-0.14.0.js"></script>
    <script src="../../public/js/jquery.js"></script>
    <script src="../../public/js/browser.min.js"></script>
    <script src="../../public/js/signals.js"></script>
    <script src="../../public/js/bootstrap.min.js"></script>
    <style>
           #exm{margin:20px auto;height:100px;border:1px solid #000;}
          .progress-bar{width:60%;}
    </style>
</head>
<body>
      <div id="exm"></div>
      <div id="exm2"></div>
      <script type="text/babel">
         //设置数据广播
         var broadData=new signals.Signal(); //全局数据广播对象
         var datas={};  //总数据对象
         var ProcessBar=React.createClass({
            getInitialState:function(){
                return {
                    initValue:0, //初始值
                    endValue:0,  //终值
                    totalValue:100 , //总值
                   };
            },
            getPer:function(){
                var that=this;
                broadData.add(function(data){ //收听到数据
                   that.setState({
                      endValue:data.curValue,
                   });
                });
                 var per=(this.state.endValue-this.state.initValue)/this.state.totalValue *100+"%";
                        return per;
            },
            render:function(){
                var barStyle={
                    width:this.getPer(),
                };
                return(
                     <div className="progress">
                         <div className="progress-bar" style={barStyle}>{this.getPer()}</div>

                     </div>
                    );
            }
         });

          //输入框
         var Input=React.createClass({

            getEndValue:function(){
                    var curValue=this.refs.endValue.value;
                    if(curValue <= 0) curValue=0;
                    if(curValue >=100) curValue=100;
                    datas.curValue=curValue; //将curValue放入总数居对象
                    broadData.dispatch(datas); //发布数据

            },
            render:function(){

                return (
                     <div>
                         <input type="text"  ref="endValue" placeholder="请输入值" onChange={this.getEndValue}/>
                     </div>
                    );
            }
         });

        ReactDOM.render(  //input框要先于进度条渲染
                 <Input/>,
                 document.getElementById("exm2")
            );

         ReactDOM.render(
                 <ProcessBar/>,
                 document.getElementById("exm")
            );

      </script>
</body>
</html>

  我们的代码效果如下:

我们的问题得到了解决!

如果以上内容对您有所帮助,请帮我点个推荐吧,传播整理知识,有利你我。

时间: 2024-10-11 22:32:22

React独立组件间通信联动的相关文章

React 中组件间通信的几种方式

在使用 React 的过程中,不可避免的需要组件间进行消息传递(通信),组件间通信大体有下面几种情况: 父组件向子组件通信 子组件向父组件通信 非嵌套组件间通信 跨级组件之间通信 1.父组件向子组件通信父组件通过向子组件传递 props,子组件得到 props 后进行相应的处理.演示代码:父组件 parent.js: import React,{ Component } from "react"; export default class App extends Component{

vue 和 react 组件间通信方法对比

vue 和 react 组件间通信方法对比 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).this.$refs.this.$children props 子组件 => 父组件 自定义事件($emit.$on)(推荐).this.$parent 回调函数(推荐) 非父子组件(兄弟组件.跨级组件) bus 高阶组件(推荐).自定义事件.context 原文地址:https://www.cnblogs.com/cag2050/p/9054840.html

Android组件间通信框架EventBus

事件总线EventBus模式概述 在不使用事件总线的情况下: 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容.这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口.然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件.例如,陌陌依赖手机位置信息来获取附近的用户,所以在位置更新管理器(MmLocationManager)中定义了一个接口来监听位置更新的事件(MmLocationListener): interface MmLocationListene

vue组件间通信六种方式(完整版)

vue组件间通信六种方式(完整版) 前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是父子关系,C 和 D 是兄弟关系,A 和 C 是隔代关系(可能隔多代). 针对不同的使用场景,如何选择行之有效的通信方式?这是我们所要探讨的主题.本文总结了vue组件间通信的几种方式,如props.$emit/$on.vuex.$parent / $chil

Android组件间通信——EventBus

在Android开发中,组件间通信一直是一个不可忽视的部分.当然,组件之间的通信有很多种方式可以选择,本文就利用EventBus通信的方式进行论述. EventBus是一个第三方框架,它的简单使用分为如下几步: 1. 下载框架源码,并导入工程中. 下载地址:https://github.com/greenrobot/EventBus 如果需要看如何导入并依赖工程,请转到另一篇博文:<Eclipse导入所依赖的Android项目> 2. 定义事件类,并广播事件 例如下面这个自定义事件类Messa

Vue2.0 实战项目(五) 组件间通信的方法

Vue组件之间通信分为三种情况:父组件向子组件通信.子组件向父组件通信.兄弟组件间通信. 一.父组件向子组件通信 通过props可以将值传递给子组件 <!-- 父组件 --><template> <div id="app"> <!-- 父子组件间通信 --> <child :message="toChildMsg"></child> </div> </template>

Android 组件间通信--事件驱动

在android中,组件间通信常用的方式: 1.使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可 例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化.当点击菜单时发送广播通知容器变化显示的Fragment 2.使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法 3.事件驱动方式:EventManager 最近在网上看到EventBus这个开源的工

vue组件间通信子与父

二.组件间通信(子组件传值给父组件) 通过事件的方式来完成数据的传输. ①在父组件中 定义一个方法,用来接收子组件所通过事件传来的值 methods:{ recvMsg:function(msg){ //参数msg就是子组件通过事件出来的数据 }} ②绑定事件处理函数事件一般情况 都是自定义事件 <child-component @myEvent="recvMsg"></child-component> ③在子组件触发事件 事件名,值this.$emit('my

vue组件间通信

组件间通信 vue组件之间的通信方式包括父子通信.子父通信和非父子通信 父子间通信 <!-- 在父组件中使用子组件 --> <!-- 在父组件中向子组件传递数据,需要在子组件上面添加属性,使其值等于要传递的数据 --> <Child :childData="childData"></Child> // 父组件 // 引入子组件 import Child from './Child' export default { // 注册子组件 co