文章目录

  • 一、组件创建
    • 1.1 函数组件
    • 1.2 类组件
  • 二、组件区别
    • 2.1 有状态和无状态组件
    • 2.2 类组件的状态
  • 三、事件处理
    • *3.1 注册事件*
    • *3.2 事件对象*
    • *3.3 this指向问题*
  • 四、setState修改状态
  • 五、表单处理
    • *5.1 非控组件*
    • *5.2 受控组件*
  • 六、组件通讯
    • 6.1 什么是组件通讯
    • 6.2 父子通讯
      • 6.2.1 父传子
      • 练习:
      • 6.2.2 子传父
    • *6.3 兄弟组件通讯*
    • *6.4 跨级组件通讯*

一、组件创建

组件创建有两种:一种是函数组件、一种是类组件

1.1 函数组件

函数组件就是使用JS的函数或者箭头函数创建的组件
函数组件创建:

// 普通构造函数
function Hello() {return <div>普通构造函数!</div>
}// 使用箭头函数创建组件:
const Hello = () => <div>箭头组件!</div>

函数组件使用:

// 使用 双标签 渲染组件:
<Hello></Hello>
// 使用 单标签 渲染组件:
<Hello />
  • 约定1:函数名称必须以大写字母开头,区分组件和普通的 HTML标签
  • 约定2:函数组件必须有返回值,表示该组件的 UI 结构;如果不需要渲染任何内容,则返回 null

1.2 类组件

类组件就是ES6的class语法创建的组件
创建组件:

// 导入 React
import React from 'react'  // 也可以解构只导入Component  import { Component } from 'react'
// 需要继承React.Component
class Hello extends React.Component {render() {return <div>Hello Class Component!</div> }
}

使用组件和函数组件一样,可以使用单/双标签

  • 约定1:类名称也必须以大写字母开头
  • 约定2:类组件应该继承 React.Component 父类,从而使用父类中提供的方法或属性
  • 约定3:类组件必须提供 render 方法
  • 约定4:render 方法必须有返回值,表示该组件的 UI 结构

二、组件区别

2.1 有状态和无状态组件

  • 函数组件又叫做无状态组件 函数组件是不能自己提供数据【不考虑 hooks 的情况下】
  • 类组件又叫做有状态组件 类组件可以自己提供数据

2.2 类组件的状态

  1. 状态state,也就是数据,是组件内部的私有数据,只能在组件内部使用
  2. 状态 state 的值是对象,表示一个组件中可以有多个数据
  3. 通过 this.state.xxx 来获取状态
class Hello extends Component {// 为组件提供状态state = {count: 0}render() {return (<div>类组件的状态:{this.state.count}</div> //读取状态)}
}

三、事件处理

3.1 注册事件

语法:on+事件名 ={事件处理程序} 比如onClick={this.handleClick}

import { Component } from 'react'
class App extends Component {handleClick() {console.log('点击事件')}render() {return (<div><button onClick={this.handleClick}>点击触发</button></div>)}
}

3.2 事件对象

import { Component } from 'react'
class App extends Component {handleClick(e) {console.log('事件对象', e)}render() {return (<div><button onClick={()=>this.handleClick(e)}>点击触发</button></div>)}
}

3.3 this指向问题

  • 事件处理程序中的this指向的是undefined
  • render方法中的this指向的是当前react组件。只有事件处理程序中的this有问题
  • 原因
    • 事件处理程序的函数式函数调用模式,在严格模式下,this指向undefined
    • render函数是被组件实例调用的,因此render函数中的this指向当前组件

解决方法:

  1. 箭头函数
 <button onClick={() => this.handleClick()}>点我</button>
  1. bind
  <button onClick={this.handleClick.bind(this)}>点我</button>
  1. 箭头函数形式的实例方法 - 推荐使用
handleClick = () => {console.log(this.state.msg)}<button onClick={this.handleClick}>点我</button>

四、setState修改状态

react的核心就是状态不可变,在后续的学习中也要一直记住这一点
我们可以通过setState进行数据的修改
语法:this.setState({ 要修改的部分数据 })

class Hello extends Component {state = {count: 0}handleClick = () => {// 在 count 当前值的基础上加 1this.setState({count: this.state.count + 1})}  render() {return (<div><h1>计数器:{this.state.count}</h1><button onClick={this.handleClick}>点击+1</button></div>)}
}

这几种都是直接修改当前值,是不能使用的

  1. this.state.count++
  2. ++this.state.count
  3. this.state.count += 1
  4. this.state.count = 1

还有数组中直接修改当前数组的方法也不能用


五、表单处理

包括非控组件、受控组件

5.1 非控组件

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

// 1 导入 createRef 函数
import { createRef } from 'react'class Hello extends Component {// 2 调用 createRef 函数来创建一个 ref 对象//   ref 对象的名称(txtRef)可以是任意值//   命名要规范: txt(DOM 元素的自己标识) + RefClickRef = createRef()handleClick = () => {// 4 获取文本框的值:console.log(this.ClickRef.current.value)}render() {return (<div>{/*3 将创建好的 ref 对象,设置为 input 标签的 ref 属性值*/}<input ref={this.txtRef} /><button onClick={this.handleClick}>获取文本框的值</button></div>)}
}

5.2 受控组件

value值受到了react状态控制的表单元素

class App extends React.Component {state = {msg: '受控组件'}handleChange = (e) => {this.setState({msg: e.target.value})}render() {return (<div><input type="text" value={this.state.msg} onChange={this.handleChange}/></div>)}
}

六、组件通讯

6.1 什么是组件通讯

组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据,在实际情况中,多个组件之间不可避免的要共享某些数据,为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通。这个过程就是组件通讯

6.2 父子通讯

6.2.1 父传子

通过props接收父组件传来的数据

父组件:

import React, { Component } from 'react'class APP extends Component {state = {age: 18,}render() {return (<div><h1>父子通讯——父组件</h1><hr /><Fn  test={this.state.age}  /></div>)}
}

函数组件获取props:

const Fn = (props) => {return (<div><p>组件通信-子组件</p><p>父组件传来的数据:{props.test}</p></div>)
}

类组件获取props:

// 接收数据:
// class 组件需要通过 this.props 来获取
// 注意:this.porps 属性名是固定的!!!
class Fn extends Component {render() {return (<div>接收到的数据:{this.props.test}</div>) }
}

练习:

通过父子通信完成以下案例

父组件:

import React, { Component } from 'react'
import './index.scss'
import Son from './component/son.jsx'
class App extends Component {state = {list: [{id: 1,name: 'Son1',},{id: 2,name: 'Son2',},],}render() {return (<div className="box"><h1>父组件</h1>{this.state.list.map((item) => (<Son list={item} key={item.id} />))}</div>)}
}export default App

子组件:

function Son(props) {console.log(props)return (<div className="son"><h1>Son</h1><p>{props.list.name}</p></div>)
}export default Son

样式:

.box {height: 400px;width: 400px;border: 2px solid skyblue;margin: 10px;
}.son {height: 100px;width: 300px;border: 1px solid black;margin: 10px;padding: 10px;
}

6.2.2 子传父

利用回调函数来实现,父组件提供回调,子组件调用回调,将要传递的数据作为回调函数的参数代码实现:
父组件:

class Parent extends React.Component {state = {num: 10000}// 回调函数Hello =(Sonnum)=> {this.setState({num: this.state.num - Sonnum})}render() {const { num } = this.statereturn (<div><h1>我是父组件:{money}</h1><Child num={num} Hello={this.Hello} /></div>)}
}

子组件:

const Child = (props) => {const handleClick = () => {// 子组件调用父组件传递过来的回调函数props.Hello(100)}return (<div><h3>我是子组件 -- {props.num}</h3><button onClick={handleClick}>点击回调</button></div>)
}

6.3 兄弟组件通讯

将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态,要通讯的子组件只需通过 props 接收状态或操作状态的方法(本质上就是父子通讯)


代码实现:

import React, { Component } from 'react'class APP extends Component {state = {APPvalue: '',}getValue = (value) => {this.setState({APPvalue: value,})}render() {return (<div><h1>兄弟组件-父组件</h1><p>{this.state.APPvalue}</p><hr /><One data={this.getValue} /><Two getData={this.state.APPvalue} /></div>)}
}
class One extends Component {state = {value: 199,}render() {return (<div><h1>兄弟1</h1><p>{this.state.value}</p><button onClick={() => this.props.data(10000)}>点击</button></div>)}
}const Two = (props) => {return (<div><h1>兄弟2</h1><p>兄弟1传来的数据:{props.getData}</p></div>)
}export default APP

6.4 跨级组件通讯

也就是两个组件之间间隔较远,使用 Context 来实现跨组件传递数据

import { createContext } from 'react'  // 0 导入创建 context 的函数const { Provider, Consumer } = createContext()// 1 创建 Context 对象
//   对象中包含了两个组件,分别是: Provider 状态的提供者组件(提供状态)  Consumer 状态的消费者组件(使用状态)<Provider value="blue"> // 2 使用 Provider 组件包裹整个应用,并通过 value 属性提供要共享的数据<div className="App"><Node /> </div>
</Provider><Consumer>  // 3 使用 Consumer 组件接收要共享的数据{color => <span>data参数表示接收到的数据 -- {color}</span>}
</Consumer>

React入门基础+练习(二)相关推荐

  1. Games101计算机图形学入门基础之二:光栅化

    Games101计算机图形学入门基础之二:光栅化 引言 三角形的离散化 采样 走样 走样带来的瑕疵 反走样 先模糊再采样 傅里叶变换 低通滤波 卷积 多重采样抗锯齿(超采样) 深度缓存 可见性与遮挡( ...

  2. 【深度学习入门基础】二、简单理解 Transformer

    [深度学习入门基础]二.简单理解 Transformer 文章目录 [深度学习入门基础]二.简单理解 Transformer 自注意力层 多头注意力 Transformer 输入(输出)嵌入 位置编码 ...

  3. React入门基础教程

    React入门基础教程 React 是什么? React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript 库.使用 React 可以将一些简短.独立的代码片段组合成复杂的 UI 界 ...

  4. vue实战入门基础篇二:从零开始仿门户网站实例-开发框架搭建

    上一篇:vue实战入门基础篇一:从零开始仿门户网站实例-前期准备工作 vue实战入门基础篇二:从零开始仿门户网-2022-2-23 21:00:27 一.目录 第一篇:前期准备工作 第二篇:开发框架搭 ...

  5. React入门基础+练习 (一)

    文章目录 一.关于react 1.1 react相关文档 1.2 react是什么? 1.3 react的特点? 二.react的脚手架 三.react元素的创建 练习 四.JSX 4.1 JSX是什 ...

  6. Flux --gt; Redux --gt; Redux React 入门 基础实例教程

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  7. 机器学习入门基础(二)

    不纯度 决策树的每个根节点和中间节点中都会包含一组数据(工作为公务员为某一个节点),在这组数据中,如果有某一类标签占有较大的比例,我们就说该节点越"纯",分枝分得好.某一类标签占的 ...

  8. lambda演算解释器java,λ演算(Lambda Calculus)入门基础(二):丘奇编码(Church Encoding)...

    上一篇我们已经建好了lambda演算大厦的地基,接下来需要了解的就是如何在此基础上构造用于计算的一些通用工具了,比如自然数.布尔值.基本运算和布尔运算等等. 丘奇数(Church Numerals) ...

  9. Python 入门基础笔记(二)

    一`.模块是经过封装的类库可以经过导入之后直接调用,有标准库和第三方库,标准库导入即可,第三方库要安装之后使用; 常用标准库有: OS标准库--------    提供很多与操作系统交互的函数 RE标 ...

最新文章

  1. SQLSERVER监控复制并使用数据库邮件功能发告警邮件
  2. golang学习笔记————字符串
  3. vue中全局引入bootstrap.css
  4. C# 接口的作用浅谈举例(转)
  5. 机器学习知识点(三十一)LDA数学八卦
  6. Atitit.技术管理者要不要自己做开发??
  7. java 比较算法_JAVA排序算法实现和比较:冒泡,桶,选择,快排,归并
  8. weex 安装过程中遇到的坑
  9. 前端学习(2851):简单秒杀系统学习之相对定位
  10. 第十七节(is-a 、is-like-a 、has-a,包和 import )
  11. 图文并茂介绍在VS2010里使用TFS2010
  12. Airflow 中文文档:用upstart运行Airflow
  13. php函数引用参数解惑《细说php》
  14. Kinect+OpenNI学习笔记之13(Kinect驱动类,OpenCV显示类和手部预分割类的设计)
  15. VB.Net视频教程和VBA简单介绍下载
  16. retainAll()和removeAll()
  17. 为何甲骨文裁员,偏偏要选中国人?
  18. 光辉岁月-Beyond_习惯累积沉淀_新浪博客
  19. github上面fork代码如何提交分支合并申请
  20. matlab中cond为啥比bet好,关于dpabi中bet步骤

热门文章

  1. datagrid 溢出文本显示省略号
  2. Cocos2d-x内置的常用层
  3. xmlhelper (把实体对象转成xml文档)
  4. 【转】 delphi --- WinSocket应用
  5. Bailian4111 判断游戏胜者-Who Is the Winner【文本处理】
  6. CCF201409-2 画图(100分)
  7. HDU2009 求数列的和【入门】
  8. 音译 —— 本身的含义
  9. 非参贝叶斯(Bayesian Non-parameter)初步
  10. sklearn 下距离的度量 —— sklearn.metrics