react组件之间传递信息/react组件之间值的传递

react组件之间传递信息/react组件之间值的传递

首先咱们先来了解一下,数据是怎么进行相互间传递的;
api和组件的区别:一个是逻辑层的方法函数,一个是表现层的组件(方法函数)。
api是一组预先定义好的函数,调用其实是调用其中的函数方法。
组件调用是直接表现在页面上。
SDK 就是 Software Development Kit 的缩写,中文意思就是“软件开发工具包”
什么是SDK?
SDK相当于开发集成工具环境,API就是数据接口。在SDK环境下调用API数据,实际上SDK包含了API的定义,API定义了一种能力,一种接口的规范,而SDK可以包含这种能力、包含这种规范。但是SDK又不完完全全只包含API以及API的实现,它是一个软件工具包,它还有很多其他辅助性的功能。
接下来说一说API和SDK之间的区别
API
API是前端调用后端数据的一个通道,就是我们俗说的接口,通过这个接口,可以访问到后端的数据,但是又无需调用源代码。
SDK
SDK是工程师为辅助开发某类软件的相关文档、范例和工具的集合,使用SDK可以提高开发效率,更简单的接入某个功能。
举例说明:一个产品想实现某个功能,可以找到相关的SDK,工程师直接接入SDK,就不用再重新开发了。

**1.组件 API中有以下7个方法:**
设置状态:setState
替换状态:replaceState
设置属性:setProps
替换属性:replaceProps
强制更新:forceUpdate
获取DOM节点:findDOMNode
判断组件挂载状态:isMounted

设置状态:setState: setState(object nextState[, function callback])
参数说明:nextState:将要设置的新状态,该状态会和当前的state合并。
callback:可选参数(可选的,不常用),回调函数,该函数会在state设置成功且组件重新渲染后调用
注意:不能在组件内部通过this.state修改状态,因为该状态会在调用setState()后被替换,setState()总是会触发一次组件重绘。

组件之间传递信息方式,总体可分为以下5种:

react重要的思想就是组件化思想
它将可以重用的部分进行组件化开发,形成一个个相对独立的组件,那么组件化后,各个组件间需要通信,组件可以将UI切分成一些独立的、可复用的部件,这样你就只需专注于构建每一个单独的部件。
组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素
1.(父组件)向(子组件)传递信息
2.(父组件)向更深层的(子组件) 进行传递信息 >>利用(context)
3.(子组件)向(父组件)传递信息
4.没有任何嵌套关系的组件之间传值(比如:兄弟组件之间传值)
5.利用react-redux进行组件之间的状态信息共享(这个放在下次讲,太多了)

一.(父组件)向(子组件)传递信息 >>>主要是通过 prop进行传值

.

//父组件
var MyContainer = React.createClass({
  getInitialState: function () {
    return {
      checked: false
    };
  },
  render: function() {
    return (
      <ToggleButton text="Toggle me" checked={this.state.checked} />
    );
  }
});
// 子组件
var ToggleButton = React.createClass({
  render: function () {
    // 从(父组件)获取的值
    var checked = this.props.checked,
        text = this.props.text;
    return (
        <label>{text}: <input type="checkbox" checked={checked} /></label>
    );
  }
});

以上这个例子,子组件通过 prop拿到了text值以及checked的属性值;那么当子组件要拿到祖父级组件的信息,也是可以通过prop进行逐层的获取。来看下下面的例子。

var Button = React.createClass({
  render: function() {
    return (
      <button style={{background: this.props.color}}>
        {this.props.children}
      </button>
    );
  }
});
var Message = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.text} <Button color={this.props.color}>Delete</Button>
      </div>
    );
  }
});
var MessageList = React.createClass({
  render: function() {
    var color = "purple";
    var children = this.props.messages.map(function(message) {
      return <Message text={message.text} color={color} />;
    });
    return <div>{children}</div>;
  }
});

以上的例子中第一层组件(MessageList)想要将color值传递到第三层组件(Button),通过第二层组件(Message)进行了传递。进而实现了第一层往第三层传递。但是这种方式,并不是很优雅,如果传递的层级更多时,中间的层级都需要来传递,数据的传递变的更加繁琐。所以我们就会想到,是否可以"越级"获取数据。这时候就需要使用context。能帮你 “越级” 传递数据到组件中你想传递到的深层次组件中。

二.(父组件)向更深层的(子组件) 进行传递信息

利用(context)进行更深层次的传递。

var Button = React.createClass({
  // 必须指定context的数据类型
  contextTypes: {
    color: React.PropTypes.string
  },
  render: function() {
    return (
      <button style={{background: this.context.color}}>
        {this.props.children}
      </button>
    );
  }
});
var Message = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.text} <Button>Delete</Button>
      </div>
    );
  }
});
var MessageList = React.createClass({
  //父组件要定义 childContextTypes 和 getChildContext() 
  childContextTypes: {
    color: React.PropTypes.string
  },
  getChildContext: function() {
    return {color: "purple"};
  },
  render: function() {
    var children = this.props.messages.map(function(message) {
      return <Message text={message.text} />;
    });
    return <div>{children}</div>;
  }
});

以上代码中通过添加 childContextTypes 和 getChildContext() 到 第一层组件MessageList ( context 的提供者),React 自动向下传递数据然后在组件中的任意组件(也就是说任意子组件,在此示例代码中也就是 Button )都能通过定义 contextTypes(必须指定context的数据类型) 访问 context 中的数据。这样就不需要通过第二层组件进行传递了。
指定数据并要将数据传递下去的父组件要定义 childContextTypes 和 getChildContext() ;想要接收到数据的子组件必须定义 contextTypes 来使用传递过来的 context 。

三.(子组件)向(父组件)传递信息

直接上代码

// 父组件
var MyContainer = React.createClass({
  getInitialState: function () {
    return {
      checked: false
    };
  },
  onChildChanged: function (newState) {
    this.setState({
      checked: newState
    });
  },
  render: function() {
    var isChecked = this.state.checked ? 'yes' : 'no';
    return (
      <div>
        <div>Are you checked: {isChecked}</div>
        <ToggleButton text="Toggle me"
          initialChecked={this.state.checked}
          callbackParent={this.onChildChanged}
          />
      </div>
    );
  }
});
// 子组件
var ToggleButton = React.createClass({
  getInitialState: function () {
    return {
      checked: this.props.initialChecked
    };
  },
  onTextChange: function () {
    var newState = !this.state.checked;
    this.setState({
      checked: newState
    });
    //这里将子组件的信息传递给了父组件
    this.props.callbackParent(newState);
  },
  render: function () {
    // 从(父组件)获取的值
    var text = this.props.text;
    // 组件自身的状态数据
    var checked = this.state.checked;
		//onchange 事件用于单选框与复选框改变后触发的事件。
    return (
        <label>
        {text}: <input type="checkbox" checked={checked} onChange={this.onTextChange} />
        </label>
    );
  }
});

以上例子中,在父组件绑定callbackParent={this.onChildChanged},在子组件利用this.props.callbackParent(newState),触发了父级的的this.onChildChanged方法,进而将子组件的数据(newState)传递到了父组件。
这样做其实是依赖 props 来传递事件的引用,并通过回调的方式来实现的。

四.兄弟组件之间传值 (组件之间没有任何嵌套关系的传值)

想一想,如果组件之间没有任何嵌套关系,组件嵌套层次比较深,我们该怎样去处理各个组件中的值的传递呢?
这就需要我们引入一个PubSubJS 库,通过这个库你可以订阅的信息,发布消息以及消息退订。
// 定义一个容器(将ProductSelection和Product组件放在一个容器中)

var ProductList = React.createClass({
    render: function () {
      return (
        <div>
          <ProductSelection />
          <Product name="product 1" />
          <Product name="product 2" />
          <Product name="product 3" />
        </div>
      );
    }
});
// 用于展示点击的产品信息容器
var ProductSelection = React.createClass({
  getInitialState: function() {
    return {
      selection: 'none'
    };
  },
  componentDidMount: function () {
  	//通过PubSub库订阅一个信息
    this.pubsub_token = PubSub.subscribe('products', function (topic, product) {
      this.setState({
        selection: product
      });
    }.bind(this));
  },
  componentWillUnmount: function () {
  	//当组件将要卸载的时候,退订信息
    PubSub.unsubscribe(this.pubsub_token);
  },
  render: function () {
    return (
      <p>你已经选择了这个产品 : {this.state.selection}</p>
    );
  }
});
var Product = React.createClass({
  onclick: function () {
  	//通过PubSub库发布信息
    PubSub.publish('products', this.props.name);
  },
  render: function() {
    return <div onClick={this.onclick}>{this.props.name}</div>;
  }
});

ProductSelection和Product本身是没有嵌套关系的,而是兄弟层级的关系。但通过在ProductSelection组件中订阅一个消息,在Product组件中又发布了这个消息,使得两个组件又产生了联系,进行传递的信息。

五.利用react-redux进行组件之间的状态信息共享

提到redux的话,像基本的三个元素action,reducer,store都应该是清楚他们是干嘛的。这里就不做赘述了。
在这里插入图片描述

这是官方给出的redux的工作流,打个比方说,我们去图书馆借书
React Component就是图书借阅者,
action就相当于于我们的图书管理员或者借书机器,
store就是图书馆或者说是图书储存室,里面存储的都是书籍
我们去借书首先会发起action咨询图书管理员,或者直接找图书管理员来确认书籍书否可借阅(比如被借走,损坏修复中等),
图书管理员会去图书室查询一下书籍是否可借阅,如果可借阅,那么他就会将书籍返给你,如果不行,那么也会通知你。
这就是一个简单的redux流程。就相当于一次借阅图书的过程。
比较大型的企业项目中基本都会会用到react-redux,这方面的资料可以参考阮一峰的网络日志。
地址:http://www.ruanyifeng.com/blog/2016/09/

每天一句中文式外语

俄语

过海关或安检的时候使用

1. Скажите‚пожалуйста‚где проходит контроль паспорта? 
 请问‚在那里检查护照?
(思嘎热节‚八热俄思达‚哥姐 朴拉火鸡特 嘎恩特老李 八思八了打)

2. Где надо подписаться? 
 在那签名?
 (哥姐‚那答 把特笔洒擦)

3. У меня нет вещей для таможенной декларации.
我没有什么要申报的东西.
 (屋 灭尼阿 涅特 为写以 德里呀 打毛热拿衣 接可拉腊册呀)

4. Это все мои личные вещи. 
 这些都是随身物品.
(爱达 复写 蚂蚁 力气内业 为西)

5. Я хочу связаться с консульством КНР.
 我想和中华人民共和国领事馆联系.
 (雅 哈秋 思无亚擦 思嘎恩苏里思特娃母 嘎爱勒)

6. Где взять декларацию? 
  在哪领报关单?
 (哥姐 无字压气 解渴拉腊册呀)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eugene.Tom.Lee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值