以下内容均为个人理解。

1.state:

在react中,state可以看成管理页面状态的集合(实则一个对象而已),库里面的成员均为页面渲染变量,整个页面为一个状态机,当state发生变化时,页面会重新渲染,页面随state变化而变化。

2.state如何正确使用:

const eventsArr = [
'handleText1Change',
'handleText2Change',
'handleText3Change'
]; const EmptyString = ""; class Dome extends React.Component {
constructor(props) {
super(props);
this.state = {
text1: EmptyString,
text2: EmptyString,
text3: EmptyString,
flag: true
};
this.setBindFunc();
}; setBindFunc() {
eventsArr.forEach(ev => {
this[ev] = this[ev].bind(this);
})
}; handleText1Change(e) {
this.setState({
text1: e.target.value
});
}; handleText2Change(e) {
this.state.text2 = e.target.value;
this.setState({});
}; handleText3Change(e) {
this.setState({
text3: e.tarege.value
}, () => {
this.state.flag = false;
})
}; render() {
return <div>
<input type='text' value={this.state.text1} onChange={this.handleText1Change} />
<input type='text' value={this.state.text2} onChange={this.handleText2Change} />
<input type='text' value={this.state.text3} onChange={this.handleText3Change} />
</div>
};
};

state控制页面渲染,但是只给state赋值是不会导致页面刷新的,只有调用this.setState({})方法后才会执行render方法,最后导致页面重新渲染。

第一种写法:

this.setState({text1: e.target.value})为最常规的写法,执行完此方法之后会执行render方法,刷新state中的text1值。但是这里有个问题就是this.setState({})本身作为异步函数,赋值与渲染上会有先后问题,

在执行this.setState({text1: e.target.value})这个方法是,实际上this.state.text1的值没有改变。当走到render里面的时候this.state.text1的值才会发生改变,render内原则不可以写过多的赋值逻辑,如何解决呢产生方法二。

第二种写法:

this.state.text2 = e.target.value; 这种赋值可以直接改变this.state.text2的值,然后调用this.setState({})重新渲染页面,这种方式不会存在异步问题(只要调用this.setState({}),render函数是必然会走的,除非使用

shouldComponentUpdate来加以限制)。

第三种写法:

this.setState({},()=>{})这种赋值与第一种一样,主要侧重在回调函数上,回调函数是在执行完render后执行,回调函数内可以写逻辑,我们拿个简单的赋值举例。这种方式可以控制组件渲染的先后顺序。

1.props:

props是组件之间传递数据的媒介。那么在使用props时应该注意哪些。

 const
eventsArr = [
'handleText1Change',
'handleText2Change',
'handleText3Change',
'handleText4Change'
]; const EmptyString = ""; class Dome extends React.Component {
constructor(props) {
super(props);
this.state = {
text1: EmptyString,
text2: EmptyString,
text3: EmptyString,
text4: EmptyString,
obj: {
value: EmptyString
},
flag: true
};
this.setBindFunc();
}; setBindFunc() {
eventsArr.forEach(ev => {
this[ev] = this[ev].bind(this);
})
}; handleText1Change(e) {
this.setState({
text1: e.target.value
});
}; handleText2Change(e) {
this.state.text2 = e.target.value;
this.setState({});
}; handleText3Change(e) {
this.setState({
text3: e.tarege.value
}, () => {
this.state.flag = false;
})
}; handleText4Change(oldValue, newValue) {
this.state.text4 = newValue;
}; render() {
return <div>
<input type='text' value={this.state.text1} onChange={this.handleText1Change} />
<input type='text' value={this.state.text2} onChange={this.handleText2Change} />
<input type='text' value={this.state.text3} onChange={this.handleText3Change} />
<DomeChildren
text4={this.state.text4}
obj={this.state.obj}
handleText4Change={this.handleText4Change}
/>
</div>
};
}; const
Constants = {
Click: 'Click'
}; class DomeChildren extends React.Component() {
constructor(props) {
super(props);
this.state = {
text: this.props.text4,
obj: this.props.obj
};
}; handleText4Change(e) {
let
oldValue = this.state.text,
newValue = e.target.value;
this.state.text = newValue;
this.setState({});
this.props.handleText4Change(oldValue, newValue);
}; handleClick() {
//仅做例子用
this.props.text4 = "Dqhan";
this.props.obj.value = 10086;
} render() {
return <div>
<input type='text' value={this.state.text} handleText4Change={this.handleText4Change.bind(this)} />
<div onClick={this.handleClick.bind(this)}>{Constants.Click}</div>
</div>;
};
};

首先props是用于组件之间传递信息的,比如父组件Dome传递给子组件DomeChildren了text4,obj跟一个方法handleText4Change,这里我们达到了props作用的目的,当子组件内执行handleText4Change,改变了DemoChildren里面的text值同时渲染该组件,这里没有影响到Demo,同时DomeChildren将oldValue与newValue通过传递的handleText4Change方法暴露给了Demo,达到了父给子传递,子给父传递的,子组件渲染没有影响到父级的目的,我理解这是最正确的传递方式以及组件之间的关系。当执行handleClick方法时,可以看到代码执行this.props.text4="Dqhan"时react会报错,这说明props是不可以改变的,但是this.props.obj.value = 10086没有报错,很明显,因为obj是对象,这里我理解为,只要物理地址没有变,react就会认为是props没有改变,不然很多地方用到了数组就没招了。总结:props中简单类型不能改变,引用类型内部的属性可以改变。

补充一下,创建组件时用的ES6语法class关键字,熟悉服务器语言的都知道,一个类是通常情况下实例化然后才能使用的(除工具类等),而react中<Demo />便是实例化这个组件(react自己封装的)得出一个对象。

React中props与state的更多相关文章

  1. React中Props 和 State用法

    React中Props 和 State用法 1.本质 一句话概括,props 是组件对外的接口,state 是组件对内的接口.组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下 ...

  2. React中props和state相同点和不同点

    朋友们,我想死你们了,最近这几天忙着和病魔作斗争所以没怎么写博客,今天感觉好点了,赶紧来写一波,就是这木敬业. 今天我们来讨论讨论props和state相同点和不同点 首先我来概要说明一下这两者 pr ...

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

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

  4. react中 props,state,render函数的关系

    1.当组件的 state 或者 props 发生改变的时候,自己的render函数就会重新执行. 2. 当父组件的render函数执行时,其所有子组件的render函数都会重新执行.

  5. React中props

    今天让我们开启新的篇章好吧,来搞一搞React,以下所有操作都是我个人的一些理解,如果有错吴还请指出,想要看更全的可以去React官网可能一下子好吧 昨天按摩没到位,导致今天身体不太行,撸码千万别苦了 ...

  6. React react-redux props或state更新视图无法重新渲染问题

    记录学习React时自己是如何挖坑把自己埋了的过程:children以及其它props被修改时相关组件无法重新渲染(做了两天) 父组件代码: class UserHome extends Compon ...

  7. React中props.children和React.Children的区别

    在React中,当涉及组件嵌套,在父组件中使用props.children把所有子组件显示出来.如下: function ParentComponent(props){ return ( <di ...

  8. react中 props,state与render函数的关系

    我们很明显的能够感受到,react是一门数据驱动的框架,当数据发生变化,页面就会自动发生变化,他背后的原理是怎么样子的呢 比如todolist例子里面,inputValue变了,框里面的内容就会自动变 ...

  9. React之props、state和render函数的关系

    1.当组件中的state或者props发生改变的的时候,render函数就会被重新执行 2.当父组件的render函数被运行时,它的子组件的render都将被重新运行一次 3.子组件作为父组件里的一个 ...

随机推荐

  1. &lt;图形图像,动画,多媒体&gt; 读书笔记 --- AirPlay

    AirPlay技术是之前一直没有接触过的技术,正好这次做一个笔记 共用: 1.能够通过AirPlay将iOS和MAC设备上的视频或音频输出到高清电视上或高保真音响 2.能够通过AirPlay将iOS和 ...

  2. CentOS的字符集locale的设置

    LANGLC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值.类似于 LC_ALL. LC_ALL它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值.注意,LANG的值不受该 ...

  3. vim-snipmate编写snippet的语法

    vim-snipmate真的很好用,以前好多编写代码的问题得到完美的解决.还附带提升我对vim的理解和信心,在这里感谢一下作者.thank you. 1.现说一下我浓缩的重要语法. 1.定义是下面这样 ...

  4. Javascript玩转继承(二)

    对象伪装来实现继承.在这里先来说一下这种方式的优缺点 这种方式是比较容易理解的,在子类中调用父类的构造函数.另外,这种方法最大的一个优点就是说构造继承可以实现多继承,复习下这个代码: function ...

  5. cocos2d-x开发记录:二,基本概念(导演,场景,层和精灵,场景切换,效果)

    四,Director Scene Layer和Sprite(导演,场景,层和精灵) 1.Scenes(场景) 一个场景 (用CCScene对象实现)相当于APP工作流的独立部分.一些人也喜欢叫做“屏幕 ...

  6. 写个关于使用cocostudio Armature实现动画自由切换的小demo

    这是一个关于使用cocostudio实现动画自由切换的小demo auto sprite =Sprite::create("background.png"); sprite-> ...

  7. CCRepeatForever和CCDelayTime

    有限次执行一组动作和无限次执行一组动作 void ActionRotateJerk::onEnter() { ActionsDemo::onEnter(); centerSprites(); CCFi ...

  8. 李洪强iOS开发之FMDB线程安全的用法

    // //  ViewController.m //  04 - FMDB线程安全的用法 // //  Created by 李洪强 on 2017/6/6. //  Copyright © 2017 ...

  9. jquery,checkbox无法用attr()二次勾选

    今晨,漂亮的测试妹妹提了个奇怪的bug,说我一功能checkbox时隐时现,比如第一次打开有勾选,第n次打开可能就不选了. 想到与美女有亲密接触机会,马上鸡动起来. 经过偶层层抽次剥茧(da da j ...

  10. 关于Snmp的Trap代码开发之坑

    最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...