【React】知识点归纳:组件三大属性 state、props、refs与事件处理

版权声明:Dream_Lees Blog https://blog.csdn.net/qq_41846861/article/details/86584146

1.state

理解

1)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
})

源代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>07_component_state</title>
</head>
<body>

<div id="example"></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">
  /*
  需求: 自定义组件, 功能说明如下
    1. 显示h2标题, 初始文本为: 你喜欢我
    2. 点击标题更新为: 我喜欢你
  */

  //定义组件
  class Like extends React.Component{
    constructor(props){
      super(props)
      //初始化状态
      this.state = {
        isLikeMe: false
      }
      //将新曾方法中this强制绑定为组件对象
      this.handleClick = this.handleClick.bind(this)
    }
    //新添加方法:内部this默认不是组件对象
    handleClick (){
      //获取状态并取反
      console.log(this)
      const isLikeMe = !this.state.isLikeMe
      //更新状态 传对象
      this.setState({
        isLikeMe  //中括号内本应是isLikeMe:isLikeMe 前后一样 可省略
      })
    }
    //重写组件类方法
    render (){
      //读取状态
      //const isLikeMe = this.state.isLikeMe 等同下
      const {isLikeMe} = this.state
      //绑定事件监听
      return<h2 onClick={this.handleClick}>{isLikeMe?'你喜欢我':'我喜欢你'}</h2>
      //或者下边绑定 但是效率低 要多次bind绑定this
     // return<h2 onClick={this.handleClick.bind(this)}>{isLikeMe?'你喜欢我':'我喜欢你'}</h2>
    }
  }
  //渲染组件标签
  ReactDOM.render(<Like />,document.getElementById('example'))
</script>
</body>
</html>

效果:点击 我喜欢你 -->你喜欢我
在这里插入图片描述
在这里插入图片描述

2.props

效果
  • 需求: 自定义用来显示一个人员信息的组件
    1). 姓名必须指定
    2). 如果性别没有指定, 默认为男
    3). 如果年龄没有指定, 默认为18
理解

1)每个组件对象都会有props(properties的简写)属性
2)组件标签的所有属性都保存在props中

作用

1)通过标签属性从组件外向组件内传递变化的数据
2)注意: 组件内部不要修改props数据

编码操作

1)内部读取某个属性值

this.props.propertyName

2)对props中的属性值进行类型限制和必要性限制

Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number.isRequired
}

3)扩展属性: 将对象的所有属性通过props传递

<Person {...person}/>

4)默认属性值

Person.defaultProps = {
name: 'Mary'
}

5)组件类的构造函数

constructor (props) {
super(props)
console.log(props) // 查看所有属性
}

源代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>04_component_props</title>
</head>
<body>

<div id="example1"></div>
<div id="example2"></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/javascript" src="../js/prop-types.js"></script>

<script type="text/babel">

  /*
需求: 自定义用来显示一个人员信息的组件, 效果如页面. 说明
  1). 如果性别没有指定, 默认为男
  2). 如果年龄没有指定, 默认为18*/
  //定义组件
//  function Person(props) {
//   return(
//           <ul>
//             <li>姓名:{props.name}</li>
//             <li>年龄:{props.age}</li>
//             <li>性别:{props.sex}</li>
//           </ul>
//   )
// }
  class Person extends React.Component{
    render(){
      console.log(this)
      return(
              <ul>
                <li>姓名:{this.props.name}</li>
                <li>年龄:{this.props.age}</li>
                <li>性别:{this.props.sex}</li>
              </ul>
      )
    }
  }
  //指定组件属性默认值
  Person.defaultProps = {
    sex:'男',
    age: 18
  }
  //对props中属性进行类型限制和必要性限制
    Person.propTypes = {
      name: PropTypes.string.isRequired,
      age: PropTypes.number
    }
  //渲染组件标签
  const p1 = {
    name:'Tom',
    age: 18,
    sex: '女'
  }
  console.log(p1.name)
  //左侧属性名 要跟<li>标签里的对应
  //ReactDOM.render(<Person name={p1.name} age={p1.age} sex={p1.sex}/>,document.getElementById('example1'))
  /*   ...作用
  1.打包
  function fn (...a) fn(1,2,3)
  2.解包
  const arr1=[1,2,3]  const arr2 = [6,...arr1,99,78]   等同于arr2= [6,1,2,3,99,78]
  */
  ReactDOM.render(<Person {...p1}/>,document.getElementById('example1'))
  const p2 = {
    name:'Jack',
  }
  console.log(p2.name)
  ReactDOM.render(<Person name={p2.name} age={22}/>,document.getElementById('example2'))

</script>
</body>
</html>

效果
在这里插入图片描述

面试题

  • 问题: 请区别一下组件的props和state属性
    1)state: 组件自身内部可变化的数据
    2)props: 从组件外部向组件内部传递数据, 组件内部只读不修改

3. refs与事件处理

效果
  • 需求: 自定义组件, 功能说明如下:
    2. 点击按钮, 提示第一个输入框中的值
    3. 当第2个输入框失去焦点时, 提示这个输入框中的值

refs属性

1)组件内的标签都可以定义ref属性来标识自己
a.<input type=“text” ref={input => this.msgInput = input}/>
b.回调函数在组件初始化渲染完或卸载时自动调用
2)在组件中可以通过this.msgInput来得到对应的真实DOM元素
3)作用: 通过ref获取组件内容特定标签对象, 进行读取其相关数据

事件处理

1)通过onXxx属性指定组件的事件处理函数(注意大小写)
a.React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
b.React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
2)通过event.target得到发生事件的DOM元素对象

<input onFocus={this.handleClick}/>
handleFocus(event) {
event.target  //返回input对象
}

强烈注意

1)组件内置的方法中的this为组件对象
2)在组件类中自定义的方法中this为null

  • a.强制绑定this: 通过函数对象的bind()
    b.箭头函数(ES6模块化编码时才能使用)

源代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>07_component_refs</title>
</head>
<body>
<br>
  <div id="example"></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">
    /*
    需求: 自定义组件, 功能说明如下:
      1. 界面如果页面所示
      2. 点击按钮, 提示第一个输入框中的值
      3. 当第2个输入框失去焦点时, 提示这个输入框中的值
   */
    //定义组件
    class Lixiang extends React.Component{
      constructor(props){
        super(props)
        this.state ={

        }
        this.showInput = this.showInput.bind(this)
      }
      //事件处理
      handBlur (event){
        alert(event.target.value)
      }
      showInput(){
        const input = this.refs.content
//        alert(input.value)
        alert(this.input.value)
      }
      render(){
        return (
                <div>
                  <input type="text" ref="content"/>&nbsp;&nbsp;
                  <input type="text" ref={(input) => this.input = input}/>&nbsp;&nbsp;
                  <button onClick={this.showInput}>提示输入&nbsp;</button>&nbsp;&nbsp;
                  <input type="text" placeholder="失去焦点提示内容" onBlur={this.handBlur}/>
                </div>
        )
      }
    }
    //渲染组件你标签
    ReactDOM.render(<Lixiang />,document.getElementById("example"))
  </script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/qq_41846861/article/details/86584146