zoukankan      html  css  js  c++  java
  • React学习笔记(五)State&声明周期

    React学习笔记(五)

    四、State&声明周期

    275d2297bb6c1a72e02fe698b11d81f8.jpeg

    可以为组件添加“状态(state)”。状态与属性相似,但是状态是私有的,完全受控于当前组件。
    局部状态就是只能用于类(定义为类的组件)的一个功能。

    1. 将函数转换为类

    声明一个类,继承React.Component;创建一个render()方法;使用this.props替换props

    class Clock extends React.Component {
        render() {
            return (
                <div>
                    <h1>Hello, world!</h1>
                    <h2>It is { this.props.date.toLocaleTimeSting() }.</h2>
                </div>
            )
        }
    }
    

    2. 为一个类添加局部状态

    使用状态,就不应该再用this.props,而是this.state

    为类添加一个构造函数来初始化state

    class Clock extends React.Component {
        constructor(props) {
            super(props);
            this.state = { date: new Date() };
        }
        
        render() {
            return (
                <div>
                    <h1>Hello, world!</h1>
                    <h2>It is { this.state.date.toLocaleTimeSting() }.</h2>
                </div>
            )
        }
    }
    
    ReactDOM.render(
        <Clock />,
        document.getElementById('root')
    );
    

    类组件应始终使用props调用基础构造函数。

    3. 将生命周期方法添加到类中

    这里提到两个生命周期钩子函数:

    • 挂载 componentDidMount 当组件输出到DOM后
    • 卸载 componentWillUnmount

    通过this.setState()方法来更新组件局部状态。

    class Clock extends React.Component{
        constructor() {
            ...
        }
    
    
        // 组件挂载 设置定时器
        componentDidMount() {
            this.timer = setInterval(
                () => this.tick(),
                1000
            );
        }
    
        // 组件卸载 清除定时器
        componentWillUnmount() {
            clearInterval(this.timer);
        }
    
        tick() {
            // 更新state
            this.setState({
                date: new Date()
            });
        }
    
        render() {
            return ...
        }
    }
    
    ReactDOM.render(
        <Clock />,
        document.getElementById('root')
    );
    

    4. 正确地使用state

    • 不要直接更新状态;必须调用setState()方法。
    • 同时构造函数是唯一能够初始化state的地方。
    • 状态更新可能是异步的。
    // 使用props和state计算下一个状态
    // @param {Object} prevState 先前的状态
    // @param {Object} props 此次更新被应用时的props
    this.setState((prevState, props) => ({
        counter: prevState.counter + props.increment
    }));
    
    • 状态更新合并。也就是说,调用setState()时,提供的对象是合并至当前状态中。且完全替换这个状态。

    5. 数据自顶向下流动(单向数据流)

    状态应当只有组件本身拥有并设置它;
    但组件可以将其状态作为属性传递给其子组件。也就是说,从该状态导出的任何数据或UI只能影响数中下方的组件。
    这就是单向数据流。

    The end... Last updated by: Jehorn, April 15, 2019, 5:20 PM

  • 相关阅读:
    Android studio 使用flutter插件 运行第一个flutter项目 报错 Warning: License for package Android SDK Build-Tools 28.0.3 not accepted.
    Android 使用GPS获取到经纬度后 无法在Android8.0上使用Geocoder类获取位置信息
    Android 利用 gson 将 json 转成 对象object 集合list
    Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新
    iview组件 eslint校验出错 Parsing error: x-invalid-end-tag
    新建 Vue项目 使用iView报错解决
    Typora 自定义主题 修改左右间距
    Vue 嵌套数组 数组更新视图不更新
    如何在手机设备上实时调试
    通过ReRes让chrome拥有路径映射的autoResponse功能。
  • 原文地址:https://www.cnblogs.com/jehorn/p/10711792.html
Copyright © 2011-2022 走看看