zoukankan      html  css  js  c++  java
  • React中的三大属性

    一、前言:

      属性1:state

      属性2:props

      属性3:ref 与事件处理

    二、主要内容:

    属性1:state

      1,认识:

        1) state 是组件对象中最重要的属性,值是一个对象(可以包含多个数组,有点像vue中的data属性)

          2)组件被称为“状态机”,通过更新组件的state来更新对应的页面显示

      2,操作state通常要经历三个状态

    1) 初始化状态:
    constructor (props) {
       super(props)
       this.state = {
            stateProp1 : value1,
            stateProp2 : value2
       }
    }
    
    2) 读取某个状态值
    this.state.statePropertyName
    
    3) 更新状态---->组件界面更新
    this.setState({
    stateProp1 : value1,
    stateProp2 : value2
    })

       3,案例演示

        

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <div id="obj"></div>
        <script type="text/javascript" src="./js/react.development.js"></script>
        <script type="text/javascript" src="./js/react-dom.development.js"></script>
        <script type="text/javascript" src="./js/babel.min.js"></script>
        <script type="text/babel">
            
                    //自定义Like组件
            class Like extends React.Component{
                       //定义初始化状态
                constructor(props){
                super(props)  //交给父类去执行
                this.state={  //定义state属性,并添加一个isLikeMe数据
                isLikeMe:false
    
               }
                       
                       //强制绑定,让函数handleClick等于当前组件
               this.handleClick= this.handleClick.bind(this)
    
               }
                       //定义操作函数,注意函数里面的this是undefined
     
               handleClick(){
                       //更新state状态
               const isLikeMe = !this.state.isLikeMe  
               this.setState({
               isLikeMe
               })
    
               }
    
               render(){
                       //读取状态
               const {isLikeMe} = this.state
               return <h1 onClick={this.handleClick}>{isLikeMe ? '我喜欢你':'你喜欢我'}</h1>
    
               }
    
            }
    
    
              //渲染
            ReactDOM.render(<Like />, document.getElementById('obj'))
        </script>
    </body>
    </html>

       4,注意点:

         1)更新 state 状态定义的函数里面的 this 不是指向当前对象的,需要用 bind 强制绑定this为当前组件

         2)强制绑定 this : this.handleClick = this.handleClick.bind(this)

    属性1:props

      1,理解:

        1) 每个组件对象都会有 props 属性

        2)组件标签中所以的属性都保存在 props 中

      2,作用:

       1)通过标签属性从组件外向组件内传递变化的数据

          2)组件内部不需要修改 props 数据

      3,props 的操作:

    //1)内部读取某个属性值
    
    this.props.propertyName
    
    
    //2) 对props中的属性值进行类型限制和必要性限制
    
    方法一:新版本中已经被弃用
    Person组件名:
    Person.propTypes={
    
           name: React.PropTypes.string.isRequired,
           age:React.PropTypes.number.isRequired
    }
    
    方法二:
    需要用到prop-types.js文件
    Person.propTypes={
             name:PropTypes.string.isRequired
    
            }
    
    //3)扩展属性:对象的所有属性通过props传递
    <Person {...person} />   //默认传递了所有属性
    
    
    //4)默认属性值
    Person.defaultProps = {
    
         name:"Mary"
    
    }
    
    
    //5)组件类的构造函数,
    constructor(props){
    
         super(props)
        console.log(props)//里面存放所有属性
    
    
    }

       4,举例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <div id="ul"></div>
        <script type="text/javascript" src="./js/react.development.js"></script>
        <script type="text/javascript" src="./js/react-dom.development.js"></script>
        <script type="text/javascript" src="./js/prop-types.js"></script>
        <script type="text/javascript" src="./js/babel.min.js"></script>
        <script type="text/babel">
            
            function List(props){
    
            return (
            <ul>
            <li>姓名:{props.name}</li>
            <li>年龄: {props.age}</li>
            <li>性别:{props.sex}</li>
            </ul>
    
            )
    
            }
            
            const person ={
            name:'xxm',
            age:18,
            sex:''
            }
        
           //设置默认属性    
            List.defaultProps={
    
            age:55,
            sex:""
    
            }
    
            //对类型进行限制和必要性限制
             List.propTypes={
             name:PropTypes.string.isRequired
    
            }
             //使用扩展属性
            ReactDOM.render(<List {...person}/>, document.getElementById('ul'))
        </script>
    </body>
    </html>  

     属性3:ref与事件处理

      1,理解:

        1)组件内的标签都可以定义 ref 属性来标识自己

         2)在组件中可以通过 this.msglnput 来的到真实的 DOM 元素

         3)作用:通过 ref 获取组件特定的标签对象,进行读取相关数据

    //ref使用方式一:
    
    <input type="text" ref="content"/>
    
    
    //ref使用方式二:
    <input type="text" ref={input=>this.input=input}/>
    
    //input=>this.input=input 的含义是将当前的input 赋值给组件里面的input

       2,事件处理  

         1)通过onXxx属性指定组件的事件处理函数

                2)React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)

                3)通过event.target可以得到发生事件的DOM元素

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <div id="obj1"></div>
        <script type="text/javascript" src="./js/react.development.js"></script>
        <script type="text/javascript" src="./js/react-dom.development.js"></script>
        <script type="text/javascript" src="./js/prop-types.js"></script>
        <script type="text/javascript" src="./js/babel.min.js"></script>
        <script type="text/babel">
            
            class MyComponent extends React.Component{
    
            constructor(props){
            super(props)
                     //给处理函数强制绑定this
            this.handleClick=this.handleClick.bind(this)
            this.handleBlur = this.handleBlur.bind(this)
    
            }
    
    
            handleClick(){
    
            alert(this.input.value)
    
    
            }
    
            handleBlur(event){
    
              alert(event.target.value)
            }
    
            render(){
    
            return (
                  <div>
                      <input type="text" ref="content"/>
                      <input type="text" ref={input=>this.input=input}/>
                      <button onClick={this.handleClick}>点击按钮</button>
                      <input  type="text" placeholder="请输入数据" onBlur={this.handleBlur} />
                  </div>
            )
    
            }
    
            }
    
            
    
            ReactDOM.render(<MyComponent />, document.getElementById("obj1"))
        </script>
    </body>
    </html>

     三,总结

      React中props和state都是存储数据的区别如下

        1)state: 组件自身内部可变化的数据

        2)props: 从组件外部向组件内部传递数据,组件内部只读取不修改

      注意点:

        1)组件内置的方法中的this为组件对象,z

        2) 在组件类中自定义的处理函数方法的this默认为null 所以需要强制绑定

  • 相关阅读:
    前端笔记之JavaScript(六)让人头疼的正则表达式
    前端笔记之JavaScript(五)关于数组和字符串那点事
    前端笔记之JavaScript(四)关于函数、作用域、闭包那点事
    前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
    前端笔记之JavaScript(二)关于运算符&初识条件判断语句
    前端笔记之CSS(下)浮动&BFC&定位&Hack
    前端笔记之CSS(上)语法&文本属性&块/行内元素&选择器&盒模型
    artTemplate--使用artTemplate时,由于json对象属性有数字命名格式 导致调用报错 syntax error
    多线程--做单元测试时,使用线程池发现并没有运行指定代码,直接跳过
    JSP-导入taglib 出现classNotFound异常
  • 原文地址:https://www.cnblogs.com/xiaotaiyangye/p/11469254.html
Copyright © 2011-2022 走看看