setState和lazyLoad懒加载

1. setState和lazyLoad懒加载

1.1 setState

setState更新状态的2种写法

	(1). setState(stateChange, [callback])------对象式的setState
            1.stateChange为状态改变对象(该对象可以体现出状态的更改)
            2.callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用
					
	(2). setState(updater, [callback])------函数式的setState
            1.updater为返回stateChange对象的函数。
            2.updater可以接收到state和props。
            4.callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
总结:
		1.对象式的setState是函数式的setState的简写方式(语法糖)
		2.使用原则:
				(1).如果新状态不依赖于原状态 ===> 使用对象方式
				(2).如果新状态依赖于原状态 ===> 使用函数方式
				(3).如果需要在setState()执行后获取最新的状态数据, 
					要在第二个callback函数中读取

例子

class Demo extends Component {

    state = {count:0}

    add = () => {
        /*
        // 对象式的setState
        // 1.读取原来的count值
        const {count} = this.state
        // 2.更新状态(异步)
        this.setState(
            {count: count+1},
            // 此回调函数是在状态更新完render之后调用
            ()=>{
                console.log('调setState后的输出', this.state.count)  // 1
            })
        // console.log('调setState后的输出', this.state.count)  // 0
        */

        // 函数式的setState
        this.setState(
            (state,props)=>({count:state.count+1}),
        )

    }

    render() {
        return (
            <div>
                   <h2>当前求和为:{this.state.count}</h2>
                    <button onClick={this.add}>点我+1</button>
            </div>
        );
    }
}

1.2 lazyLoad懒加载

懒加载是为了提升性能,在你点击点击某个组件的时候才给你加载组件,而不是一开始刷新就将所有的组件都加载出来。就是需要的时候才加载。

import React, {Component,lazy,Suspense} from 'react';
import {NavLink, Route} from "react-router-dom";

//1.通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包
const About = lazy(()=>import('./About'))
const Home = lazy(()=> import('./Home'))

class Demo extends Component {
    render() {
        return (
            <div>
                <div>
                    <div className="row">
                        <div className="col-xs-offset-2 col-xs-8">
                            <div className="page-header"><h2>React Router Demo</h2></div>
                        </div>
                    </div>
                    <div className="row">
                        <div className="col-xs-2 col-xs-offset-2">
                            <div className="list-group">
                                {/*原生html中,靠a标签跳转不同的页面*/}
                                {/*<a className="list-group-item active" href="./about.html">About</a>*/}
                                {/*<a className="list-group-item" href="./home.html">Home</a>*/}

                                {/*原生React中,靠路由链接实现切换组件---编写路由链接*/}
                                <NavLink className="list-group-item" to='/about'>About</NavLink>
                                <NavLink className="list-group-item" to='/home'>Home</NavLink>

                            </div>
                        </div>
                        <div className="col-xs-6">
                            <div className="panel">
                                <div className="panel-body">
                                    {/*2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面*/}
                                    <Suspense fallback={<h1 style={{backgroundColor:'gray',color:'orange'}}>Loading</h1>}>
                                        {/*  注册路由  */}
                                        <Route path='/about' component={About}/>
                                        <Route path='/home' component={Home}/>
                                    </Suspense>

                                </div>
                            </div>
                        </div>
                    </div>
                </div>

            </div>
        )
    }
}

posted @ 2021-09-03 16:47  tomjoy  阅读(62)  评论(0编辑  收藏  举报