【React】组件的创建与事件绑定

news2025/1/18 9:04:24

📘前言

🚩🚩🚩
💎个人主页: 阿选不出来
💨💨💨
💎个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记.
💨💨💨
💎目前开发的专栏: JS 🍭Vue🍭
💨💨💨

文章目录

    • 📘前言
    • 一、React介绍
    • 二、create-react-app
      • 搭建本地开发环境
      • 编写一个程序
      • JSX语法
    • 三、组件的创建
      • 1.Class组件
      • 2.函数式组件
      • 3.组件的嵌套
      • 4.组件的样式
    • 四、事件绑定
        • 面试题

一、React介绍

  1. React起源与发展

    React起源于Facebook的内部项目,因为该公司对市场上所有JavaScript MVC框架都不满意,就决定自己写一套,用来架设Instagram的网站。做出来后,发现这套东西很好用,就在2013年5月开源了。

  2. React与传统MVC的关系

    1. 轻量级的视图库!A JavaScript library for building user interfaces
    2. React不是一个完整的MVC框架,最多可以认为是MVC中的V(View),甚至React并不非常认可MVC开发模式,React构建页面UI的库。可以简单理解为,React将界面分成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,就成了我们的页面。
  3. React的特性

    1. 声明式设计-React采用声明范式,可以轻松描述应用。
    2. 高效-React通过对DOM的模拟(虚拟dom),最大限度地减少与DOM的交互。
    3. 灵活-React可以与已知的库或框架很好的配合。
    4. JSX-JSX是JavaScript语法的扩展。
    5. 组件-通过React构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中。
    6. 单向响应的数据流-React实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单。
  4. 虚拟DOM

    DOM操作非常昂贵。我们都知道在前端开发中,性能消耗最大的就是DOM操作,而且这部分代码会让整体项目的代码变得难以维护。React把真实DOM树转换成JavaScript对象树,也就是VirtualDOM。

二、create-react-app

搭建本地开发环境

首先确保你安装了较新版本的Node.js

1、全局安装create-react-app

$ npm install -g create-react-app

创建一个项目

$ create-react-app your-app //注意命名方式

在这里插入图片描述

2、如果不想全局安装,可以直接使用npx

$ npx create-react-app myapp //也可以实现相同的效果

出现如下命令,就表示安装成功啦!
在这里插入图片描述

根据上图的提示,cd myapp进入目录并输入 npm start命令,即可运行项目。

编写一个程序

React17版本之前

    import React from 'react' 
    import ReactDOM from 'react-dom' // ReactDOM 可以帮助我们把 React 组件渲染到页面上。

    ReactDOM.render(<div>111</div>,document.getElementById("root")) 

ReactDOM中的Render方法,功能就是把组件渲染并且构造 DOM 树,然后插入到页面上某个特定的元素上。

这种HTML代码与JavaScript代码混写的语法"在JavaScript写的标签的语法中叫"JSX"。

React18版本

import {createRoot} from 'react-dom/client'
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<div>111</div>)

JSX语法

JSX 将 HTML 语法直接加入到 JavaScript 代码中, 再通过翻译器转换到纯JavaScript后由浏览器执行。在实际开发中,JSX在产品打包阶段都已经编译成了纯 JavaScript,不会带来任何副作用,反而会让代码更加直观并易于维护。

编译过程由Babel 的 JSX 编译实现。

如何用 JavaScript 对象表示一个DOM元素的结构?

看下面的DOM结构

<div class="app" id="root">
    <h1 class="title">
        欢迎进入react世界
    </h1>
    <p>
        react.js是一个帮助你构建页面UI的库
    </p>
       
</div>

用JavaScript对象表示:

{
	tag: 'div',
	arrrs: {className: 'app', id: 'appRoot'},
	children: [
		{
			tag:'h1',
        	attrs: {className: 'title'},
        	children: ['欢迎进入react世界']
		}{
        	tag: 'p',
        	attrs:null,
        	children: ['React.js是一个构建页面 UI 的库']
    	}
	]
}

但是用Javascript 写起来太长了,结构看起来也不清晰,用HTML的方式写起来就方便多了。

于是React.js就把JavaScript的语法扩展了一下,让JavaScript语言能够支持这种直接在Javacript代码里面编写类似HTML标签结构的语法。这样写起来就方便多了。编译的过程会把类似HTML的JSX 的结构转换成JavaScript对象的结构。

下面代码:

import React from 'react'
import ReactDOM from 'react-dom'

class App extends React.component{
    render() {
        return (
        	React.createElement(
            	"div",
             	{
                    className: 'app',
                    id: 'appRoot'
                },
     			React.createElement(
                	"h1",
                    {
                        className: 'title'
                    },
                    "欢迎进入react的世界"
                ),
         		React.createElement(
                	"p",
                    null,
                    "React.js是一个构建页面 UI 的库"
                )
            )
        )
    }
}

ReactDOM.render(
	React.createElement(APP),
    document.getElementById('root')
)

React.createElement会构建一个JavaScript对象来描述你HTML结构的信息,包括标签名,属性,还有子元素等,语法为

React.createElement(
	type,
    [props],
    [...children]
)

所谓的JSX就是JavaScript 对象,所以使用React和JSX的时候一定要经过编译的过程。

JSX—使用react构造组件,babel进行编译 —> JavaScript对象 —> ReactDOM.render()—>DOM元素—>插入页面

三、组件的创建

1.Class组件

ES6的加入让JavaScript直接支持使用class来定义一个类,React创建组件的方式就是使用的类的继承,Es6 class 是目前官方推荐的使用方式,它使用了ES6标准语法来构建,看以下代码:

import React from "react"
import {createRoot} from 'react-dom/client'
class App extends React.Component{
    //jsx写法
    render(){
        return <div>hello react Component</div>
    }
}
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App></App>)

2.函数式组件

在react16.8版本之前,函数式组件又称无状态组件

16.8版本之后,函数式组件与class组件无差别

import React from "react"
import {createRoot} from 'react-dom/client'
function App(){
    return (
        <div>
            hello functional Component
        </div>
    )
}
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App></App>)

3.组件的嵌套

import React, { Component } from 'react'
import {createRoot} from 'react-dom/client'
class Navbar extends Component{
    render(){
        return <div>navbar</div>
    }
}

function Swiper(){
    return <div>swiper</div>
}

const Tabbar = ()=><div>Tabbar</div>

//以上三种写法都能创建组件

export default class App extends Component {
  render() {
    return (
        <div>
            <Navbar></Navbar>
            <Swiper></Swiper>
            <Tabbar></Tabbar>
        </div>
    )
  }
}

const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App></App>)

4.组件的样式

{} 单花括号里面识别变量、支持运算

export default class App extends Component {
  render() {
      var myname = "Sblue"
      return (
        <div>
            {10+20}-{myname}
            {10>20?'aaa':'bbb'}
        </div>
      )
  }
}

行内样式写法

export default class App extends Component {
  render() {
      var obj = {
        background:"yellow"
      }
      return (
        <div>
            <div style={obj}>1111</div>
        </div>
      )
  }
}

引入css文件的写法

import React, { Component } from 'react'
import './css/index.css' //导入css模块, webpack的支持。

export default class App extends Component {
  render() {
      return (
        <div>
            <div className="active">22222222</div>
        </div>
      )
  }
}

类名采用 className 属性。

补充:

当我们使用label标签的for属性与input标签的id属性相匹配时,react用htmlfor来代替,因为在js中也能识别for这个关键字,避免发生冲突,用htmlfor表示label标签的for属性与js中for的关键字相区别。

<label htmlfor="username">用户名:</label>
            <input type="text" id="username"/>

四、事件绑定

事件绑定的四种方法:

首先定义一个变量: a=100

1.直接在render里写行内的箭头函数

        <button onClick={ ()=>{
            console.log(this.a,'处理逻辑过多时,不推荐使用')
        } }>add1</button>

2.在组件内使用箭头函数定义一个方法 (比较推荐)

 <button onClick={ () => {
          this.handleClick4() //比较推荐
        }}>add4</button>

 handleClick4 = ()=>{
  console.log("click4",this.a)
 }

3.直接在组件内定义一个非箭头函数的方法,然后再render里直接使用onClick={this.handleClick.bind(this)}(不推荐)

  <button onClick={ this.handleClick2.bind(this) }>add2</button>
  handleClick2(){
    console.log("click2",this.a);
 }

第三种写法直接写成this.handleClick2调用handleClick函数,该函数中this不指向App类,需要使用bind()方法改变this指向

4.直接在组件内定义一个非箭头函数的方法,在constructor里bind(this)(推荐)

<button onClick={this.handleClick3}>add3</button>
  handleClick3 = ()=>{
    console.log("click3",this.a,)
  }

面试题

react事件绑定与原生事件绑定有什么区别?

React并不会真正的绑定事件到每一个具体《》的元素上,而是采用时间代理的模式。

Event对象

和普通浏览器一样,事件handler会被自动传入一个 event对象, 这个对象和普通的浏览器 event对象所包含的方法和属性都基本一致。不同的是React中的 event对象并不是浏览器提供的,而是它自己内部构建的。它同样具有 event.stopPropagation event.preventDefault这种常用的方法。

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

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

相关文章

C规范编辑笔记(十三)

往期文章&#xff1a; C规范编辑笔记(一) C规范编辑笔记(二) C规范编辑笔记(三) C规范编辑笔记(四) C规范编辑笔记(五) C规范编辑笔记(六) C规范编辑笔记(七) C规范编辑笔记(八) C规范编辑笔记(九) C规则编辑笔记(十) C规范编辑笔记(十一) C规范编辑笔记(十二) 正文&#xff…

CSS背景:背景色/背景图像/背景重复/背景附着/简写背景属性(一文搞懂)

目录 CSS背景 CSS 背景色 实例 其他元素 实例 不透明度 / 透明度 实例 使用 RGBA 的透明度 实例 CSS 背景图像 实例 实例 实例 CSS 背景重复 实例 实例 CSS background-repeat: no-repeat 实例 CSS background-position 实例 CSS 背景附着 实例 实例 C…

linux系统中利用QT实现视频监控的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何利用QT实现视频监控的基本操作。 目录 第一&#xff1a;视频监控基本简介 第二&#xff1a;实验流程图 第三&#xff1a;视频监控之服务器 第四&#xff1a;视频监控之客户端实现 第一&#xff1a;视频监控基本简…

Java基础之《netty(30)—RPC调用流程分析》

一、RPC基本介绍 1、RPC&#xff08;Remote Procedure Call&#xff09;—远程过程调用&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序无需额外的为这个交互作用编程。 2、两个或多个应用程序都分布在不同的…

Kettle(4):excel数据抽取到mysql

1 准备工作 1.1 准备Excel文件 我这边直接使用上一篇导出的excel:file_user.xls 1.2 创建数据库 在mysql中创建数据库 1.3 在kettle中加载MySQL驱动 Kettle要想连接到MySQL&#xff0c;必须要安装一个MySQL的驱动&#xff0c;就好比我们装完操作系统要安装显卡驱动一样。加…

CMMI之工程类

工程类过程域涵盖了工程学科所共有的开发与维护活动。工程类过程域的书写使用了通用的工程术语&#xff0c;这样&#xff0c;涉及产品开发过程&#xff08;如软件工程、机械工程等&#xff09;的任何技术学科都能够将其用于过程改进。工程类过程域还将不同工程学科的关联过程整…

分享111个ASP源码,总有一款适合您

ASP源码 分享111个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 111个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1Afx8CxZIGwcGWB6aUOssZg?pwdr81w 提取码&#x…

CPU缓存架构缓存一致性协议详解

一、CPU高速缓存&#xff08;Cache Memory&#xff09;1.1 CPU高速缓存CPU缓存即高速缓冲存储器&#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存&#xff0c;CPU直接从内存中存取数据要等待一定时间周期&#xff0c;Cache中保存着…

《你当像鸟飞往你的山》教育让你内心的山更高,更广

《你当像鸟飞往你的山》教育让你内心的山更高&#xff0c;更广 塔拉韦斯特弗&#xff0c;美国作家、历史学家。1986年生于美国爱达荷州的山区。自学考取杨百翰大学&#xff0c;2009年获得剑桥大学哲学硕士学位&#xff0c;2014年获剑桥大学历史学博士学位。2018年出版处女座《你…

2023 年8个ChatGPT 的替代品

OpenAI 于 2022 年 11 月下旬推出的 ChatGPT 在网络世界引起了不小的轰动。它不仅引起了社交媒体用户的关注&#xff0c;也引起了各大媒体的关注。 这种先进的 AI 技术不仅可以根据命令生成、重写和汇总文本&#xff0c;还可以与用户进行交互。它会记住以前的对话&#xff0c;…

[论文翻译] Improving Knowledge Tracing via Pre-training Question Embeddings

摘要 知识追踪 (KT) 定义了根据学生的历史反应预测他们是否能正确回答问题的任务。尽管许多研究致力于利用问题信息&#xff0c;但问题和技能中的大量高级信息尚未被很好地提取&#xff0c;这使得以前的工作难以充分执行。在本文中&#xff0c;我们证明了通过在丰富的边信息上…

通过属性配置文件编写JDBC程序

package com.bjpowernode.jdbc;import java.sql.*; import java.util.ResourceBundle; /* 编程思想&#xff1a;将连接数据库时可变化的4条信息都写到配置文件中&#xff0c;以后需要连接其他数据库的时候&#xff0c;可直接修改配置文件&#xff0c;不用修改java程序。这4个信…

【LeetCode高频100题-3】冲冲冲(持续更新23.1.22)

文章目录62. 不同路径题意解法1 排列组合解法2 动态规划64. 最小路径和题意解法1 DFS&#xff08;剪枝也超时&#xff09;解法2 动态规划62. 不同路径 题意 一道数学题&#xff0c;排列组合/小学奥赛题。动态规划不是一般来解决最值问题的吗&#xff0c;这道题为什么会想到dp…

狂神。JVM入门学习笔记。

JVM学习 JVM常见面试题&#xff1a; 请你谈谈你对jvm的理解&#xff1f;Java8虚拟机和之前的变化更新&#xff1f;什么是OOM&#xff1f;什么是栈溢出StackOverFlowError&#xff1f;怎么分析&#xff1f;jvm的常见调优参数有哪些&#xff1f;内存快照如何抓取&#xff1f;怎么…

【JavaSE】保姆级教程|1万字+10张图学会类与对象--建议收藏

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记【从小白到大佬之路】 ✈往期博文回顾: 【爪洼岛冒险记】第5站&#xff1a;多图解&#xff0c;超详细讲解Java中的数组、二维数组…

weston 1: 编译与运行傻瓜教程

sudo apt-get update sudo apt-get upgrade vim ~/.bashrc export WLD$HOME/install export LD_LIBRARY_PATH$WLD/lib export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/home/zzj/install/lib/x86_64-linux-gnu/pkgconfig/ source ~/.bashrc 配置路径 此处根据个人电脑配置路径 …

高级Spring之BeanFactory的实现

Spring 的发展历史较为悠久&#xff0c;因此很多资料还在讲解它较旧的实现&#xff0c;这里出于怀旧的原因&#xff0c;把它们都列出来&#xff0c;供大家参考 DefaultListableBeanFactory&#xff0c;是 BeanFactory 最重要的实现&#xff0c;像控制反转和依赖注入功能&#x…

十六进制转八进制+超大数据处理(蓝桥杯基础练习C/C++)

目录 1 题目要求 2 代码 2.1 以十进制为媒介&#xff08;不可行&#xff09; 2.2 以二进制为媒介 3 可能会遇到的难点 4 结论 5 延伸 5.1 超大数据阶乘 5.2 超大数据加法 5.3 以十进制为媒介的进制转换 1 题目要求 2 代码 2.1 以十进制为媒介&#xf…

【LeetCode】一文吃透回溯算法(附例题)

回溯 DFS 算法深入浅出&#xff0c;一文吃透&#xff01; 原文同步在&#xff1a;https://github.com/EricPengShuai/Interview/blob/main/algorithm/回溯算法.md 回溯算法 主要参考的是 liweiwei 的总结 0. 概念 回溯法 采用试错的思想&#xff0c;它尝试分步的去解决一个问题…

MATLAB | 如何使用MATLAB绘制韦恩图的高阶版本:upset图

韦恩图随着阶数升高会越来越复杂&#xff0c;当阶数达到7或者以上时几乎没办法绘制&#xff1a; 但是使用upset图却可以比较轻易的绘制&#xff1a; 两种类型图的对应关系&#xff1a; 这期便教大家如何绘制这样的upset图&#xff1a; 教程部分 0 数据准备 数据需要的是0,1矩…