react 组件介绍(创建&分类)

175 阅读5分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

1. React组件介绍

组件是react 的一等公民,使用react就是在用组件,组件表示页面中的部分功能,组合多个组件实现完整的页面功能;

特点: 可复用、独立、可组合;

2.创建方式

使用函数创建组件

  • 函数组件:使用js 的函数(或者箭头函数)创建的组件

  • 约定1:函数名必须以大写字母开头,React 据此区分组件 和 普通的 React 元素

  • 约定2:函数组件必须有返回值,表示该组件的结构

  • 使用函数名作为组件的标签名

    注意:如果没有什么要返回的内容,则可以写成return null;

// 6.函数组件
function Hello() {
  return (
    <div>这是我的第一个函数组件</div>
  )
}

//const Hello = () =><div>这是我的第一个函数组件</div>
  

// 渲染组件
reactDom.render(<Hello />, document.getElementById('root'))

使用类创建的组件

  • 类组件:使用ES6的Class 创建的组件
  • 约定1:类名称也必须以大写字母开头
  • 约定2:类组件应该继承React.Component 父类,从而可以使用父类中的提供的方法或者属性
  • 约定3:类组件必须提供的render()方法,且必须有返回值,表示该组件的结构
class HelloTest extends React.Component {
  render() {
    return (
      <div>这是我的第一个类组件</div>
    )
  }
}

reactDom.render(<HelloTest />, document.getElementById('root'))

抽离为独立的JS文件

// hello.js 文件
import React from 'react'

// 创建组件
class Hello extends React.Component {
  render() {
    return (
      <div>这是我的第一个抽离出来的JS文件库中的组件</div>
    )
  }
}
// 导出组件
export default Hello
//index.js   文件
import Hello from './Hello'


// 渲染组件
reactDom.render(<Hello />, document.getElementById('root'))

3.React 的事件处理

react 事件绑定的语法与DOM 事件语法相似;

语法:on + 事件名称 = { 事件处理程序 },比如:onClick = { () =>{}}

注意: react 事件采用驼峰命名法;

处理的方式

  • 使用类组件的方式处理事件:
class App extends React.Component {
  handelClick() {
    alert('你点击了按钮');
  };

  render() {
    return (
      <button onClick={this.handelClick}>React  按钮</button>
    )
  }
}

// 渲染组件
reactDom.render(<App />, document.getElementById('root'))
  • 使用函数绑定事件
function APP1() {
  function handelClick() {
    alert('你点击了按钮');
  };

  return (
    <button onClick={handelClick}>React  按钮22</button>
  )
}

// 渲染组件
reactDom.render(<APP1 />, document.getElementById('root'))

事件对象

  • 可以通过事件处理程序的参数获取到事件对象
  • React中的事件对象叫做:合成事件(对象)
  • 合成事件:兼容所有浏览器,无需担心跨浏览器兼容性问题
class Obj extends React.Component {
  handelClick(e) {
    // 组织浏览器默认行为
    e.preventDefault();
    console.log('单击事件触发了');
  }

  render() {
    return (
      <a href="http://www.baidu.com" onClick={this.handelClick}>点击我,去控制台看看</a>
    )
  }
}
reactDom.render(<Obj />, document.getElementById('root'))

4.有状态组件和无状态组件

有状态组件 === 函数组件:没有自己的状态,只负责展示数据(静);

无状态组件 === 类组件:有自己的状态,负责更新UI ,让页面“动”起来;

状态(state)即数据;

5.组件中的state和setState

基本使用state

  • 状态即数据,是私有属性,只能在组件内部使用
  • 通过this.state 来获取状态(数据)
class AppState extends React.Component {
  /*   constructor() {
      super()
      //初始化state
      this.state = {
        count: 520
      }
    } */

  //简化语法
  state = {
    count: 52.01
  }
  render() {
    return (
      <h2>计数器:{this.state.count}</h2>
    )
  }
}

reactDom.render(<AppState />, document.getElementById('root'))

setState()方法

数据驱动视图

class AppState extends React.Component {
  //简化语法
  state = {
    count: 52.10
  }
  render() {
    return (
      <div>
        <h2>计数器:{this.state.count}</h2>
        <button onClick={() => {
          this.setState(
            { count: this.state.count + 1 }
          )
        }
         // 错误示例
         //  this.state.count + 1    
        }>   点击+1 </button>
      </div>
    )
  }
}

reactDom.render(<AppState />, document.getElementById('root'))
  • 使用setState来修改数据状态,数据状态是可以变化的
  • 语法:this.setState({要修改的数据})
  • setState()作用:1.修改state 2.更新UI
  • 不要直接修改state 中的值,这是错误的!!!

6.事件绑定的this 指向

使用箭头函数:自身不绑定this 的特点

​ render()方法中的this为组件实例,可以获取到setState();

class AppThis extends React.Component {
  onIncrement() {
    this.setState(
      { count: this.state.count + 1 }
    )
  }
	//简化语法
  state = {
    count: 52.10
  }
  render() {
    return (
      <div>
        <h2>计数器:{this.state.count}</h2>
        <button onClick={() => {
          this.onIncrement();
        }
        }>   点击+1 </button>
      </div>
    )
  }
}
reactDom.render(<AppThis />, document.getElementById('root'))

function.prototype.bind()

利用ES5中的bind方法,将事件处理程序中的this与组件实例绑定到一起

class AppThis extends React.Component {
constructor() {
    super()
    this.onIncrement = this.onIncrement.bind(this);
  }
  onIncrement() {
    console.log("事件处理程序中的this值",this);
    this.setState(
      { count: this.state.count + 1 }
    )
  }
//简化语法
  state = {
    count: 52.10
  }
  render() {
    return (
      <div>
        <h2>计数器:{this.state.count}</h2>
        <button onClick={() => {
          this.onIncrement();
        }
        }>   点击+1 </button>
      </div>
    )
  }
}

reactDom.render(<AppThis />, document.getElementById('root'))

class 的实例方法 (推荐)

利用箭头函数形式的class实例方法

注意:改语法是实验性语法,但是由于Babel的存在可以直接使用

class AppThis extends React.Component {
  onIncrement = () => {
    this.setState(
      { count: this.state.count + 1 }
    )
  }
	//简化语法
  state = {
    count: 52.10
  }
  render() {
    return (
      <div>
        <h2>计数器:{this.state.count}</h2>
        <button onClick={() => {
          this.onIncrement();
        }
        }>   点击+1 </button>
      </div>
    )
  }
}
reactDom.render(<AppThis />, document.getElementById('root'))

7.表单处理

受控组件

定义

HTML中的表单元素是可以输入的,也就是有自己的可变的状态,而在react中可变状态通常保存在state中,并且只能通过setState() 方法来修改;react 将state 与表单元素value绑定到一起,有state 的值来控制表单元素的值,所以其值受到react控制* 的 表单元素 成为 受控组件

步骤

  • 在state中添加一个状态,作为表单元素的value值(控制表单元素值的来源)
  • 在给表单元素绑定change事件,将表单元素的值设置为state的值(控制表单元素值的变化)
/*
* 含义:其值受到react 控制的表单元素
*
* 操作文本框的值
* */
class ControlComponent extends React.Component{
  state ={
    txt:'',
    content:''
  }
  //处理单个文本框的值
  handelInputChange= (e) =>{
    this.setState({
      txt:e.target.value
    })
  }
  //处理富文本框的值
  handelTextAreaChange = (e) =>{
    this.setState({
      content:e.target.content
    })
  }
  render() {
    return (
        <div>
          <input type="text" value={this.state.txt}  onChange={this.handelInputChange}/>
          <hr/>
          <br/>
          <textarea value={this.state.content}  onChange={this.handelTextAreaChange}></textarea>
        </div>
    )
  }
}
reactDom.render(<ControlComponent />, document.getElementById('root'))

优化代码:

class ControlComponent extends React.Component{
  state ={
    txt:'',
    content:''
  }
  //处理单个文本框的值
  handelChange= (e) =>{
    //获取当前对象
    const  target = e.target
    //根据类型获取值
    const value  = target.type ==='checkbox' ? target.checked : target.value
    // 获取name
    const name = target.name

    this.setState({
      [name]:value
    })
  }

  render() {
    return (
        <div>
          <input type="text" name="txt" value={this.state.txt}  onChange={this.handelChange}/>
          <hr/>
          <br/>
          <textarea name="content" value={this.state.content}  onChange={this.handelChange}></textarea>
        </div>
    )
  }
}

非受控组件

定义:

借助于ref,使用原生的DOM方式来获取表单元素的值

步骤:

  • 调用React.createRef()创建一个ref 对象

constructor() { super(); // 创建ref this.txtRef = React.createRef() }

  • 将创建好的ref 对象添加到文本框中 <input type="text" ref={this.txtRef} />
  • 通过ref对象获取到文本的框的值

console.log("文本框的值为:",this.txtRef.current.value);

例子:


class NonControlComponent extends React.Component{
  constructor() {
    super();
    // 创建ref
    this.txtRef = React.createRef()
  }
  // 获取文本框的值
  getTxt = () =>{
    console.log("文本框的值为:",this.txtRef.current.value);
  }

  render() {
    return (
        <div>
          <input type="text" ref={this.txtRef} />
          <button onClick={this.getTxt}>获取文本框的值</button>
        </div>

    );
  }
}
reactDom.render(<NonControlComponent />, document.getElementById('root'))

最后

我正在成长,如果有什么问题欢迎大家留言,我们一起讨论。。。

如果对您有用,希望您留下评论/👍/收藏。

您的三连,是对我创作的最大的鼓励🙇‍♀️🙇‍♀️🙇‍