React入门 组件学习笔记

news2024/12/23 14:25:54

项目页面以组件形式层层搭起来,组件提高复用性,可维护性

目录

一、函数组件

 二、类组件

三、 组件的事件绑定

四、获取事件对象

五、事件绑定传递额外参数

六、组件状态

初始化状态

读取状态

修改状态

七、组件-状态修改counter案例

 八、this问题说明

九、总结 


一、函数组件

目标:能够独立使用函数完成react组件的创建和渲染

函数组件概念:使用JS的函数(或者箭头函数)创建的组件,就叫做 函数组件

函数组件的创建和渲染

//函数组建的创建
//创建
function Hello(){
  return <div>hello这是一个函数组件</div>
}
  1. 组件的名称必须首字母大写,react内部会根据这个来判断是组件还是普通的HTML标签
  2. 函数组件必须有返回值,表示该组件的 UI 结构;如果不需要渲染任何内容,则返回 null
  3. 组件就像 HTML 标签一样可以被渲染到页面中。组件表示的是一段结构内容,对于函数组件来说,渲染的内容是函数的返回值就是对应的内容
  4. 使用函数名称作为组件标签名称,可以成对出现也可以自闭合
//函数组建的创建
//创建
function Hello(){
  return <div>hello这是一个函数组件</div>;
}

//渲染 <Hello/> 自闭和
//    <Hello></Hello>成对

function App() {
  return (
      <div className="App">
        {/*渲染Hello组件 */}
        <Hello/>
        <Hello></Hello>
      </div>
    
  );
}

export default App;

 二、类组件

能够独立完成类组件的创建和渲染

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

// 定义类组件
class HelloComponent extends React.Component{
  render(){
    return <div>这是个一个类组件</div>
  }
}

function App() {
  return (
      <div className="App">
        {/*渲染Hello组件 */}
        <Hello/>
        <Hello></Hello>
        <HelloComponent/>
        <HelloComponent></HelloComponent>
      </div>
    
  );
}

三、 组件的事件绑定

前端开发所有交互都是基于事件

语法:

on + 事件名称 ={事件处理程序}

例如  :

function Hello(){
  const clickHandler = () =>{
    console.log('函数组件中的事件被触发了');
  }
  return <div onClick={clickHandler}>hello这是一个函数组件</div>
}

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

类组件中例子,注意回调函数的写法,标准写法,实际工作中的写法

class HelloComponent extends React.Component{
  //事件回调函数 类中有写法差别
  //回调函数不加const 这是标准写法,避免this指向问题
  //这样写,回调函数中的this 指向的是当前的组件实例对象
  clickHandler =()=>{
    console.log('类组件中的点击事件触发了');
  }
  render(){
    return <div onClick={this.clickHandler}>这是个一个类组件</div>
  }
}

四、获取事件对象

获取事件对象e只需要在事件的回调函数中补充一个形象e即可拿到

在函数组件中试一下,打印了一个对象,里面很多属性

function Hello(){
  const clickHandler = (e) =>{
    console.log('函数组件中的事件被触发了',e);
  }
  return <div onClick={clickHandler}>hello这是一个函数组件</div>
}

 为事件加个跳转

 右侧打印出,然后原页跳转了

如果只想打印,不想跳转,那就要拿到事件对象e去阻止默认行为

五、事件绑定传递额外参数

触发事件传递自定义参数怎么做?

改造事件绑定为箭头函数 在箭头函数中完成参数的传递

1、只需要一个额外参数 {clickHandler}   变成   {()=>clickHandler('自定义参数')}

2、既需要事件对象e也需要额外的参数 {(e)=>clickHandler(e,'自定义参数')}

function Testl(){
  const clickHandler=(msg)=>{
    console.log('函数组件的事件被触发了',msg)
  }
  return <div onClick={()=>clickHandler('this is msg')}>点击这里</div>
}

function Testl(){
  const clickHandler=(e,msg)=>{
    console.log('函数组件的事件被触发了',e, msg)
  }
  return <div onClick={(e) => clickHandler(e,'this is msg')}>点击这里</div>
}

 类组件的事件绑定

整体和函数组件方式差别不大

唯一需要注意的是 因为处于class类语境下,所定义事件回调函数以及写法有不同

定义的时候: class Fields语法

使用的时候: 需要借助this关键词获取

import React from "react";
class CComponent extends React.Component {
  // class Fields
  clickHandler1 = (e, num) => {
    // 这里的this指向的是正确的当前的组件实例对象
    // 可以非常方便的通过this关键词拿到组件实例身上的其他属性或者方法
    console.log(this);
  };

  clickHandler2() {
    // 这里的this 不指向当前的组件实例对象而指向undefined 存在this丢失问题
    console.log(this);
  }

  render() {
    return (
      <div>
        <button onClick={(e) => this.clickHandler1(e, "123")}>click me 1</button>
        <button onClick={this.clickHandler2}>click me 2</button>
      </div>
    );
  }
}

function App() {
  return (
    <div>
      <CComponent />
    </div>
  );
}

export default App;

 

六、组件状态

学习目标:能够为组件添加状态和修改状态的值

在React hook 出来之前,函数式组件是没有自己的状态的,这里统一通过类组件来学习

初始化状态、读取状态、修改状态、影响视图

初始化状态

  • 通过class的实例属性state来初始化
  • state的值是一个对象结构,表示一个组件可以有多个数据状态
    class Counter extends React.Component {
      // 初始化状态
      state = {
        count: 0
      }
      render() {
        return <button>计数器</button>
      }
    }

    读取状态

  • 通过this.state来获取状态
    class Counter extends React.Component {
      // 初始化状态
      state = {
        count: 0
      }
      render() {
        // 读取状态
        return <button>计数器{this.state.count}</button>
      }
    }

    修改状态

//组件状态 类组件演示
import React from "react"
class TestComponent extends React.Component{
  //1.定义组件状态
  state={
    //这里可以定义各种属性,全是当前组件的状态
    name:'ggbond'
  }
 
//事件回调函数 
changName=()=>{
  //3.修改状态
  //注意不可以直接赋值修改,必须通过一个方法setState
  this.setState(
    {name:'eebond'}
  )
}

  render(){
    //使用状态
    return (
    <div>
      this is TestComponent
      当前name为:{this.state.name}
      <button onClick={this.changName}>修改name</button>
      </div>)
  }
}

//根组件
function App(){
  return (
    <div>
      <TestComponent/>

    </div>
  )
}
export default App

 点击后 

  • 语法
    this.setState({ 要修改的部分数据 })
  • setState方法作用
  1. 修改state中的数据状态      2.更新UI
  • 思想
    数据驱动视图,也就是只要修改数据状态,那么页面就会自动刷新,无需手动操作dom
  • 注意事项
    不要直接修改state中的值,必须通过setState方法进行修改

 总结:

1.编写组件其实就是编写原生类或者函数

2.定义状态必须通过state实例属性的方法提供一个对象,名称是固定的就叫做state

3.修改state中的任何属性 都不可以通过直接赋值 ,必须走setState方法 ,这个方法来自于继承得到

4.这里的this关键词,很容易出现指向错误,注意规范写法

(事件回调函数 类中有写法差别,回调函数不加const 这是标准写法,避免this指向问题,这样写,回调函数中的this 指向的是当前的组件实例对象)

类组件现在很少用,但老项目维护需要,这里是巩固基础

七、组件-状态修改counter案例

//通过类组件修改状态的方式 counter
import React from "react"
class Counter extends React.Component{
  //通过state定义组件状态
  state={
    count:0
  }

  //huitiaohanshu 
  changeCount =()=>{
    //修改state
    //react体系下 ‘数据不可变’ 要setState
    this.setState(
      {count:this.state.count + 1}
    )
  }
    render(){
      return (
      <button onClick={this.changeCount}>{this.state.count}click</button>
      )
    }
}

//根组件
function App(){
  return (
    <div>
      {/*渲染counter */}
      <Counter />
    </div>
  )
}

export default App

 八、this问题说明

之前,写react很麻烦,需要时刻注意this指向哪里,但现在不是事了,随着js标准的发展,主流的写法已经变成了class fields,无需考虑太多this问题


import React from "react"
//this有问题的写法
class Test extends React.Component{

  constructor(){
    super()
    //用bind强行修正我们的this指向
    //相当于在类组件初始化阶段 就可以把回调函数的this修正到
    //永远指向当前组件实例对象
    this.handler=this.handler.bind(this)
  }
  handler(){
      console.log(this)
      //这里用this.setstate去修改数据还行吗?会报错
      //老辈会这样做 construtor强绑定一个
  }

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

//根组件
function App(){
  return (
    <div>
      <Test/>
    </div>
  )
}

export default App

未修正前:

 强行修正this指向后:  得到对象

 还有一个做法

箭头函数


import React from "react"
//this有问题的写法
class Test extends React.Component{

  
  handler(){
      console.log(this)
      
  }

  render(){
    console.log('父函数里的this指向为:',this)
    return (
      //不用constructor修正,直接在时间绑定的位置
      //通过箭头函数 直接沿用父函数中的this指向也是可以的,这里父函数是render
      //那我们的箭头函数中的this直接沿用 也是
      <button onClick={()=> this.handler() }>click</button>
    )
  }
}

//根组件
function App(){
  return (
    <div>
      <Test/>
    </div>
  )
}

export default App

同样出来的也是对象

 看下父函数this指向

注意

没必要用这两个修正方案,知道有这两个方法就行,只需要记住案例中的标准写法就行 

九、总结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/932833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.16 TCP 协议有什么缺陷?

目录 升级 TCP 的工作很困难 TCP 建立连接的延迟 TCP 存在队头阻塞问题 网络迁移需要重新建立 TCP 连接 升级 TCP 的工作很困难&#xff1b;TCP 建立连接的延迟&#xff1b;TCP 存在队头阻塞问题&#xff1b;网络迁移需要重新建立 TCP 连接&#xff1b; 升级 TCP 的工作很…

Docker(md版)

Docker 一、Docker二、更换apt源三、docker搭建四、停启管理五、配置加速器5.1、方法一5.2、方法二 六、使用docker运行漏洞靶场1、拉取tomcat8镜像2、拉取成功3、开启服务4、查看kali的IP地址5、访问靶场6、关闭漏洞靶场 七、vulapps靶场搭建 一、Docker Docker是一个开源的应…

Pushmall 推熵共享电商平台 - 共享链盟

Pushmall 推熵共享电商平台 - 共享链盟以 Pushmall 推熵 B2B/B2C 批零采销订货商城系统为基础&#xff0c;以‘平台自营、供应商入驻、商家自营 商圈链盟 共享会员制&#xff0c;实现 S2B2B2C 商业模式’&#xff0c;是一款为实体商家服务的电商营销推广平台。以 “共创、共生…

算法笔记:球树

1 KD树的问题 算法笔记&#xff1a;KD树_UQI-LIUWJ的博客-CSDN博客 在kd树中&#xff0c;导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体&#xff0c;而求最近邻时使用的是欧式距离&#xff08;超球&#xff09;。超方体与超球体相交的可能性是极高…

MTK6833_MT6833核心板_天玑700安卓5G核心板规格性能介绍

MTK6833安卓核心板采用台积电 7nm 制程的5G SoC&#xff0c;2*Cortex-A766*Cortex-A55架构&#xff0c;搭载Android12.0操作系统&#xff0c;主频最高达2.2GHz 。内置 5G 双载波聚合技术&#xff08;2CC&#xff09;及双 5G SIM 卡功能&#xff0c;实现优异的功耗表现及实时连网…

基于MATLAB的径向基函数插值(RBF插值)(一维、二维、三维)

基于MATLAB的径向基函数插值&#xff08;RBF插值&#xff09;&#xff08;一维、二维、三维&#xff09; 0 前言1 RBF思路2 1维RBF函数2.1 参数说明2.1.1 核函数选择2.1.2 作用半径2.1.3 多项式拟合2.1.4 误差项&#xff08;光滑项&#xff09; 3 2维RBF函数4 3维RBF函数 惯例声…

【头歌】构建哈夫曼树及编码

构建哈夫曼树及编码 第1关:构建哈夫曼树 任务描述 本关任务:构建哈夫曼树,从键盘读入字符个数n及这n个字符出现的频率即权值,构造带权路径最短的最优二叉树(哈夫曼树)。 相关知识 哈夫曼树的定义 设二叉树具有n个带权值的叶子结点{w1,w2,...,wn},从根结点到每个叶…

解决MyBatis不能将表中含有下划线的字段映射到实体属性的两种方案

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 问题描述 MyBatis不能准确地将表中含有下划线的字段映射到实体属性。例如&#xff1a;表中的列名为&#xff1a;user_name&#xff0c;实体类中的属性为&#xff1a;userNa…

深度学习5:长短期记忆网络 – Long short-term memory | LSTM

目录 什么是 LSTM&#xff1f; LSTM的核心思路 什么是 LSTM&#xff1f; 长短期记忆网络——通常被称为 LSTM&#xff0c;是一种特殊的RNN&#xff0c;能够学习长期依赖性。由 Hochreiter 和 Schmidhuber&#xff08;1997&#xff09;提出的&#xff0c;并且在接下来的工作中…

《C和指针》笔记10:作用域

结合上面的例子讲解C语言的作用域。 1. 代码块作用域 (block scope) 位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域 (block scope)&#xff0c;表示它们可以被这个代码块中的所有语句访问。上图中标识为6、7、9、10的变…

2000-2021年地级市产业升级、产业结构高级化面板数据

2000-2021年地级市产业升级、产业结构高级化面板数据 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;地级市 3、指标&#xff1a;年份、地区、行政区划代码、地区、所属省份、地区生产总值、第一产业增加值、第二产业增加值、第三产业增加值、第一产业占GDP比重、第二…

Nacos配置管理服务

统一配置管理 功能&#xff1a;对配置文件相同的微服务进行配置文件的统一管理。 统一配置管理是解决场景&#xff1a;普通情况下&#xff0c;多个相同功能的微服务实例&#xff0c;更改配置的话得一个一个更改后重启的情况。 核心配置放在配置管理服务中&#xff0c;启动时…

【小沐学Unity3d】3ds Max 骨骼动画制作(Mixamo )

文章目录 1、简介2、基本操作2.1 Characters&#xff08;角色&#xff09;2.2 Animations&#xff08;动画&#xff09; 3、常见问题FAQ3.1 问题一3.2 问题二 结语 1、简介 官网地址&#xff1a; https://www.mixamo.com/#/ 使用 Mixamo 上传和装配 Adobe Fuse CC 3D 人物、自…

数据结构(Java实现)-栈和队列

栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 先进后出 栈的使用 栈的模拟实现 上述的主要代码 public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem new int[5];}Overridepublic …

iPhone 15 Pro与谷歌Pixel 7 Pro:哪款相机手机更好?

考虑到苹果最近将更多高级功能转移到iPhone Pro设备上的趋势,今年秋天iPhone 15 Pro与谷歌Pixel 7 Pro的对决将是一场特别有趣的对决。去年发布的iPhone 14 Pro确实发生了这种情况,有传言称iPhone 15 Pro再次受到了苹果的大部分关注。 预计iPhone 15系列会有一些变化,例如切…

G. The Morning Star - 思维

分析&#xff1a; 直接暴力就会tle&#xff0c;不知道怎么下手&#xff0c;可以统计八个方向一条线上的所有坐标&#xff0c;这些坐标一定可以放在一起满足&#xff0c;分析都有哪些线&#xff0c;当横坐标相同时会有竖着的一条线都可以&#xff0c;也就是x c&#xff0c;当纵…

服务器安全-禁止ping

1、临时禁ping #禁ping echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all#启用ping echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 2.永久禁ping(如果有此配置就无需重复添加,仅更新值即可) #禁ping echo "net.ipv4.icmp_echo_ignore_all1" >>…

【Linux】进程通信 — 信号(上篇)

文章目录 &#x1f4d6; 前言1. 什么是信号1.1 认识信号&#xff1a;1.2 信号的产生&#xff1a;1.3 信号的异步&#xff1a;1.4 信号的处理&#xff1a; 2. 前后台进程3. 系统接口3.1 signal&#xff1a;3.1 - 1 不能被捕捉的信号 3.2 kill&#xff1a;3.2 - 1 killall 3.3 ra…

15.live555mediaserver-rtp打包

live555工程代码路径 live555工程在我的gitee下&#xff08;doc下有思维导图、drawio图&#xff09;&#xff1a; live555 https://gitee.com/lure_ai/live555/tree/master 章节目录链接 0.前言——章节目录链接与为何要写这个&#xff1f; https://blog.csdn.net/yhb1206/art…

每天一道动态规划——第一天

动态规划一定要去尝试&#xff01;题目一&#xff1a; 1&#xff09;题目描述 一共有N个位置&#xff0c;机器人从当前位置cur走到目标位置aim&#xff0c;有res步可以走&#xff0c;问一共有多少种方法。 题目示例&#xff1a; 1 2 3 4 5 6 N6|cur2|aim3|res3 结果&#xf…