【05】react 之 组件state

1.1.  状态理解

React的数据流:由父节点传递到子节点(由外到内传递),如果顶层组件某个prop改变了,React会向下传递,重新渲染所有使用过该属性的组件。除此之外React 组件内部还具有自己的状态,这些状态只能在组件内部修改。通过与用户的交互(点击),实现不同状态(显示、隐藏、数量增加...),然后渲染UI,让用户界面和数据保持一致。React中只需更新组件的state,然后根据新的 state 重新渲染用户界面。

this.props  属性:由父节点传入到组件内部,只读,不可修改。

this.state   状态:由组件自己创建,可以修改,一般由用户交互产生新的状态(数据)。

1.2.  状态案例

开发一个开关组件,组件有两种状态,开、关。修改状态方式,通过this.setState({}),请勿使用this.state.

<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react-0.14.0.js"></script>
    <script src="../build/react-dom.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="example">
    </div>
    <script type="text/babel">
        class MySwitch extends React.Component{
          constructor(props){
            super(props);
            this.state = {
              isEdit:false  //false :关闭 true:打开
            };
           this.handleClick = this.handleClick.bind(this);
          }
          render(){
            return (<button onClick={this.handleClick}>{this.state.isEdit?‘关闭‘:‘打开‘}</button>)
          }

          handleClick(e){
             this.setState({
               isEdit:!this.state.isEdit
             });
          }
        }
        ReactDOM.render(<MySwitch/>,document.getElementById(‘example‘))
    </script>
  </body>
</html>

1.3.  state与props区别

state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。而组件只能通过 props 来传递数据。

1.4state注意事项

上面已经说明了setState的基本使用。但是 setState 不会立即改变 this.state ,而是挂起状态转换,调用 setState 方法后立即访问 this.state 可能得到的是旧的值。如下面的例子:

setState 方法不会阻塞state更新完毕

第二个 setState 可能还没等待第一次的state更新完毕就开始执行了,所以最后count可能只加了1。

this.setState({
  count: this.state.count + 1
});
this.setState({
  count: this.state.count + 1
});

setState方法还有第二个参数,相当于回调函数:

this.setState({
  count: this.state.count + 1
}, () => {
  this.setState({
    count: this.state.count + 1
  });
});

不过看起来很怪, es6 中可以使用 Promise 更优雅的使用这个函数,封装一下 setState

function setStateAsync(nextState){
  return new Promise(resolve => {
    this.setState(nextState, resolve);
  });
}

上面的例子就可以这样写

async func() {
  ...
  await this.setStateAsync({count: this.state.count + 1});
  await this.setStateAsync({count: this.state.count + 1});
}

顺眼多了。

函数方式

nextState 也可以是一个 function ,称为状态计算函数,结构为 function(state, props) => newState 。这个函数会将每次更新 加入队列 中,执行时通过当前的 state 和 props 来获取新的 state 。那么上面的例子就可以这样写

this.setState((state, props) => {
  return {count: state.count + 1};
});
this.setState((state, props) => {
  return {count: state.count + 1};
});

每次更新时都会提取出当前的state,进行运算得到新的state,就保证了数据的同步更新。

控制渲染

默认调用 setState 都会重新渲染视图,但是通过 shouldComponentUpdate() 函数返回 false来避免重新渲染。

如果可变对象无法在 shouldComponentUpdate() 函数中实现条件渲染,则需要控制 newState与 prevState 不同时才调用 setState 来避免不必要的重新渲染。

时间: 2024-10-10 08:23:40

【05】react 之 组件state的相关文章

react常见组件问题Can&#39;t perform a React state update on an unmounted component

在些react组件的时候,会有这个警告 Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method” 这是因为在写一

React学习—组件

一.定义 组件就像JavaScript的函数.组件可以接收任意输入(称为"props"), 并返回 React 元素,用以描述屏幕显示内容. 二.组件的分类 1.函数式组件(无状态组件) 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到要state状态的操作.在大部分React代码中,大多数组件被写成无状态的组件,通过简单组合可以构建成其他的组件等:这种通过多个简单然后合并成一个大应用的设计模式被提倡. function Welcome(props) { re

Android React Native组件的生命周期及回调函数

熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开发中,React Native组件的生命周期,大致分为三个阶段,分别是: 1.组件第一次绘制阶段,这个阶段主要是组件的加载和初始化: 2.组件在运行和交互阶段,这个阶段组件可以处理用户交互,或者接收事件更新界面: 3.组件卸载消亡的阶段,这个阶段主要是组件的清理工作. 在Android React

React Native组件生命周期

概述 所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解空间的生命周期,是开发中必须掌握的一个知识点.就像 Android 开发中组件 一样,React Native的组件也有生命周期(Lifecycle). React Native组件的生命周期大致上可以划分为实例化阶段.存在阶段和销毁阶段.我们只有在理解组件生命周期的基础上,才能开发出高性能的app. React Native中组件的生命周期大致可以用以下图表示: 如图: 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,

React Native组件之Switch和Picker和Slide

React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性如下: /** * Sample React Native App * https://github.com/facebook/react-native * 周少停 2016-09-28 * Switch 开关组件 Picker 选择器 和slide 进度条 */ import React, { C

React Native组件之ScrollView

React Native组件ScrollView类似于iOS中的UIScrollView.其使用方法和属性如下: /** * Sample React Native App * https://github.com/facebook/react-native * 周少停 ScrollView 的常用属性 * 2016-09-19 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text,

react-webpack,react中组件生命周期简单展示

首先配置下webpack.config.js module.exports={ entry:{ demo:'./app/app.js' }, output:{ path:__dirname+'/build', filename:'[name].js', library:'game', libraryTarget:'umd' }, module:{ loaders:[ { test:/\.js$/, loader:'jsx-loader' } ] } } 入口文件entry,整合js后输出outp

React入门---属性(state)-7

state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: 1.state先初始化,在React中,每一个类跟所有的面向对象的函数一样,都有一个构造函数叫constructor. 2.将state的初始化放在constructor()里面. export default class BodyIndex extends React.Component{ //将state

react 编写组件 五

看以下示例了解如何定义一个组件 // 定义一个组件LikeButton var LikeButton = React.createClass({ // 给state定义初始值 getInitialState: function() { return {liked: true}; }, // click事件的处理函数 handleClick: function(event) { this.setState({liked: !this.state.liked}); }, render: functi