React(coderwhy)- 01

news2024/10/5 9:32:33

React的介绍(技术角度)

React是什么?
  1. React:用于构建用户界面的 JavaScript 库
  2. React的官网文档https://zh-hans.reactjs.org/

React的特点:

  1. 声明式编程
  2. 组件化开发
  3. 多平台适配

Hello React

react需要3个依赖,( 可以使用官方CDN )

  1. react : 包含react所必须的核心代码
  2. react_dom : react渲染在不同平台所需要的核心代码
  3. babel :将jsx转换成React代码的工具
  <div id="app"></div>
  
  <script src="./lib/react.js"></script>
  <script src="./lib/react_dom.js"></script>
  <script src="./lib/babel.js"></script>
  <script type="text/babel">
    // 1.定义变量
    const message = "Hello World"

    // 2.渲染内容
    const root = ReactDOM.createRoot(document.querySelector("#app"))
    root.render(<h2>{message}</h2>)
  </script>

点击按钮修改内容:

   需要只用render方法来修改

<script type="text/babel">
    // 1.定义变量
    let message = "Hello World"
    const btnClick = () => {
      message = "Hello React"
      render()
    }

    // 2.渲染内容
    const root = ReactDOM.createRoot(document.querySelector("#app"))
    render()

    function render() {
      root.render((
        <div>
          <h2>{message}</h2>
          <button onClick={btnClick}>修改文本</button>
        </div>
      ))
    }
  </script>

Hello React – 组件化开发

整个逻辑其实可以看做一个整体,那么我们就可以将其封装成一个组件:
        1. 我们说过 root.render 参数 是一个 HTML元素或者一个组件
        2. 所以我们可以先将之前的业务逻辑封装到 一个组件 中,然后传入到 ReactDOM.render 函数中的第一个参数;
在React中,如何封装一个组件呢? 这里我们暂时使用 类的方式 封装组件:
        1.  定义一个类 (类名大写,组件的名称是必须大写的,小写会被认为是HTML元素),继承自React.Component
        2.  实现当前组件的render函数
         render当中返回的jsx内容,就是之后React会帮助我们渲染的内容
  <script type="text/babel">
    function foo() {
      console.log("foo", this)
    }

    // 1.定义根组件
    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          message: "Hello World"
        }
      }

      changeText() {
        this.setState({ message: "Hello React" })
      }

      render() {
        return (
          <div>
            <h2>{this.state.message}</h2>
            <button onClick={this.changeText.bind(this)}>修改文本</button>
          </div>
        )
      }
    }

    // 2.渲染根组件
    const root = ReactDOM.createRoot(document.querySelector("#root"))
    root.render(<App/>)
  </script>

组件化 - 数据依赖

组件化问题一: 数据在哪里定义
在组件中的数据,我们可以分成两类:
        1. 参与界面更新的数据 :当数据变量时,需要更新组件渲染的内容;
        2. 不参与界面更新的数据 :当数据变量时,不需要更新将组建渲染的内容;
参与界面更新的数据我们也可以称之为是 参与数据流 ,这个数据是 定义在当前对象的state
        1. 我们可以通过在 构造函数中 this.state = {定义的数据}
        2. 当 我们的数据发生变化 时,我们可以 调用 this.setState 来更新数据 ,并且通知React进行update操作;
        在进行update操作时,就会 重新调用render函数 ,并且使用最新的数据,来渲染界面

组件化 – 事件绑定

组件化问题二:事件绑定中的this
        在类中直接定义一个函数,并且将这个函数绑定到 元素的onClick事件 上,当前 这个函数的this指向的是谁 呢?
默认情况下是undefined
        1.  很奇怪,居然是 undefined
        2. 因为在正常的DOM操作中,监听点击,监听函数中的this其实是节点对象(比如说是button对象);
        3.  这次因为React并不是直接渲染成真实的DOM,我们所编写的button只是一个语法糖,它的本质React的Element对象;
        4. 那么在这里发生监听的时候,react在执行函数时并没有绑定this,默认情况下就是一个undefined;
        
我们在绑定的函数中,可能想要使用当前对象,比如执行 this.setState 函数,就必须拿到当前对象的this
        1. 我们就需要在传入函数时,给这个函数直接绑定this
        2.  类似于下面的写法: <button onClick={this.changeText.bind(this)}>改变文本</button>

电影列表展示

<script type="text/babel">
    // 1.定义根组件
    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          message: "Hello App",
          movies: ["星际穿越", "大话西游", "盗梦空间", "少年派的奇幻漂流"]
        }
      }

      render() {
        return (
          <ul>
            {
              this.state.movies.map(item => {
                return <li key={item}>{item}</li>
              })
            }
          </ul>
        )
      }
    }

    // 2.渲染根组件
    const root = ReactDOM.createRoot(document.querySelector("#root"))
    root.render(<App/>)
  </script>

计数器案例

  <script>
    function foo() {
      console.log("foo:", this);
    }

    foo()

    // 1.定义根组件
    class App extends React.Component {
      constructor() {
        super()
        this.state = {
          counter: 0
        }
      }

      render() {
        const { counter } = this.state
        return (
          <div>
            <h2>当前计数: {counter}</h2>
            <button onClick={this.increment.bind(this)}>+1</button>
            <button onClick={this.decrement.bind(this)}>-1</button>
          </div>
        )
      }

      increment() {
        this.setState({
          counter: this.state.counter + 1
        })
      }
      decrement() {
        this.setState({
          counter: this.state.counter - 1
        })
      }
    }

    // 2.渲染根组件
    const root = ReactDOM.createRoot(document.querySelector("#root"))
    root.render(<App/>)
  </script>

VSCode代码片段

我们在前面练习React的过程中,有些代码片段是需要经常写的,我们在VSCode中我们可以生成一个代码片段,方便我们快速
生成。
VSCode中的代码片段有固定的格式,所以我们一般会借助于一个在线工具来完成。
具体的步骤如下:
        第一步,复制自己需要生成代码片段的代码;
        第二步, https://snippet-generator.app/ 在该网站中生成代码片段;
        第三步,在VSCode中配置代码片段;

React基础

JSX语法

这段element变量的声明右侧赋值的标签语法是什么呢?
        1.它不是一段字符串(因为没有使用引号包裹);
        2.它看起来是一段HTML元素,但是我们能在js中直接给一个变量赋值html吗?
        3.其实是不可以的,如果我们将 type="text/babel" 去除掉,那么就会出现语法错误;
        4.它到底是什么呢?其实它是一段 jsx的语法
JSX是什么?
        1.JSX是 一种JavaScript的语法扩展(eXtension),也在很多地方称之为JavaScript XML,因为看起就是一段XML语法
        2.它用于 描述我们的UI界面 ,并且其 完成可以和JavaScript融合在一起使用
        3.它 不同于Vue中的模块语法 ,你 不需要专门学习模块语法中的一些指令 (比如v-for、v-if、v-else、v-bind);
  <script type="text/babel">
    // 1.定义根组件
    const element = <div>Hello World</div>

    // 2.渲染根组件
    const root = ReactDOM.createRoot(document.querySelector("#root"))
    root.render(element)
  </script>
为什么React选择了JSX  ?
React认为 渲染逻辑 本质上 与其他UI逻辑 存在内在耦合
        1.比如 UI需要绑定事件 (button、a原生等等);
        2.比如 UI中需要展示数据状态;
        3.比如 在某些状态发生改变时,又需要改变UI
他们之间是 密不可分 ,所以React 没有将标记分离到不同的文件 中,而是 将它们组合到了一起 ,这个地方就是 组件(Component)
         当然,后面我们还是会继续学习更多组件相关的东西;
在这里,我们只需要知道,JSX其实是嵌入到JavaScript中的一种结构语法;
JSX的书写规范:
        1.JSX的顶层 只能有一个根元素 ,所以 我们很多时候会在外层包裹一个div元素 (或者使用后面我们学习的Fragment);
        2.为了方便阅读,我们通常在jsx的外层包裹一个小括号(),这样可以方便阅读,并且jsx可以进行换行书写;
        3.JSX中的标签可以是 单标签 ,也可以是 双标签
        注意:如果是单标签,必须以/>结尾;

JSX的基本使用

jsx中的注释
{/*  要注释的内容  */}
JSX嵌入变量作为子元素
 情况一 :当变量是 Number、String、Array类型 时,可以直接显示
情况二 :当变量是 null、undefined、Boolean类型 时,内容为空;
如果希望可以显示null、undefined、Boolean,那么需要转成字符串;
转换的方式有很多,比如toString方法、和空字符串拼接,String(变量)等方式;
情况三 Object对象类型 不能作为子元素(not valid as a React child)
JSX嵌入表达式
运算表达式
三元运算符
执行一个函数
jsx绑定属性
比如元素都会有 title属性   :  使用{xxx变量}的方式绑定 ==>   <h2 title={title}><h2/>
比如img元素会有 src属性 
比如a元素会有 href属性 
比如元素可能需要 绑定class  :  三元表达式、数组、 第三方库
比如原生使用 内联样式style : {{ key  value }} ,不能写- ,要写驼峰

JSX的事件绑定

如果原生DOM原生有一个监听事件,我们可以如何操作呢?
方式一:获取DOM原生,添加监听事件;
方式二:在HTML原生中,直接绑定onclick;
在React中是如何操作呢? 我们来实现一下React中的事件监听,这里主要有两点不同
React 事件的 命名采用小驼峰式(camelCase),而不是纯小写
我们需要 通过{}传入一个事件处理函数 ,这个函数会在事件发生时被执行;
this的绑定问题
在事件执行后,我们可能需要获取当前类的对象中相关的属性,这个时候需要用到this
如果我们这里直接打印this,也会发现它是一个undefined
为什么是undefined呢?
原因是btnClick函数并不是我们主动调用的,而且当button发生改变时,React内部调用了btnClick函数;
而它内部调用时,并不知道要如何绑定正确的this;
如何解决this的问题呢?
方案一 :bind给btnClick显示绑定this
方案二 :使用 ES6 class fields 语法
方案三 :事件监听时传入箭头函数(个人推荐)
事件参数传递
在执行事件函数时,有可能我们需要获取一些参数信息:比如event对象、其他参数
情况一:获取event对象
很多时候我们需要拿到 event对象 来做一些事情(比如阻止默认行为)
那么默认情况下, event对象有被直接传入 ,函数就可以获取到event对象;
情况二:获取更多参数
有更多参数时,我们最好的方式就是 传入一个箭头函数 主动执行的事件函数,并且传入相关的其他参数

JSX的条件渲染

  • if判断

  • 三元运算符

  • &&逻辑与

  • v-show实现效果

JSX的列表渲染

  • map高阶函数(重要)

  • filter

  • slice

循环要加 key

JSX的原理和本质

实际上,jsx 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖。
所有的jsx最终都会被转换成 React.createElement的函数 调用。
createElement需要传递三个参数:
参数一:type
当前ReactElement的类型;
如果是标签元素,那么就使用字符串表示 “div”;
如果是组件元素,那么就直接使用组件的名称;
参数二:config
所有jsx中的属性都在config中以对象的属性和值的形式存储;
比如传入className作为元素的class;
参数三:children
存放在标签中的内容,以children数组的方式进行存储;
当然,如果是多个元素呢?React内部有对它们进行处理,处理的源码在下方

购物车案例


React脚手架解析

认识脚手架工具

对于现在比较流行的三大框架都有属于自己的脚手架:
Vue的脚手架: @vue/cli
Angular的脚手架: @angular/cli
React的脚手架: create-react-app
它们的作用都是帮助我们生成一个通用的目录结构,并且已经将我们所需的工程环境配置好。
使用这些脚手架需要依赖什么呢?
目前这些脚手架都是 使用node编写 的,并且都是 基于webpack 的;
所以我们必须在自己的电脑上 安装node环境
这里我们主要是学习React,所以我们以React的脚手架工具: create-react-app作为讲解

create-react-app

创建Eeact项目

创建React项目的命令如下:
注意:项目名称 不能包含大写字母
另外还有更多创建项目的方式,可以参考GitHub的readme
创建完成后,进入对应的目录,就可以将项目跑起来:
创建React项目
create-react-app 项目名称
cd 01-test-react
yarn start

 了解 PWA

整个目录结构都非常好理解,只是有一个PWA相关的概念:
PWA全称 Progressive Web App ,即 渐进式WEB应用
一个 PWA 应用首先是 一个网页 , 可以 通过 Web 技术编写出一个网页应用
随后添加上 App Manifest Service Worker 来实现 PWA 的 安装和离线 等功能;
这种Web存在的形式,我们也称之为是 Web App
PWA解决了哪些问题呢?
可以 添加至主屏幕 ,点击主屏幕图标可以实现启动动画以及隐藏地址栏;
实现 离线缓存功能 ,即使用户手机没有网络,依然可以使用一些离线功能;
实现了 消息推送
等等一系列类似于Native App相关的功能;
更多PWA相关的知识,可以自行去学习更多;
https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps

webpack的配置

默认给隐藏起来了

从零编写代码
 

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

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

相关文章

【数字图像处理】骨骼锐化

源码链接&#xff1a;skeleton.cpp 一、实验要求 附件是人体骨骼核扫描图像&#xff0c;我们的目的是通过图像锐化突出骨骼的更多细节来增强图像。图像灰度的动态范围很窄并且有很高的噪声内容。 二、实验内容 按照课本冈萨雷斯的《数字图像处理》上面的思路&#xff0c;整…

【代码题】五道链表面试题

目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中倒数第k个结点 5.合并两个有序链表 1.移除链表元素 点击进入该题 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回新的头节点 。 思路&am…

CTF-AWD入门手册

引文 AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验&#xff0c;将真实网络安全防护设备设施加入抽象的网络环境中&#xff0c;模拟政府、企业、院校等单位的典型网络结构和配置&#xff0c;开展的一种人人对抗的竞赛方式&#xff0c;…

语言和文法的形式定义---编译原理

文法的构建问题 * 参考已有的模型 最经典的即是算数表达式的模型&#xff0c;其有多个算术运算符号和优先级别。 文法与正则表达式与有穷自动机的转换 显然是3型文法&#xff0c;也就是正则文法才有相应的性质&#xff0c;因为只有3型文法才是右部至多仅有两个符 号&#xf…

【Vue路由】props配置、replace属性、编程式路由导航、缓存路由组件

文章目录props配置props值为对象props值为布尔值props值为函数总结\<router-link>的replace属性总结编程式路由导航案例实现总结缓存路由组件案例实现总结props配置 我们可以看看我们原来如何使用传递过来的参数的&#xff1a; 我们要写一大长串去从$route身上拿到我们…

传统目标跟踪——光流法

目录 一、光流法 二、LK光流法 2.1 实现原理 2.2 API 三、代码 四、总结 一、光流法 光流&#xff1a;空间运动物体在观察成像平面上像素运动的瞬时速度。 光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧之间存在的对应关系&#xff0c;…

密码学_RSA

RSA是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是非…

dom截图的几种实现方式

前端要实现dom截图的功能&#xff0c;现在比较常用的是使用以下两个库 dom-to-image 使用svg技术实现html2canvas 使用canvas技术实现 如果想自己写一个dom截图的可以参考 dom-pointer 代码比较简单&#xff0c;非常适合拿来研究rasterizeHTML.js 目前rasterizeHTML.js已经被…

1231. 航班时间(恶心的输入处理 + 简单的数学)

题目如下&#xff1a; 题解 or 思路&#xff1a; 因为题目假设两次飞行时间是相同的&#xff0c;我们可以通过减法将时差消去。那么飞行时间就是: time1time22\frac{time_1 time2}{2}2time1​time2​ 题目的难点是处理输入&#xff0c;我们可以使用 sscanf 来进行处理&#x…

小程序开发经验分享(1)

账号搭建篇 1. 获取微信小程序的AppID 首先,我们需要拥有一个帐号,如果你能看到该文档,我们应当已经邀请并为你创建好一个帐号。注意不可直接使用服务号或订阅号的AppID。 利用提供的帐号,登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查…

MySQL高级 SQL优化【插入数据主键优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;插入数据 1.1.1&#xff1a;insert 1). 优化方案一&#xff08;批量插入数据) 2). 优化方案二&#xff08;手动控制事务&#xff09; 3). 优化方案三 &#xff08;主键顺序插入&#xff0c;性能要高于乱序插入。&#xff09; …

java应用集成HanLP进行中文自然语言分词详细完整案例以及demo

本文可以作为上一篇《mysql/mariadb 实现全文检索》的补充&#xff0c;实现对字符串分词的逻辑 什么是自然语言&#xff0c;什么是自然语言分词及例子 什么是自然语言 狭义地讲&#xff0c;利用计算机进行语言分析的研究是一门语言学与计算机科学的交叉学科&#xff0c;学术界…

CTFSHOW新手杯MISC部分WriteUp

引文 之前复现了CTFSHOW新人杯的WEB方向部分题目&#xff0c;今天就复现一下MISC为主的题目&#xff0c;可能有些读者不太明白MISC方向是什么意思&#xff0c;简单来说就是"杂项",包括&#xff1a;隐写&#xff0c;压缩包处理&#xff0c;流量分析&#xff0c;攻击取…

电容基础知识

电解电容负极有标识标有耐压值&#xff08;400V 450WV&#xff09; 容量 &#xff08;68UF&#xff09; 温度&#xff08;105摄氏度&#xff09;等 电容容量判断方法&#xff1a;直标法&#xff1a;上图&#xff0c;容量68微法&#xff0c;耐压值400V。数字表示法&#xff1a;方…

如何在公司审计中保持安全

如何在公司审计中保持安全 如今&#xff0c;财务弹性是决定您的公司能否在不确定时期适应和发展的主要属性之一。这可能令人很惊讶&#xff0c;但您的年度业务审计可以成为您提高业务敏捷性的秘密武器。它通过确定内部控制和财务报告的效果以及哪些流程改进应该在您的优先级列…

蓝桥杯Python练习题15-区间k大数查询

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式   第一行包含一个数n&#xf…

黑马Hive+Spark离线数仓工业项目-任务流调度工具AirFlow(2)

Oracle与MySQL调度方法 目标&#xff1a;了解Oracle与MySQL的调度方法 实施 Oracle调度&#xff1a;参考《oracle任务调度详细操作文档.md》 - step1&#xff1a;本地安装Oracle客户端 - step2&#xff1a;安装AirFlow集成Oracle库 - step3&#xff1a;创建Oracle连接 - ste…

ODT在手,DDR5布线可以任性走?

作者&#xff1a;一博科技高速先生成员 姜杰 ODT是On Die Termination的缩写&#xff0c;又叫片内端接&#xff0c;顾名思义&#xff0c;就是把端接电阻放在了芯片内部。作为一种端接&#xff0c;ODT可以减小反射&#xff0c;对信号质量的改善显而易见&#xff0c;SI攻城狮很…

家用宽带搭建个人服务器(二)

本文主要详记免费二级域名注册和免费DDNS解析 写在前头 近几年国内注册域名需要备案&#xff0c;域名解析服务商都陆续需要收费了&#xff0c;对于我这种想简单玩玩的人来说实在是太麻烦了(主要是费钱&#xff09;&#xff0c;花了点时间找到了免费域名注册和DDNS解析 本文基于…

Android绘制原理【通透版】

概述 Android 的显示过程可以简单概括为&#xff1a;Android 应用程序把经过测量、布局、绘制后的surface 缓存数据&#xff0c;通过 SurfaceFlinger 把数据渲染到显示屏幕上&#xff0c;通过 Android 的刷新机制 来刷新数据。也就是说应用层负责绘制&#xff0c;系统层负责渲…