React三大属性(ref,state,props)

三大属性指代的是React中组件最重要的,也是最常用的三个主要属性:ref,props和 state

ref

Ref属性可以让开发者很方便快捷地拿到组件实例对象或DOM元素。

import React, { Component } from "react"

export default class ReactRef extends Component {
  constructor(props) {
    super(props)
    this.state = {
      inputValue: ""
    }
  }
  // 1.1 设置ref属性
  input = React.createRef()
  header = React.createRef()
  handleCheck = () => {
    // 1.3 获取ref属性中绑定的DOM元素对象
    console.log(this.input.current.value)
    console.log(this.header.current)
  }
  render() {
    return (
      <div>
        <h3>ref</h3>
        {/* 1.2 ref属性把节点进行绑定 */}
        <input type="text" value={this.inputValue} ref={this.input} />
        <header ref={this.header}></header>
        <button onClick={this.handleCheck}>检查</button>
      </div>
    )
  }
}

state

state(状态)就是每个组件中内部保存的私有数据,只能在组件内部声明和使用。state的值是对象,一个组件中可以有多个state数据。组件的state如果发生变化,那么React就会自动重新渲染用户界面(不需要操作DOM),一句话就是,用户的界面会随着state状态的改变而自动发生改变,达到自动响应的目的。

import React, { Component } from 'react'

export default class ReactState extends Component {
  constructor(props) {
    super(props)
    this.state = {
      type: 'password',
      tip: '查看密码'
    }
  }
  changeType = () => {
    this.setState({
      type: this.state.type === 'password' ? 'text' : 'password',
      tip: this.state.tip === '查看密码' ? '隐藏密码' : '查看密码'
    })
  }
  render() {
    return (
      <div>
        <h3>state</h3>
        <input type={this.state.type} />
        <button onClick={this.changeType}>{this.state.tip}</button>
      </div>
    )
  }
}

props

React组件会因为实现业务或者功能的需求,会出现嵌套或者并列的情况,甚至有时候会因为多个组件负责的业务是相关联的,此时就需要在多个组件之间进行数据的传递了。React组件提供了Props属性, 专门用来实现组件接受外部参数的传递。props是只读的,所以只能获取外部传递的数据,但不能修改该数据。同时React还提供了props数据类型和必要性的约束(React15版本以后,需要单独安装yarn add prop-types)。同时,下面代码还实现了react父子组件之间传值

import React, { Component } from "react"
import Banner from "../components/Banner"

export default class ReactProps extends Component {
  state = {
    num: 0,
    childData: ''
  }
  msg = "hello world"
  handleChange = () => {
    this.setState({
      num: this.state.num + 1
    })
  }
  handleData = (data) => {
    console.log(data)
    this.setState({
      childData: data
    })
  }
  changeNum = (data) => {
    this.setState({
      num: data
    })
  }
  render() {
    return (
      <div>
        <h3>props</h3>
        <p>父组件数据:{this.state.num}</p>
        <button onClick={this.handleChange}>add</button>
        <Banner msg={this.msg} num={this.state.num} onReceiveData={this.handleData} changeNum={this.changeNum} />
        {this.state.childData && <p>子组件数据:{this.state.childData}</p>}
      </div>
    )
  }
}
// Banner.jsx
import React from 'react'
import PropTypes from 'prop-types'

export default function Banner(props) {
  return (
    <div>
      接收数据msg:{props.msg}, num:{props.num}
      <button onClick={() => props.changeNum(10)}>改变num</button>
      <button onClick={() => props.onReceiveData('hello')}>子传父</button>
    </div>
  )
}
Banner.PropTypes = {
  msg: PropTypes.string,
  num: PropTypes.number,
  changeNum: PropTypes.func,
  onReceiveData: PropTypes.func
}
Banner.defaultProps = {
  msg: '默认值',
  num: 0
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值