组件三大核心属性

375 阅读2分钟

1 state

状态机,用作数据的存储,值是一个对象。 修改state里的数据则用setState方法

class Weather extends Component {
  state = {
    isHot: true,
  }
  clickFn = () => {
    this.setState({ isHot: !this.state.isHot })
  }
  render() {
    return <div onClick={this.clickFn}>广州今天天气很{this.state.isHot ? '炎热' : '凉爽'}</div>
  }
}
ReactDOM.render(<Weather></Weather>, document.getElementById('root'))

1.gif

这里的isHot根据点击而变化,放在state中维护,点击对应的方法里修isHot的值。
特别的,组件自定义的方法中this为undefined,可通过改变在constructor里用bind绑定this,或者用箭头函数指向weather的实例

2 props

props用来读取组件外部传递给组件的值,属性为只读,不可修改。
propTypes用来验证属性类型,不影响显示,输出在控制台中;
defaultProps 补充默认显示值,当组件外部没有传递该值时,默认显示defaultProps里面的值,获取this.props的值是已经合并后的取值。

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import ReactDOM from 'react-dom'

class Student extends Component {
  render() {
    const { name, age, sex } = this.props
    console.log(this.props)
    return (
      <div>
        <div>姓名:{name}</div>
        <div>年龄:{age}</div>
        <div>性别:{sex}</div>
      </div>
    )
  }
  static propTypes = {
    name: PropTypes.string.isRequired,
    age: PropTypes.number,
    sex: PropTypes.string,
  }
  static defaultProps = {
    name: '222',
    age: 13,
    sex: '女',
  }
}
ReactDOM.render(
  <>
    <Student age={12} name="xiaoming" sex="男"></Student>
    <Student name="defu" sex="男"></Student>
  </>,
  document.getElementById('root')
)

特别的,在组件外部传值用双引号时此时的类型也会是string,如果要改为其他类型,用{},{}在此表示里面用js语法。

3 refs

一种获取dom节点的方法,比如点击按钮获取输入框的相关内容

class MyRefs extends Component {
  render() {
    return (
      <div>
        <input ref="inp"></input>
        <button
          onClick={() => {
            console.log(this)
          }}
        >
          按钮
        </button>
      </div>
    )
  }
}
ReactDOM.render(<MyRefs></MyRefs>, document.getElementById('root'))

输入123,点击按钮此时的this输出如下: 1627298397(1).jpg

对应的this.refs(设置的对应ref值,这里是inp)(即this.refs.inp)可以获取dom节点,该功能在最新版本已经废弃。 还有一种创建ref容器的方法createRef,可以存储被ref所表识的节点,特点是‘专人专用’,即一个ref就要创建一个新的容器,否则最新的容器会覆盖掉之前的。

class MyRefs extends Component {
  showData = () => {
    console.log(this)
  }
  myref = React.createRef()
  render() {
    return (
      <div>
        <input ref={this.myref}></input>
        <button onClick={this.showData}>按钮</button>
      </div>
    )
  }
}
ReactDOM.render(<MyRefs></MyRefs>, document.getElementById('root'))

如下: this.myref.current(myref为定义的容器名称)可以获取该节点。

1627351273(1).jpg