在React当中,当你更新组件的state,然后新的state就会重新渲染到页面中。在这个时候不需要你操作任何DOM。你也可以认为组件在React当中是一个状态机(State Machines)。当用户进行操作时会实现不同的状态,然后再渲染到你的页面中,让你的页面与数据始终保持一致。
如何定义State
定义一个合适的State,是正确创建组件的第一步。State必须能代表一个组件UI呈现的完整状态集,即组件的任何UI改变,都可以从State的变化中反映出来;同时,State还必须是代表一个组件UI呈现的最小状态集,即State中的所有状态都是用于反映组件UI的变化,没有任何多余的状态,也不需要通过其他状态计算而来的中间状态。
组件中用到的一个变量是不是应该作为组件State,可以通过下面的4条依据进行判断:
1.这个变量是否是通过Props从父组件中获取?如果是,那么它不是一个状态。
2.这个变量是否在组件的整个生命周期中都保持不变?如果是,那么它不是一个状态。
3.这个变量是否可以通过其他状态(State)或者属性(Props)计算得到?如果是,那么它不是一个状态。
4.这个变量是否在组件的render方法中使用?如果不是,那么它不是一个状态。这种情况下,这个变量更适合定义为组件的一个普通属性,例如组件中用到的定时器,就应该直接定义为this.timer,而不是this.state.timer。
如果对状态不好理解的朋友,你可以认为状态即是数据!
State 与 Props 区别
props 是组件对外的接口,state 是组件对内的接口。组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下层组件需要使用上层组件的数据或方法,上层组件就可以通过下层组件的props属性进行传递,因此props是组件对外的接口。组件除了使用上层组件传递的数据外,自身也可能需要维护管理数据,这就是组件对内的接口state。根据对外接口props 和对内接口state,组件计算出对应界面的UI。
主要区别:
现在我们先来通过ES6类React.Component完成一个通过点击按钮对DIV进行显示与隐藏的操作,效果如下:
咱们先将页面进行初始化:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #myDiv{ width:200px; height:400px; background:red; color:yellow; border:1px solid green; } </style> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react-dom.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/babel.min_.js"></script> </head> <body> <div id="wrap"></div> </body> <script type="text/babel"> class MyComponent extends React.Component{ constructor(props){ super(props); // 为当前状态添加isShow属性 this.state={ // 值为true显示,false为隐藏。默认值为true。 isShow:true } } render(){ //返回组件的初始内容 return <div> <input type="button" value="显示与隐藏"/> <div id="myDiv">我在这里呀!</div> </div> } } ReactDOM.render( <MyComponent/>, document.querySelector("#wrap") ) </script> </html>
到目前为止,页面已经初始化完毕了。在上面的代码中为state添加了一个默认值为true的属性isShow。isShow用来控制div的显示与隐藏!当isShow为true时显示,为false时隐藏
接下来要完成的二件事。
第一件事是要为按钮增加一个点击事件,事件与changeState方法进行绑定。当点击按钮时改变isShow的状态,也就是要为 isShow进行取反操作。
注意:
1、onClick中的c要大写。
2、onClick后跟的方法不要用引号包裹,而是用{}
3、在ES6的class中React是不会自动绑定this的,所以需要自己通过bind绑定。
4、changeState方法中,不能直接修改isShow的值,而是需要借助setState方法来进行设置。
第二件事是要为id为myDiv的DIV增加一个style属性,该属性要根据isShow的状态来对DIV进行显示与隐藏
注意:
1、style的值不要用双引号,而是用{},否则会报错
最终版代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #myDiv{ width:200px; height:400px; background:red; color:yellow; border:1px solid green; } </style> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/react-dom.development.js"></script> <script src="https://zhangpeiyue.com/wp-content/uploads/2018/08/babel.min_.js"></script> </head> <body> <div id="wrap"></div> </body> <script type="text/babel"> class MyComponent extends React.Component{ constructor(props){ super(props); // 为当前状态添加isShow属性 this.state={ // 值为true显示,false为隐藏。默认值为true。 isShow:true } } changeState(){ //此处不能直接修改isShow的值。而是需要借助setState方法! this.setState({ //取反操作 isShow:!this.state.isShow }); } render(){ //返回组件的初始内容 return <div> {/*在ES6的class中React是不会自动绑定this的,所以需要自己绑定*/} <input type="button" value="显示与隐藏" onClick={this.changeState.bind(this)} /> <div id="myDiv" style={{display:this.state.isShow?'block':'none'}}> 我在这里呀! </div> </div> } } ReactDOM.render( <MyComponent/>, document.querySelector("#wrap") ) </script> </html>
由上面的示例可以发现,当你改变isShow的状态时,div也会发生相对应的变化!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍浅谈React组件之性能优化,包括了浅谈React组件之性能优化的使用技巧和注意事项,需要的朋友参考一下 高德纳: "我们应该忘记忽略很小的性能优化,可以说97%的情况下,过早的优化是万恶之源,而我们应该关心对性能影响最关键的另外3%的代码。" 不要将性能优化的精力浪费在对整体性能提高不大的代码上,而对性能有关键影响的部分,优化并不嫌早。因为,对性能影响最关键的部分,往往涉及解决方案
本文向大家介绍浅谈react 同构之样式直出,包括了浅谈react 同构之样式直出的使用技巧和注意事项,需要的朋友参考一下 前言 上文讲到通过同构服务端渲染,可以直出html结构,虽然讲解了样式,图片等静态资源在服务端引入问题的解决方案,但是并没有实际进行相关操作,这篇文章就讲解一下如何让样式像html一样直出。 PS: 直出,我的理解就是输入url发起get请求访问服务端,直接得到完整响应结果,
主要内容:React 实例,React 实例,React 实例,React 实例React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。 React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。 以下实例创建一个名称扩展为 React.Component 的 ES6 类,在 render() 方法中使用 this.state 来修改当前的时
本文向大家介绍浅谈JS之tagNaem和nodeName,包括了浅谈JS之tagNaem和nodeName的使用技巧和注意事项,需要的朋友参考一下 nodeName是节点的属性,tagName是元素的属性。元素是节点的子集。不是任何节点都有tagName的,比如文本节点,仅有nodeName属性。 这个和css中的倾斜和斜体的关系是一样的。不是所有元素都有斜体的,但是都能倾斜。 以上这篇浅谈JS之
本文向大家介绍浅谈python之新式类,包括了浅谈python之新式类的使用技巧和注意事项,需要的朋友参考一下 前言 本文中代码运行的python版本一律采取2.7.13 科普: 经典类:classic class 新式类:new-style class python2.2 之前并没有新式类 python2.2-2.7 新式类与经典类并存, 默认使用经典类, 除非显式继承object python
本文向大家介绍浅谈React Native Flexbox布局(小结),包括了浅谈React Native Flexbox布局(小结)的使用技巧和注意事项,需要的朋友参考一下 Flex 是 Flexible Box 的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 基本概念 采用 Flex 布局的元素,称为 Flex 容器(flex container),简称”容器”。它的所有子元素自动