作者:孙志勇 微博

日期:2016年11月29日

一、时效性

所有信息都具有时效性。文章的价值,往往跟时间有很大关联。特别是技术类文章,请注意本文创建时间,如果本文过于久远,请读者酌情考量,莫要浪费时间。

二、背景

在学习React的过程中,频繁的跟props和state打交道,对于初学者来说,不知道什么情况下来使用它们有时候不知道在什么情况下来使用它们。

三、区别

props和state之间是紧密相关的。父组件的state常常转变子组件的props成下面我们通过一个父子组件从上至下来分析它们。

假如我们有个父组件,可以在父组件的state里定义子组件的数据比如:

  1. this.setState({ childData: 'Child Data' });

紧接着,在父组件的render()方法里面,可以将父组件的state,作为子组件的props传递下去,如下

  1. <Child data = {this.state.childData}/>

这样就可以父组件的state传递给子组件的props。从子组件的角度来看,props是不可变的。如何改变子组件的props?我们仅仅需要改变父组件内部的state即可,父组件的state改变之后,引起父组件重新渲染,在渲染的过程中,子组件的data变成父组件this.state.childDtat的值。这样父组件内部state改变,就会引起子组件的改变。

这样就形成里从上而下的数据流,也就是React常说的单向数据流,这个“向”是向下。

我们常常利用这个原理更新子组件,从而衍生出一种模式,父组件:处理复杂的业务逻辑、交互以及数据等。子组件:称它为Stateless组件即无状态组件,只用作展示。在我们开发过程中,尽可能多个使用无状态组件,可以缕清业务之间的逻辑关系,提高渲染效率。

如果子组件想要改变自身的data,这时候需要,父组件传递给子组件一个方法,改变父组件自身的state

父组件:

  1. <Child data={this.state.childData} handleChange={this.handelChildChange}></Child>

子组件接收父组件方法

  1. let Chilid = ({data,handleChange}) =>
  2. <div onClick={handleChange}>{data.name}</div>

四、小结

props:一般用于父组件向子组件通信,在组件之间通信使用。

state:一般用于组件内部的状态维护,更新组建内部的数据,状态,更新子组件的props等。

五、完整代码

父组件

  1. import React, {Component} from 'react';
  2. import Child from './components/child'
  3. class App extends Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. childData: {name: 'child'}
  8. };
  9. this.handelChildChange = this.handelChildChange.bind(this);
  10. }
  11. handelChildChange(){
  12. this.setState({
  13. childData: {name: 'newChild'}
  14. })
  15. }
  16. render() {
  17. return (
  18. <div style={{textAlign:'center'}}>
  19. <Child data={this.state.childData} handleChange={this.handelChildChange}></Child>
  20. </div>
  21. );
  22. }
  23. }
  24. export default App;

子组件:这里使用无状态组件,解构赋值以及无状态组件使用父组件方法

  1. import React from 'react';
  2. let Chilid = ({data,handleChange}) =>
  3. <div onClick={handleChange}>{data.name}</div>
  4. export default Chilid

六、参考链接

  1. http://stackoverflow.com/questions/27991366/what-is-the-difference-between-state-and-props-in-react
  2. https://facebook.github.io/react/docs/state-and-lifecycle.html#the-data-flows-down

七、转载分享

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

八、如果你觉得此文章对你有帮助,并且想为我买杯咖啡,请扫一扫下面,谢谢。

微信



支付宝

props 和 state的区别的更多相关文章

  1. react~props和state的介绍与使用

    props是参数的传递,从上层模块向下层模块进行拿传递:而state是提局域变量,一般在本模块内使用,props是不能改变的,而state可以通过setState去修改自身的值. props Reac ...

  2. React Native中组件的props和state

    一.组件的属性(props)和状态(state) 1.属性(props) 它是组件的不可变属性(组件自己不可以自己修改props). 组件自身定义了一组props作为对外提供的接口,展示一个组件时只需 ...

  3. props、state、forms

    {}用来内嵌任何JS表达式JSX属性JS核心分为三大块:Es6.DOM.WindowBABEL编译器:可以在线编译html语法生成对应的react语法 **自定义组件第一个字母大写:用于区别普通的对象 ...

  4. 关于React中props与state的一知半解

    props props英文翻译是道具的意思,我个人理解为参数,如果我们将react组件看作是一个函数,那么props便是函数接收外部数据所使用的参数.props具有以下特性: 1.不可变(只读性) p ...

  5. react native中对props和state的理解

    最近使用react native这个新的技术做完一个项目,所以赶紧写个博客巩固一下. 今天我想说的是props和state,当然这是我个人的理解,如果有什么不对的地方,望指正. 首先我先说说props ...

  6. 关于props和state以及redux中的state

    React的数据模型分为共有数据和私有数据,共有数据可以在组件间进行传递,私有数据为当前组件私有.共有数据在React中使用props对象来调用,它包含标签所有的属性名称和属性值,props对象有三个 ...

  7. React 深入系列3:Props 和 State

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列3:Props 和 State React 深入系列,深入讲解了React中的重点概念.特性和模式 ...

  8. ReactNative之从HelloWorld中看环境搭建、组件封装、Props及State

    开篇呢,先给大家问个好,今天是中秋节,祝大家中秋节快乐!!虽然是中秋节,但是木有回家还是总结一下知识点写写博客吧,想着昨天总结一下的,但是昨天和几个同学小聚了一下,酒逢知己总是千杯少呢,喝的微醺不适合 ...

  9. React Native基础&入门教程:以一个To Do List小例子,看props和state

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在上篇中,我们介绍了什么是Flexbox布局,以及如何使用Flexb ...

随机推荐

  1. 几种Menu和几种对话框

    一.Menu     1.OptionsMenu(弹出菜单)         (1)显示弹出菜单布局必须要重写的方法    onCreateOptionsMenu    该方法必须返回true     ...

  2. Javascript高级程序设计

    根据叶小钗同学的建议,觉得有必要去读读Javascript高级程序设计,不想装B,只想仔细读读,源代码参考. 偶第一个想法,就是去读面向对象和事件那块,不仅关键,而且是薄弱点儿,所以必须去干掉这个短板 ...

  3. webstorm查看angular2的ts源码

    1.shift双击 双击shift就可以查找文件或函数了,速度更快更方便. 2.ng_for.ts

  4. Word排版成树形结构技巧

    初始文字 A A1 A2 B1 B1 B2 C C1 希望效果 关健设置

  5. Linux下的Memcache安装

    Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.3.0 .下载:http://www.danga.com/memcach ...

  6. ArcEngine下投影坐标和经纬度坐标的相互转换

    jojojojo2002 原文 ArcEngine下投影坐标和经纬度坐标的相互转换 投影转经纬度 private IPoint PRJtoGCS( double x, double y) { IPoi ...

  7. 开启Nginx的gzip压缩功能详解

    默认情况下,Nginx的gzip压缩是关闭的, gzip压缩功能就是可以让你节省不少带宽,但是会增加服务器CPU的开销哦,Nginx默认只对text/html进行压缩 ,如果要对html之外的内容进行 ...

  8. linux清空日志文件内容 (转)

    随着系统运行时间越来越长,日志文件的大小也会随之变得越来越大.如果长期让这些历史日志保存在系统中,将会占用大量的磁盘空间.用户可以直接把这些日志文件删除,但删除日志文件可能会造成一些意想不到的后果.为 ...

  9. 【转】linux下mkisofs制作光盘映像cdrecord刻录光盘

    1.制作光盘映像文件 $mkisofs -R -o /var/tmp/oracle.iso /home/oracle $mkisofs -o myiso.iso /home/oracle/data 补 ...

  10. 使用HTML5的JS选择器操作页面中的元素

    文件命名为:querySelector.html,可在Chrome浏览器中预览效果. 1 <!DOCTYPE html> 2 <html lang="en"> ...