【React】归纳篇(四)组件的三大属性之 state | props | refs 属性

简介: 【React】归纳篇(四)组件的三大属性之 state | props | refs 属性

再次来回顾下 :

组件化编码两步走:

  • 1、定义组件(两种方式)
  • 2、渲染组件标签

组件的三大属性之 state 属性(最重要的属性)

state基础(最重要的属性)

  • state是组件对象最重要的属性,其值是对象,即可以包含多个数据
  • 可以通过更新组件的state来更新对应的页面的显示(重新进行组件渲染)

state 操作

  • 初始化状态
constructor(props){
  super(props)
  this.state = { //this是一个组件对象
    stateProp1: value1,
    stateProp2: value2
  }
}
  • 读取某个状态值
this.state.statePropertyName
  • 更新状态,组件界面更新
this.setState({
  stateProp1: value1,
  stateProp2: value2
})

state属性示例–监听点击事件,然后状态改变

1、定义组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="test"></div>
    <script src="https://cdn.bootcss.com/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.bootcss.com/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <script type="text/babel">
       class Myname extends React.Component {
        constructor (props) {
                //调用父类的构造函数
                super(props)
                //1、初始化状态——固定写法
                this.state = {
                    isMyname: true
                  }
                //[注意]将新增的方法中的this强制绑定为组件对象_bind()方法产生一个与handleClick()一样的方法
                this.change = this.change.bind(this)
            }
            //新增自定义方法:内部的this默认不是组件对象,而是undefined
            change () {
                //3、更新状态
               //需要让this指向组件对象
               this.setState({
                isMyname: !this.state.isMyname
              })
            }
            //重写组件类方法
            render () {
                const text = this.state.isMyname ? '我是ImagineCode' : '我是嘻嘻嘻'
                return <h2 onClick={this.change}>{text}</h2>
              }
        }
        ReactDOM.render(<Myname />, document.getElementById('test'))
    </script>
</body>
</html>

组件的三大属性之 props 属性

作用

  • 复用

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="test1"></div>
    <div id="test2"></div>
    <script src="https://cdn.bootcss.com/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.bootcss.com/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <script src="../js/prop-types.js"></script>
    <script type="text/babel">
    //    1、定义组件:方式1
    function Person(props) {
        return (
            <ul>
                <li>name:{props.name}</li>
                <li>age:{props.age}</li>
                <li>sex:{props.sex}</li>
            </ul>
        )
    }
    //方式2:使用类方式定义组件(运行时请将其中一个方式注释)
    class Person extends React.Component { 
        render() {
            return (
                <ul>
                <li>name:{this.props.name}</li>
                <li>age:{this.props.age}</li>
                <li>sex:{this.props.sex}</li>
            </ul>
            )
        }
    }
    //指定默认值
    Person.defaultProps = {
        name:'imaginecode',
        age: 17,
        sex:'woman'
    }
    //指定属性值的类型和必要性--使用prop-types.js库
    Person.propTypes = {
        name:PropTypes.string.isRequired,
        age:PropTypes.number.isRequired,
    }
    // 2、渲染组件标签
    const p1 = {
        name:'imaginecode',
        age: 19,
        sex:'man'
    }
    ReactDOM.render(<Person name={p1.name} age={p1.age} sex={p1.sex} />,document.getElementById('test1'));   
    /* ...的作用,一种语法糖(简洁写法)
        1、打包
        如,function fn(...as) {} fn(1,2,3); //将1,2,3放入as作为数组
        2、解包
        const arr1 = [2,3,4]; const arr2 = [1,...arr1,5]; 
    */
    // ReactDOM.render(<Person name={p1.name} age={p1.age} sex={p1.sex} />,document.getElementById('test1'));//作用等同上面的写法
    const p2 = {
        name:'imaginecode2'
    }
    ReactDOM.render(<Person name={p2.name}/>,document.getElementById('test2'));    
    </script>
</body>
</html>
  • 为组件指定默认属性值,组件属性defaultProps:
Person.defaultProps = {name:''}
  • 对props中的属性值进行类型限制和必要性限制,组件属性propTypes:
    15.5版本后需要引入prop-types库
Person.propTypes = {
  name:PropTypes.string.isRequired,
  age:PropTypes.number.isRequired
}

组件的三大属性之 refs 属性

  • ref用于标识组件内部某个元素
  • refs 是标识集合

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="test1"></div>
    <div id="test2"></div>
    <script src="https://cdn.bootcss.com/react/16.4.0/umd/react.development.js"></script>
    <script src="https://cdn.bootcss.com/react-dom/16.4.0/umd/react-dom.development.js"></script>
    <script src="https://cdn.bootcss.com/babel-standalone/6.26.0/babel.min.js"></script>
    <script src="../js/prop-types.js"></script>
    <script type="text/babel">
        //1、定义组件
        class InputComp extends React.Component {
            constructor(props) {
                super(props)
                //记住:先对自定义函数进行bind操作
                this.showInput = this.showInput.bind(this);
                this.handleBlur = this.handleBlur.bind(this);
            }
            showInput(event) {
                console.log(this);
                alert(this.inputVal.value);
            }
            handleBlur(event) {//利用所有的事件均有一个event属性
                alert(event.target.value);
            }
            render() {
                return(
                    //this.inputVal=input 将当前input绑定到组件对象上。input代表当前这个input元素
                    <div>
                        <input type="text" ref={input => this.inputVal=input}/>
                        <button onClick={this.showInput}>点击获取值</button>
                        <input type="text" placeholder="失去焦点提示内容" onBlur={this.handleBlur}/>
                    </div>
                )
            }
        }
        //2、渲染组件标签
        ReactDOM.render(<InputComp />,document.getElementById('test1'));
    </script>
</body>
</html>

小结组件属性

props 和 state 对于一个组件来讲都是数据的来源,而 state 又可以通过 props 传递给子组件,这像是一个鸡生蛋蛋生鸡的问题:到底谁是数据的源头 ?答案是 state,而且是广义的 state:它可以是 react 组件树中各级组件的 state,也可以是 react 组件树外部由其他 js 数据结构表示的 state。归根结底,props 是用来传导数据的,而 state 是数据改变的源泉。

  • props 来自外部属性
  • states 来自内部状态
  • refs 用于表示组件内某个元素


相关文章
|
1月前
|
前端开发 API
react怎么实现父子组件传值?
react怎么实现父子组件传值?
10 1
|
13天前
|
缓存 前端开发 JavaScript
【亮剑】在React中如何通过点击事件控制组件显示与隐藏,包括基础概念和高级应用
【4月更文挑战第30天】本文介绍了在React中如何通过点击事件控制组件显示与隐藏,包括基础概念和高级应用。使用`useState`钩子和Context API可实现状态驱动的条件渲染,通过CSS类控制组件样式,或利用React Portals在DOM不同位置渲染。性能优化应注意避免不必要的渲染、合理使用Keys、优化事件处理器、使用Memoization及清理资源。测试和验证确保逻辑正确性,以构建动态用户界面并提升应用性能。
|
18天前
|
前端开发 JavaScript 开发者
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(二)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
22 0
|
18天前
|
JavaScript 前端开发 算法
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件(一)
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
17 0
|
18天前
|
存储 前端开发 JavaScript
React的表单处理:受控组件与非受控组件深入解析
【4月更文挑战第25天】React表单处理涉及受控和非受控组件。受控组件通过状态管理表单数据,每次用户输入都触发状态更新,确保数据同步,适合实时交互但可能影响性能。非受控组件不直接管理状态,数据存储在DOM中,简化代码,适用于更新不频繁的场景,但在数据验证和同步上存在挑战。开发者应根据需求灵活选择。
|
18天前
|
前端开发 JavaScript 开发者
React的函数组件与类组件:探索两者之间的区别
【4月更文挑战第25天】React提供函数组件和类组件,两者在语法、状态管理、生命周期和性能优化上有所不同。函数组件简单且易于理解,使用 Hooks 可添加状态管理;类组件支持复杂状态管理和生命周期方法,适用于需要精细控制更新的场景。随着 Hooks 的发展,函数组件功能增强,成为更多开发者的首选。选择组件类型应根据实际需求权衡。
|
18天前
|
设计模式 前端开发 API
React的高阶组件(HOC):使用与设计模式探讨
【4月更文挑战第25天】React的高阶组件(HOC)是一种复用和增强组件的高级模式,它接受组件并返回新组件。非侵入式增强使得HOC能在不修改原有组件代码的情况下添加功能。定义HOC后,将其应用于目标组件并渲染增强后的组件。常见设计模式包括属性代理、控制反转和装饰器。然而,使用时要注意避免滥用,保持命名清晰,关注性能优化。理解并恰当使用HOC能提升React应用的构建效率。
|
19天前
|
前端开发
探索React Hooks:一种全新的组件逻辑管理方式
React Hooks是React 16.8版本引入的一项新功能,它改变了我们编写React组件的方式。本文将从Hooks的起源讲起,逐步分析Hooks的优势,并通过具体示例展示Hooks在组件逻辑管理中的应用,旨在帮助读者更好地理解和运用React Hooks。
|
1月前
|
前端开发
React组件通信:如何优雅地实现组件间的数据传递
React组件通信:如何优雅地实现组件间的数据传递
22 0
|
2月前
react+typescript给state和props定义指定类型
react+typescript给state和props定义指定类型
17 1