react组件介绍

147 阅读4分钟

react组件

React组件有两种创建方式分别为 函数组件类组件

函数组件

  • 函数名必须以大写字母开头
  • 函数组件必须有返回值,表示该组件的结构
  • 返回值为null、表示不渲染
  • 使用时直接将函数名作为标签名

例如:

import React from 'react'

const Func = () => {
    return <div>
        这是我创建的函数式组件
        </div>
}   
export default Func

//使用时直接使用标签的形式 <Func />

类组件

  • 使用ES6中的class创建类
  • 类组件名称也以大写字母开头
  • 类组件应该继承React.Component父类,从而使用父类中的方法
  • 类组件必须有render()方法
  • 使用时直接将名称作为标签名

例如:

import React from 'react'

class Com extends React.Component {
    render() {
        return <div>
            这是我创建的类组件
        </div>
    }
}
export default Com

//使用时直接使用标签的形式 <Com />

事件绑定

react事件绑定语法与Vue事件语法相似

语法 on+事件名称={事件处理函数} 、 事件为驼峰命名

例如:

在类组件中

import React from 'react'

class Com extends React.Component {

    handler=()=>{
        console.log('我被点了')
    }
    render() {
        return <div>
            <button onClick={this.handler}>点我!!</button>
        </div>
    }
}
export default Com

在函数式组件中

import React from 'react'

const Func = () => {

    const handler =()=>{
        console.log('我被点了')
    }

    return <div>
       <button onClick={handler}>点我!!</button>
</div>
}
export default Func

事件对象

在react中事件对象叫做合成事件(对象)

在事件处理函数中用e获取到事件对象

 const handler =(e)=>{
        console.log('这是事件对象',e)
    }

输出的结果:

image.png

所以我们可以通过事件处理函数中的事件对象,拿到相应的信息

有状态组件和无状态组件

函数组件叫做无状态组件

类组件叫做有状态组件

状态(state)即数据

函数组件没有自己的状态,子负责数据展示(静),可以使用Hooks使函数式组件也有状态

类组件有自己的状态,负责更新,让页面动起来

组件中的state和setState

state

状态即数据,是组件内部的私有数据,只能在组件内部使用

state的值是对象,表示一个组件可以有多个数据

简化语法:

class Com extends React.Component {
    state ={
        name:'小周'
    }
    render() {
        return <div>
            <h1>{this.state.name}</h1>  
        </div>
    }
}
export default Com

setState() 修改状态

状态是可改变的

语法: this.steState({要修改的数据})

不要直接修改state中的值,错误的,需要配合 setState()

setState()作用:

  • 修改state
  • 更新UI

事件绑定this指向

在类组件中的函数 推荐使用箭头函数

事件处理程序中的this指向的是undefined

render方法中的this指向的而是当前react组件。只有事件处理程序中的this有问题

  • 方案1:箭头函数
  • 方案2:bind修改this指向
  • 方案3:类实例方法

在render中使用箭头函数

箭头函数的特点:自身没有this,访问的是外部的this

方式1

class App extends React.Component {
  state = {
    msg: 'hello react'
  }
  render() {
    return (
      <div>
        <button onClick={() => { console.log(this.state.msg) }>点我</button>
      </div>
    )
  }
}

缺点:会把大量的js处理逻辑放到JSX中,将来不容易维护

方式2

class App extends React.Component {
  state = {
    msg: 'hello react'
  }
  handleClick() {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={() => {this.handleClick()}}>点我</button>
      </div>
    )
  }
}

缺点:把大量的js逻辑写在了JSX结构中,不好维护

解决方案2:使用bind

class App extends React.Component {
  state = {
    msg: 'hello react'
  }
  handleClick() {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick.bind(this)}>点我</button>
      </div>
    )
  }
}

或者

class App extends React.Component {
  constructor() {
    super()
    this.handleClick = this.handleClick.bind(this)
  }
  state = {
    msg: 'hello react'
  }
  handleClick() {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>点我</button>
      </div>
    )
  }
}

解决方案3:class实例方法

class App extends React.Component {
  state = {
    msg: 'hello react'
  }
​
  handleClick = () => {
    console.log(this.state.msg)
  }
  render() {
    return (
      <div>
        <button onClick={this.handleClick}>点我</button>
      </div>
    )
  }
}

注意:这个语法是试验性的语法,但是有babel的转义,所以没有任何问题

表单处理

HTML中的表单元素是可以输入的,也就是有自己的可变状态、而React中可变状态通常保存在state中,并只能通过setState()方法来修改,React将state与表单元素值value绑定到一起,有state的值来控制表单元素的值

受控组件

受控组件是值受到React控制的表单元素

在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源)

给表单元素绑定change事件,将表单元素值设为state的值(控制表单元素值的变化)

拓展:多表单元素优化

  • 给表单元素添加name属性,名称与state相同
  • 根据表单元素类型获取对应值
  • 当事件触发,判断表单元素的类型(value和checked)
  • 通过setState()和[name]来修改表单元素值

非受控组件

非受控组件 借助ref,使用原生DOM方式来获取表单元素值

ref的作用:获取DOM 或组件

  1. 调用React.createRef()方法创建一个ref对象 this.txtRef = React.createRef()

  2. 将创建好的ref对象添加到文本框中 <input type="text" ref={this.txtRef}>

  3. 通过ref对象获取到文本框的值 console.log(this.txtRef.value)

感谢阅读!!!