作者:孙志勇 微博

日期:2016年11月29日

一、时效性

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

二、背景

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

三、区别

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

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

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

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

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

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

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

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

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

父组件:

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

子组件接收父组件方法

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

四、小结

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

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

五、完整代码

父组件

import React, {Component} from 'react';

import Child from './components/child'
class App extends Component {
constructor(props) {
super(props);
this.state = {
childData: {name: 'child'}
};
this.handelChildChange = this.handelChildChange.bind(this);
} handelChildChange(){
this.setState({
childData: {name: 'newChild'}
})
}
render() {
return (
<div style={{textAlign:'center'}}>
<Child data={this.state.childData} handleChange={this.handelChildChange}></Child>
</div>
);
}
} export default App;

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

import React from 'react';

let Chilid = ({data,handleChange}) =>
<div onClick={handleChange}>{data.name}</div> 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. Thrift——初学

    是什么? Thrift是一个跨语言的服务部署框架最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数 ...

  2. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_2

    2. 产品安装过程提示Ping Domain Error 1)错误日志: Pinging domain... 8:19:22 AM ********************************** ...

  3. IRequiresSessionState和IReadOnlySessionState应用上的一些差异

    在调用ashx时,如果需要应用Session,则必须继承接口 IRequiresSessionState,IReadOnlySessionState,但根据字面,可以知道 IRequiresSessi ...

  4. C语言练习代码

    1.运用for循环根据输入的金字塔层数,输出金字塔 eg: #include <stdio.h>int main(void){ int i,j,num; printf("请输入三 ...

  5. pycharm出现乱码

    1. 'gbk' codec can't encode character u'\xb8' 解决办法 import sys reload(sys)sys.setdefaultencoding('utf ...

  6. 详解centos下vi的用法

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...

  7. 【转】GUID学习

    概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算 ...

  8. Scrum之Sprint会议

    Scrum的项目过程有一系列的Sprint组成. Sprint的长度一般控制在2-4周. 通过固定的周期保持良好的节奏. 产品的设计.开发.测试都在Sprint期间完成. Sprint结束时交付可以工 ...

  9. How To Set Up Port Forwarding in Linux

    Port forwarding usually used when we want our computer act like a router. Our computer receive the p ...

  10. 关于WordPress建站的原理二三事

    在写关于仿站文章详情页如何制作之前,我觉得有必要就一些原理性的问题,做一些说明.文章详情页的核心模块和首页有很多相似的地方,比如调用文章的标题.文章的内容.文章分类.作者等,实现起来都差不多,因此,了 ...