每天学点React - 组件实例的三大核心属性之一 - state

100 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

组件实例的三大核心属性之一 - state

state

在上一篇文章中提到了 【简单组件】 以及 【复杂组件】,在官方文档中,简单组件React 组件使用一个名为 render() 的方法,接收输入的数据并返回需要展示的内容。在示例中这种类似 XML 的写法被称为 JSX。被传入的数据可在组件中通过 this.props 在 render() 访问。

复杂组件,则是有状态的,内部需要维护 state 属性来控制访问,当组件的状态数据改变时,组件会再次调用 render() 方法重新渲染对应的标记。

注意事项:

  1. 组件中render方法中的this为组件实例对象;
  2. 组件自定义方法中的thisundefined,解决方法: 1)强制绑定this,通过函数对象的bind(); 2)箭头函数
  3. 状态数据,不能直接修改或更新

案例

通过点击事件控制state改变,使得组件重新渲染。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 测试容器 -->
    <div id="test"></div>

    <!-- 加载 React 核心库 -->
    <script type="text/javascript" src="../js/react.development.js"></script>
    <!-- 加载 React DOM 用于支持 React 操作 DOM -->
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <!-- 加载 babel 用于将 jsx 转为 js -->
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <!-- 设置类型为babel -->
    <script type="text/babel">
        // 创建组件
        class Weather extends React.Component{

            // 初始化状态
            state = {isHot: false}

            constructor(props){
                super(props)
                // 强制绑定 this
                // this.changeWeather = this.changeWeather.bind(this)
            }

            render(){
                console.log('Weather.render(): ', this)
                return <h1 onClick={this.changeWeather}>今天天气很{this.state.isHot ? '炎热' : '凉爽'}</h1>
            }

            // 使用箭头函数简化
            changeWeather = () => {
                const isHot = this.state.isHot
                this.setState({isHot: !isHot})
            }
        }

        // 将组件渲染到页面
        ReactDOM.render(<Weather/>, document.getElementById('test'))
    </script>
</body>
</html>