React 组件基础

目录

1. React 组件介绍

2. React 组件的两种创建方式

2.1 使用函数创建组件

2.2 使用类创建组件

2.3 抽离为独立 JS 文件

3. React 事件处理 

3.1 事件绑定

在函数组件中绑定事件:

     在类组件中绑定事件:

3.2 事件对象(e)

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

5. 组件中的 state 和 setState

5.1 state的基本使用

5.2 setState()修改状态

5.3 从 JSX 中抽离事件处理程序

6. 事件绑定 this 指向 

1. 箭头函数

2. Function.prototype.bind()

3. class 的实例方法(重点推荐)

7. 表单处理 

7.1 受控组件

使用步骤:

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

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

受控组件示例总结:

多表单元素优化:

多表单元素优化步骤:

7.2 非受控组件

使用步骤:

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

2.将创建好的 ref 对象添加到文本框中

3.通过 ref 对象获取到文本框的值

总结: 


1. React 组件介绍

组件是 React 一等公 ,使用 React 就是在用组件
组件表示页面中的部分功能
组合多个组件实现完整的页面功能
特点:可复用、独立、可组合

 

2. React 组件的两种创建方式

2.1 使用函数创建组件

函数组件:使用 JS 的函数(或箭头函数)创建的组件
定1: 函数名称必须以 大写 母开头
定2:函数组 必须有返回 ,表示 组件的
如果返回值为 null, 表示不渲染任何
function Hello() {
    return (
        <div>这是我的第一个函数组件!</div>
    )
}

渲染函数组件 用函数名作为组 标签名
组件标签可以是单标签也可以是 标签
function Hello() {
    return (
        <div>这是我的第一个函数组件!</div>
    )
}
ReactDOM.render(<Hello />, root)

使 JS 中的函数创建的组件叫做: 数组件
函数组件必须有返回值
组件名称必须以大写字母开头, React 据此区 普通的React 元素
使用函数名作为组件标签名
function Hello() {
    return (
        <div>这是我的第一个函数组件!</div>
    )
}
ReactDOM.render(<Hello />, root)

2.2 使用类创建组件

类组件:使用 ES6 class 创建的组件
定1: 类名称也必须以 大写 母开头
定2: 类组件应该继 React.Component 父类,从而可以使用父类中提供 方法或
定3: 类组件必须提 render() 方法
定4:render() 方法 必须有返回值 ,表示该 件的结构
class Hello extends React.Component {
    render() {
        return <div>Hello Class Component!</div>
    }
}
ReactDOM.render(<Hello />, root)

2.3 抽离为独立 JS 文件

组件作为一个独立的个体,一般 放到 个单独的 JS 文件中
1. 建Hello.js
2. Hello.js 中导入 React
3. 创建组件(函 类)
4. Hello.js 中导出该组件
5. index.js 中导入 Hello 组件
6. 渲染组件

// index.js
import Hello from './Hello'
// 渲染导入的Hello组件
ReactDOM.render(<Hello />, root)
// Hello.js
import React from 'react'
class Hello extends React.Component {
    render() {
        return <div>Hello Class Component!</div>
    }
}
// 导出Hello组件
export default Hello

3. React 事件处理 

3.1 事件绑定

React 事件绑定语法与 DOM 事件语法相似
语法 on+ 事件名称 ={ 事件 理程序 } :onClick={() => {}}
注意 React 事件采用 驼峰命名法 ,比如 :onMouseEnter onFocus

在函数组件中绑定事件:

function App() {
    function handleClick() {
      console.log('单击事件触发了')
    }

    return (
       <button onClick={handleClick}>点我</button>
    )
}

     在类组件中绑定事件:

class App extends React.Component {
    handleClick() {
        console.log('单击事件触发了')
    }

    render() {
        return (
            <button onClick={this.handleClick}></button>
        )
    }
}

3.2 事件对象(e)

可以通 事件处理程序的参 数(e)
React 中的事件对象叫做: 合成事 (对象)
合成事件:兼容所有浏览器,无 担心跨 览器兼 性问题
function handleClick(e) {
  e.preventDefault()
  console.log('事件对象', e)
}
<a onClick={handleClick}>点我,不会跳转页面</a>

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

函数组件又叫 无状态组
状态 (state) 数据
函数组件没有自己的状态 (静)
类组件有自己的状态 负责更 UI 让页面“动” 起来

比如计数器案例中,点击按钮让值加 1 0 1 就是不同时刻的状态,而由 0 变为 1 就表示状态发生了变 化。状态变化后,UI 也要相应的更新。React 中想要实现该功能,就要使有状态件来完

5. 组件中的 state setState

5.1 state的基本使用

状态 (state) 即数据,是组件内部 私有 据,只 在组件 部使用
state 的值是对 ,表示一个组件 可以有 个数据
class Hello extends React.Component {
    constructor() {
        super()
        // 初始化state
        this.state = {
            count: 0
        }
    }

    render() {
        return (
            <div>有状态组件</div>
        )
    }
}

 简化写法(开发中极力推荐)

class Hello extends React.Component {
    // 简化语法
    state= {
      count: 0
    }

    render() {
        return (
            <div>有状态组件</div>
        )
    }
}

 获取状态this.state

class Hello extends React.Component {
    // 简化语法
    state= {
      count: 0
    }

    render() {
      return (
        <div>有状态组件,{this.state.count}</div>
      )
    }
}

状态即数据
状态是私有的,只能在组件内部 使
通过 this.state 来获取状态

class Hello extends React.Component {
    // 简化语法
    state= {
      count: 0
    }

    render() {
      return (
        <div>有状态组件,{this.state.count}</div>
      )
    }
}

5.2 setState()修改状态

状态是可变的
语法 :this.setState({ 要修改的数据 })
注意 不要直接修改 state 中的值,这是错误的!!!
setState() 作用 :1. 修改 state 2. 更新 UI
思想 数据驱动视图
// 正确
this.setState({
    count: this.state.count + 1
})
// 错误
this.state.count += 1

5.3 从 JSX 中抽离事件处理程序

JSX 中掺杂过多 JS 逻辑代码,会显得非常混乱
推荐 将逻辑抽离到单独的方法 ,保 JSX 结构清晰

 原因:事件处理程序this 的值 undefined

 希望:this 指向组件实例(render方法中的this即为件实例)

6. 事件绑定 this 指向 

1. 箭头函数

利用箭头函数自身不绑 this 的特点
render() 方法中的 this 为组件实例,可以获取 setState()
class Hello extends React.Component {
    onIncrement() {
        this.setState({ … })
    }

    render() {
        // 箭头函数中的this指向外部环境,此处为:render()方法
        return (
            <button onClick={() => this.onIncrement()}></button>
        )
    }
}

2. Function.prototype.bind()

ES5中的bind方法,将事件处程序中this一起

class Hello extends React.Component {
    constructor() {
        super()
        this.onIncrement = this.onIncrement.bind(this)
    }

    // ...省略 onIncrement
    render() {
        return (
            <button onClick={this.onIncrement}></button>
        )
    }
}

3. class 的实例方法(重点推荐)

利用箭头函数形式 class 实例方法
注意:该语法是实验性语法,但 ,由 babel 的存 可以直 使用
class Hello extends React.Component {
    onIncrement = () => {
        this.setState({ … })
    }

    render() {
        return (
            <button onClick={this.onIncrement}></button>
        )
    }
}

7. 表单处理 

7.1 受控组件

HTML 中的表单元素是可输入的,也就有自己可变状态

而在React 中可变状态通常保存 state 中,并且只能通 setState() 方法来修改

 

state = {
  count: 0
}

this.setState({
    count: this.state.count + 1
})

 React state 与表单元素值value绑定到一起 state 的值来控制表单元素的值

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

 

使用步骤:

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

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

state = { txt: '' }
<input type="text" value={this.state.txt}
    onChange={e => this.setState({ txt: e.target.value })}
/>

受控组件示例总结:

1. 文本框、富文本框、下拉 操作 value 属性
2. 复选框 操作 checked 属性

多表单元素优化:

问题:每个表单元素都有一个单 的事件 理程序 理太繁琐
优化:使用一个事件处理程序同 处理多 表单元素

多表单元素优化步骤:

 1. 给表单元素添 name 属性,名称与 state 相同
 2. 根据表单元素类型获取对应值

       3.在 change 事件处理程序中通过 [name] 来修改对应的state 

<input
    type="text"
    name="txt"
    value={this.state.txt}
    onChange={this.handleForm}
/>
// 根据表单元素类型获取值
const value = target.type === 'checkbox'
    ? target.checked
    : target.value

// 根据name设置对应state
this.setState({
    [name]: value
})

7.2 非受控组件

说明:借助于 ref, 使用原生 DOM 方式来获取表单元素值
ref 的作用:获 DOM 或组件

使用步骤:

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

constructor() {
  super()
  this.txtRef = React.createRef()
}

2.将创建好的 ref 对象添加到文本框中

<input type="text" ref={this.txtRef} />

3.通过 ref 对象获取到文本框的值

Console.log(this.txtRef.current.value)

总结: 

React 基础 

1. 组件的两种创建方式:函数组件类组件 

2. 无状态(函数)组件,负责静态构展示 

3.有状态(类)组件,负责更UI ,让页面动起来

4.绑定事件注意 this 指向问题

5.推荐使用受控组件来处理表单

6.完全利用 JS 语言的能力创建组件,这React 的思想

猜你喜欢

转载自blog.csdn.net/qq_57587705/article/details/125200533
今日推荐