reactjs入门到实战(四)---- state详解

this.props 表示那些一旦定义,就不再改变的特性,而 this.state 是会随着用户互动而产生变化的特性。

组件免不了要与用户互动,React 的一大创新,就是将组件看成是一个状态机,一开始有一个初始状态,然后用户互动,导致状态变化,从而触发重新渲染 UI

组件其实是状态机(State Machines)

React 把用户界面当作简单状态机。把用户界面想像成拥有不同状态然后渲染这些状态,可以轻松让用户界面和数据保持一致。

React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM)。React 来决定如何最高效地更新 DOM。

State 工作原理

常用的通知 React 数据变化的方法是调用 setState(data, callback)。这个方法会合并(merge) data 到 this.state,并重新渲染组件。渲染完成后,调用可选的 callback回调。大部分情况下不需要提供 callback,因为 React 会负责把界面更新到最新状态。

哪些组件应该有 State?

大部分组件的工作应该是从 props 里取数据并渲染出来。但是,有时需要对用户输入、服务器请求或者时间变化等作出响应,这时才需要使用 State。

** 尝试把尽可能多的组件无状态化。** 这样做能隔离 state,把它放到最合理的地方,也能减少冗余,同时易于解释程序运作过程。

常用的模式是创建多个只负责渲染数据的无状态(stateless)组件,在它们的上层创建一个有状态(stateful)组件并把它的状态通过 props 传给子级。这个有状态的组件封装了所有用户的交互逻辑,而这些无状态组件则负责声明式地渲染数据。

哪些 应该 作为 State?

State 应该包括那些可能被组件的事件处理器改变并触发用户界面更新的数据。 真实的应用中这种数据一般都很小且能被 JSON 序列化。当创建一个状态化的组件时,想象一下表示它的状态最少需要哪些数据,并只把这些数据存入 this.state。在 render() 里再根据 state 来计算你需要的其它数据。你会发现以这种方式思考和开发程序最终往往是正确的,因为如果在 state 里添加冗余数据或计算所得数据,需要你经常手动保持数据同步,不能让 React 来帮你处理。

哪些 不应该 作为 State?

this.state 应该仅包括能表示用户界面状态所需的最少数据。因此,它不应该包括:

  • 计算所得数据: 不要担心根据 state 来预先计算数据 —— 把所有的计算都放到render() 里更容易保证用户界面和数据的一致性。例如,在 state 里有一个数组(listItems),我们要把数组长度渲染成字符串, 直接在 render() 里使用this.state.listItems.length + ‘ list items‘ 比把它放到 state 里好的多。
  • React 组件: 在 render() 里使用当前 props 和 state 来创建它。
  • 基于 props 的重复数据: 尽可能使用 props 来作为惟一数据来源。把 props 保存到 state 的一个有效的场景是需要知道它以前值的时候,因为未来的 props 可能会变化。
  • 栗子:
  • <div id="example"></div>
            <script type="text/babel">
                var Count = React.createClass({
                    getInitialState:function(){
                        return{
                            count:0
                        }
                    },
    
                    handleClick:function(){
                        this.setState({count:this.state.count + 1});
                    },
    
                    render:function(){
                        return (
                            <div>
                                <a    onClick={this.handleClick}>YOU have clicked {this.state.count} times</a>
                            </div>
                        );
                    }
    
                });
                ReactDOM.render(
                    <Count />,
                    document.getElementById(‘example‘)
                )
            </script>
时间: 2024-10-09 09:01:39

reactjs入门到实战(四)---- state详解的相关文章

下载Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookeeper的Fast Fail 和 Leader选举特性大大增强了分布式集群的稳定和健壮性,并且解决了Master/Slave模式的单点故障重大隐患,这是越来越多的分布式产品如HBase.Storm(流计算).S4(流计算)等强依赖Zookeeper的原因. Zookeeper从入门到精通(开发详解,案

SVN与TortoiseSVN实战:补丁详解

硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支>重点介绍了标签和分支的概念及实际操作演示,关注人数较多,三.四篇<SVN与TortoiseSVN实战:冲突详解(二)>详解了SVN如何判定冲突及冲突文件说明和解决冲突方法. 本篇详细SVN中补丁的概念,版本控制之道这本书对于SVN的讲解比较全面了,但书中也没有

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

Farseer.net轻量级开源框架 入门篇:添加数据详解

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 前面讲的大多数是原理及说明,大家在理解上会比较枯燥,接下来的几篇,倾向于实战,会比较有意思些. 这里的话,还是拿Users实体类来讲解在我们框架的几种添加方式. Insert的几种方式 1 Users info = new Users(); 2 info.UserName = "张三";

Farseer.net轻量级开源框架 入门篇:删除数据详解

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 相对于修改,删除则简单的多: 1 // 字段值指定 加 1 2 Users.Data.Where(o => o.ID == 1).Delete(); 1 Users.Data.Delete(1); 1 var lst = new List<int> { 1, 2, 3, 4, 5 }; 2

Farseer.net轻量级开源框架 入门篇:查询数据详解

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 查询列表的几种方式 1 // 字段值指定 加 1 2 Users.Data.Where(o => o.ID == 1).ToList(); 1 // 查询前10条数据 2 Users.Data.ToList(10); 1 // 批量查询 2 var lst = new List<int> { 1, 2, 3, 4, 5 }; 3 Users.Data.ToL

Farseer.net轻量级开源框架 入门篇:修改数据详解

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 添加数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 删除数据详解 Update的几种方式(基本) 1 Users info = new Users(); 2 info.UserName = "张三"; 3 info.PassWord = "密码"; 4 5 // 指定用户ID为1的的数据进行修改. 6 Users.Data.Wher

Zookeeper从入门到精通(开发详解,案例实战,Web界面监控)

ZooKeeper是Hadoop的开源子项目(Google Chubby的开源实现),它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.命名服务.分布式同步.组服务等. Zookeeper的Fast Fail 和 Leader选举特性大大增强了分布式集群的稳定和健壮性,并且解决了Master/Slave模式的单点故障重大隐患,这是越来越多的分布式产品如HBase.Storm(流计算).S4(流计算)等强依赖Zookeeper的原因. Zookeeper在分布式集群(Hadoop

关于Saltstack核心模块state详解

一.问题背景:  学习使用自动运维工具saltstack的过程中,其中state模块是帮助管理员控制minion达到一个预想的状态.换句话来说,我想让minion能够远程执行命令,自动配置环境文件,软件安装.服务启动.关闭,信息收集等自动化操作,都能通过saltstack的state模块实现.  并且最重要的一个好处就是简单.简洁.方便.引用一段官方文档的话: Simplicity, Simplicity, SimplicityMany of the most powerful and usef

UNIX网络编程入门——TCP客户/服务器程序详解

前言 最近刚开始看APUE和UNP来学习socket套接字编程,因为网络这方面我还没接触过,要等到下学期才上计算机网络这门课,所以我就找了本教材啃了一两天,也算是入了个门. 至于APUE和UNP这两本书,书是好书,网上也说这书是给进入unix网络编程领域初学者的圣经,这个不可置否,但这个初学者,我认为指的是接受过完整计算机本科教育的研究生初学者,需要具有完整计算机系统,体系结构,网络基础知识.基础没打好就上来啃书反而会适得其反,不过对于我来说也没什么关系,因为基础课也都上得差不多了,而且如果书读