【react】基础知识点学习

1. 创建项目

npm install -g create-react-app
npx create-react-app my-app
cd my-app
npm start

index.js为入口文件,App.js为根组件。
如何将react应用挂载在页面上? 将App组件渲染到id为root的DOM元素中
在这里插入图片描述在这里插入图片描述

2. JSX

JSX是|avaScript和XML(HTML)的缩写,表示在|S代码中编写HTML模版结构,它是React中编写UI模版的方式。
JSX并不是标准的S语法,它是JS的语法扩展,浏览器本身不能识别,需要通过解析工具(babel) 做解析之后才能在浏览器中运行。

左边是我们编写的代码,右边是在浏览器中运行的代码。
在这里插入图片描述
👻https://babeljs.io/ 这个网址中可以查看babel预览后的结果: 点击try it out --> 左侧勾选react

在这里插入图片描述
在这里插入图片描述

babel的作用有哪些?【扩展】
Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015+(ES6+)的代码转换为向后兼容的 JavaScript,使其能够在较老的浏览器或 JavaScript 运行环境中运行。Babel 具备以下主要作用:

  1. 语法转换:将现代 JavaScript 语法(如箭头函数、模板字符串、解构赋值等)转换为 ES5 或更低版本的代码,确保兼容性。
  2. Polyfill 提供:Babel 可以引入新的 JavaScript API(例如 Promise、Set 等)的 polyfill,从而在不支持这些 API 的环境中正常运行。(Polyfill 是一种代码或插件,用于在旧版本浏览器或不支持某些新功能的环境中“填补”缺失的功能。)
  3. 插件扩展:Babel 拥有丰富的插件系统,支持根据需要定制转换规则,如支持 TypeScript、React JSX 语法转换等。
  4. 代码优化:一些 Babel 插件可以帮助优化代码结构和性能,例如 Tree Shaking 以删除无用代码。
  5. 跨平台兼容:通过预设和插件的配置,Babel 可以根据不同的目标环境(如不同版本的浏览器或 Node.js)生成适用的代码。
  6. 工具集成:Babel 支持与许多前端构建工具集成,如 Webpack、Rollup,使得编译、打包和构建过程更加流畅。

JSX 规则

  1. 只能返回一个根元素 (可以用<div></div><></>包裹)
    👻<></>内不能添加 key,可以使用内置组件 Fragment
  2. 标签必须闭合
  3. 大部分属性命名使用驼峰式命名法

JSX的使用

1. 基础用法

function App() {const title = "你好";const getName = () => {return "张三";};return (<div className="App">{/*使用引号传递字符串  */}{"hello react"}{/* js变量 */}{title}{/*  函数调用 */}{getName()}{/* 方法调用 */}{new Date().toDateString()}{/* 使用js对象 */}<div style={{ color: "red" }}>123</div></div>);
}

2. 列表渲染

使用map进行遍历

function App() {const fruits = [{ id: 1, name: "Apple" },{ id: 2, name: "Banana" },{ id: 3, name: "Orange" },];return (<ul>{fruits.map((fruit) => (<li key={fruit.id}>{fruit.name}</li>))}</ul>);
}

key 需要满足的条件 【扩展】

  • key 值在兄弟节点之间必须是唯一的 (同级节点中) ,但不用要求全局唯一,在不同的数组中可以使用相同的 key。
  • key 值不能改变,否则就失去了使用 key 的意义!所以千万不要在渲染时动态地生成 key。
    注意:组件不会把 key 当作 props 的一部分。Key 的存在只对 React 本身起到提示,实际元素上并不会被渲染。
    注意:不要使用 index 作为 key,除非列表是静态的或者元素不会发生变化。因为 index 是可变的,删除、添加元素时可能导致 React 错误匹配和重渲染问题。

3. 条件渲染

逻辑与 &&: 前面值为true时,后面内容才会被渲染
三元运算: 用于两种情况的不同显示

function App() {const isLogin = true;return (<div>{/* 逻辑与 && */}{isLogin && <h1>hello</h1>}{/* 三元运算 */}{isLogin ? <h1>欢迎回来</h1> : <h1>请先登录</h1>}</div>);
}

注意: && 表达式 的左侧为 true 时,它则返回其右侧的值。但条件的结果是 false,则整个表达式会变成 false。在 JSX 里,React 会将 false 视为一个“空值”,不会进行任何渲染。但是在 vue中false会显示在页面上!

复杂条件渲染: 根据不同条件进行渲染

function App() {const getResult = (type) => {if (type === 0) {return <h1>hello</h1>;} else if (type === 1) {return <strong>hello</strong>;} else {return <i>hello</i>;}};return <div>{getResult(1)}</div>;
}

3. 绑定事件处理函数

绑定事件:使用onClick, 传入函数引用

function App() {const handleClick = () => {console.log("clicked");};return (<div><button onClick={handleClick}>click me</button></div>);
}

自定义传参

function App() {const handleClick = (msg) => {console.log(msg);}return (<div><button onClick={() =>handleClick('hi')}>click me</button></div>);
}

✨注意不能直接写函数调用,这里事件绑定需要一个函数引用。 如果写的是函数调用,会在页面渲染时就会被立即触发!!

同时传递事件对象自定义参数: 事件对象放在最后

function App() {const handleClick = (msg,e) => {console.log(msg,e);};return (<div><button onClick={(e) => handleClick("hi",e)}>click me</button></div>);
}

4. 自定义组件

// 定义组件
function MyButton() {const handleClick = (msg, e) => {console.log(msg, e);};return (<div><button onClick={(e) => handleClick("hi", e)}>click me</button></div>);
}
function App() {return (<div>{/* 使用组件 */}<MyButton /></div>);
}export default App;

5. useState

useState 是一个 React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果。
也就是当数据发生变化时,页面也会跟着变化。(数据驱动视图

const [state, setState] = useState(initialState)

1.useState是一个函数,返回值是一个数组
2.数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量(直接传递新状态,也可以传递一个根据先前状态来计算新状态的函数)
3.usestate中传入初始值

import { useState } from "react";function App() {const [count, setCount] = useState(0);const handleClick = () => {// 传入更新的值setCount(count + 1);};return (<div><button onClick={handleClick}>count:{count}</button></div>);
}export default App;

如果直接更改值,ui界面不会重新更新,所以更改值要通过setXXX()来进行更新。

import { useState } from "react";function App() {let [count, setCount] = useState(0);const handleClick = () => {count++;console.log(count);// 控制台中值会更新};return (<div><button onClick={handleClick}>count:{count}</button></div>);
}export default App;

在这里插入图片描述
修改对象状态:

import { useState } from "react";function App() {const [data, setData] = useState({ name: "jack", age: 18 });const handleChange = () => {setData({...data,name: "jill",});// 或者传递一个根据先前状态来计算新状态的函数// setData((data) => {//   return {//     ...data,//     name: "jill",//   };// });};return (<div><div>{data.name},{data.age}</div><button onClick={handleChange}>change name</button></div>);
}export default App;

注意:如果 state 变量是一个对象时,不能只更新其中的一个字段,这样会直接替换原来的对象,导致其他属性丢失,如下错误写法:

  const handleChange = () => {setData({name: "jill",});};

👻react-useState介绍
注意: 调用 set 函数 不会 改变已经执行的代码中当前的 state,它只影响 下一次 渲染中 useState 返回的内容。

  const handleChange = () => {setData({...data,name: "jill",});console.log(data.name);// 输出的还是jack};

6. 样式设置

import './index.css';
function App() {return (<div>{/* 行内样式 */}<div style={{color: "red",fontWeight:'600'}}>hello</div>{/* 写在类名中 */}<div className="title">hello</div></div>);
}export default App;
/* index.css */
.title {font-size  : 30px;font-weight: bold;
}

行内样式也写到一个对象中:

function App() {const titleStyle = {color: "red",fontWeight: "600",};return (<div>{/* 行内样式 */}<div style={titleStyle}>hello</div> </div>);
}export default App;

条件渲染样式:

import { useState } from "react";
import "./index.css";function App() {const [flag, setFlag] = useState(true);return (<div>{/* 写在类名中 */}<div className={`origin-class ${flag && "title"}`} onClick={() => setFlag(!flag)}>hello</div></div>);
}export default App;

使用classnames 优化类名设置:

npm i classnames

👻https://github.com/JedWatson/classnames

import classNames from "classnames";
import { useState } from "react";
import "./index.css";
function App() {const titleStyle = {color: "red",fontWeight: "600",};const [flag, setFlag] = useState(true);return (<div>{/* 行内样式 */}<div style={titleStyle}>hello</div>{/* 写在类名中 */}<div className={classNames('origin-class',{'title': flag})} onClick={() => setFlag(!flag)}>hello</div></div>);
}export default App;

7. 表单受控绑定

通过value绑定react状态,再在onChange事件中反向修改react状态。

import { useState } from "react";function App() {const [value, setValue] = useState("");return (<div><input type="text" value={value} onChange={(e) => setValue(e.target.value)}></input></div>);
}export default App;

react调式工具的使用:
👻React 开发者工具
安装 React Developer Tools
在 Chrome、Firefox 等浏览器的扩展商店中搜索 “React Developer Tools” 并安装。
安装后,浏览器开发者工具(通常按 F12 或 Ctrl + Shift + I 打开)中会出现新的 “⚛️ React” 选项卡。
在这里插入图片描述
所以应该在生产环境下使用React 开发者工具 :

npm run build
npm install -g serve
serve -s build

显示为这种图标为可用:
在这里插入图片描述

8. React中获取DOM

使用useRef钩子函数引用DOM元素,获取时使用useRef 返回对象的current属性。

import { useRef, useState } from "react";function App() {const [value, setValue] = useState("");const inputRef = useRef(null);return (<div><inputtype="text"value={value}onChange={(e) => setValue(e.target.value)}ref={inputRef}></input><button onClick={() => inputRef.current.focus()}>focus</button></div>);
}export default App;

9. props父子组件传值

1.props可传递任意的数据类型:数字、字符串、布尔值、数组、对象、函数、JSX。
2.props是只读对象:子组件只能读取props中的数据,不能直接进行修改,父组件的数据只能由父组件修改。

传递单个值:

function Son(props) {return (<div><div>this is son</div><div>name:{props.name} age:{props.age}</div></div>);
}
function App() {return (<div><Son name="jack" age="18"></Son></div>);
}export default App;

传递对象:

// props中的值可以解构出来
function Son({info}) {return (<div><div>this is son</div><div>name:{info.name} age:{info.age}</div></div>);
}
function App() {const info = {name: "jack",age: "18",}return (<div><Son info={info}></Son></div>);
}export default App;

使用 children 进行插槽传值

function Son({info,children}) {return (<div>{children}<div>this is son</div><div>name:{info.name} age:{info.age}</div></div>);
}
function App() {const info = {name: "jack",age: "18",}return (<div><Son info={info}><h2>hello</h2></Son></div>);
}export default App;

**子传父实现:**在子组件中调用父组件props传递过来的方法,将数据以参数方式传递过去。

import { useState } from "react";function Son({onGetMsg}) {return (<div><div>this is son</div><button onClick={() =>onGetMsg('world')}>sendMsg</button></div>);
}
function App() {const [msg,setMsg] = useState('hello')const getMsg = (msg) =>{setMsg(msg)}return (<div>msg:{msg}<Son onGetMsg={getMsg}></Son></div>);
}export default App;

注意:绑定事件处理函数时一定是函数的引用!!

同级组件通信: 使用状态提升,一个子组件中使用子传父方法,一个子组件中使用父传子方法将数据传递给另一个子组件。

import { useState } from "react";function A({ onGetName }) {return (<div><div>Component A</div><button onClick={() => onGetName("react")}>send to B</button></div>);
}
function B({ name }) {return (<div><div>Component B</div><h2>{name}</h2></div>);
}
// A与B之间的通信
function App() {const [name, setName] = useState("");const getName = (name) => {setName(name);};return (<div>{/*子传父*/}<A onGetName={getName}></A>{/* 父传子 */}<B name={name}></B></div>);
}export default App;

跨层级组件通信:
1.使用createContext方法创建一个上下文对象Ctx
2.在顶层组件(App)中通过 Ctx.Provider 组件提供数据,以<Ctx.Provider value={...}>形式。
3.在最底层组件(B)中通过 usecontext 钩子函数获取使用数据

import { createContext, useContext } from "react";// App->A->B
// 创建一个上下文对象
const MsgContent = createContext()
function A() {return (<div><B /></div>);
}
function B() {// 使用数据const msg =useContext(MsgContent)return (<div><h1>{msg}</h1></div>);
}
function App() {const msg="hello"return (<div>{/* 提供数据 */}<MsgContent.Provider value={msg}><A /></MsgContent.Provider></div>);
}export default App;

10. useEffect

useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求,更改DOM,监听某一属性发生变化而进行其他操作等等。

在这里插入图片描述

● 与事件不同,Effect 是由渲染本身,而非特定交互引起的。
● 默认情况下,Effect 在每次渲染(包括初始渲染)后运行。
● 如果 React 的所有依赖项都与上次渲染时的值相同,则将跳过本次 Effect。
注意:严格模式 下,React 在开发模式中,每个组件都会重复挂载一次。(所以这边控制台会输出2次)

import { useEffect } from "react";function App() {useEffect(() =>{console.log('渲染加载完毕!');},[])return (<div>hello</div>);
}
export default App;

在这里插入图片描述

清除副作用:useEffect 返回的这个回调函数,每次被卸载时会调用

import { useEffect, useState } from "react";
function A() {useEffect(() => {const timer = setInterval(() => {console.log("111");}, 2000);return () => {clearInterval(timer)}}, []);return <div>A</div>;
}
function App() {const [show, setShow] = useState(true);return (<div>{show && <A />}<button onClick={() => setShow(false)}>卸载A</button></div>);
}export default App;

11. 自定义Hook函数

自定义Hook是以 use 打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

import { useState } from "react";function useToggle() {const [value, setShow] = useState(true);const toggle = () => setShow(!value);return {value,toggle};
}
function App() {const {value, toggle} = useToggle();return (<div>{value && <div>hello</div>}<button onClick={toggle}>toggle</button></div>);
}export default App;
  1. 声明一个以use打头的函数
  2. 在函数体内封装可复用的逻辑(只要是可复用的逻辑)
  3. 把组件中用到的状态或者回调return出去(以对象或者数组)
  4. 在哪个组件中要用到这个逻辑,就执行这个函数,解构出来状态和回调进行使用

ReactHooks使用规则:

  1. 只能在组件中或者其他自定义Hook函数中调用,不可以在外层调用
  2. 只能在组件的顶层调用,不能嵌套在if、for、其他函数中

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

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

相关文章

word及Excel常见功能使用

最近一直在整理需规文档及表格&#xff0c;Word及Excel需要熟练使用。 Word文档 清除复制过来的样式 当复制文字时&#xff0c;一般会带着字体样式&#xff0c;此时可选中该文字 并使用 ctrlshiftN 快捷键进行清除。 批注 插入->批注&#xff0c;选中文本 点击“批注”…

在Microsoft Outlook日历中添加多个时区

在Microsoft Outlook日历中添加多个时区 1.单击Outlook中的文件选项卡&#xff0c;单击选项 2.左侧菜单中选择日历 3.向下滚动到时区部分&#xff0c;并标记当前时区&#xff0c;比如China 4.选中“显示第二个时区”框 5.选择第二个时区并给它一个标签&#xff0c;比如Germa…

vue组件在项目中的常用业务逻辑(3)

获取完后台接口数据后&#xff0c;需将数据在页面中进行动态展示。 一、在getters中简化数据&#xff1a; 二、在search>index.vue中写计算属性&#xff0c;实现将接口的goodsList模块数据展示在vue的search上&#xff1a; 三、1.用v-for循环数据&#xff0c;一共十个&…

从传感器到清洁力提升,灵途科技推动家电智能化发展

双十一第一波预售刚结束&#xff0c;第二波预售活动又火热开启。得益于政府补贴和平台优惠的双重带动&#xff0c;扫地机等高端智能家电需求暴增。 今年&#xff0c;各大电商平台不再单纯追求“全网最低价”&#xff0c;而是在低价基础上注重提升用户的综合体验。家电机器人品…

基于STM32的智能温室环境监测与控制系统设计(代码示例)

一、项目概述 在现代农业中&#xff0c;智能大棚能够通过环境监测、数据分析和自动控制等技术手段&#xff0c;实现对作物生长环境的精细化管理。本项目旨在设计一个基于STM32单片机的智能大棚系统&#xff0c;能够实时监测光照强度、空气温湿度及土壤湿度&#xff0c;并根据设…

详解CRC校验原理以及FPGA实现

文章目录 一、什么是CRC校验&#xff1f;二、实现CRC校验原理以及步骤2.1 用多项式表示二元码数据2.2 选择一个生成多项式作为校验2.3 计算CRC校验码 三、CRC判断数据是否错误的原理以及步骤3.1 将收到的数据与生成多项式求余3.2 数据发生错误再进行CRC校验判断 四、FPGA实现CR…

大模型学习笔记------CLIP模型解读与思考

大模型学习笔记------CLIP模型解读与思考 1、为什么提出CLIP模型2、CLIP模型详解3、CLIP模型的重要意义 上文已经讲到&#xff0c;我认为多模态的大模型是最有前途的大模型&#xff0c;首先学习的就是CLIP这个模型。 CLIP&#xff08;Contrastive Language-Image Pretraining&…

《IMM交互式多模型滤波MATLAB实践》专栏目录,持续更新……

专栏链接&#xff1a;https://blog.csdn.net/callmeup/category_12816762.html 专栏介绍 关于IMM的例程 双模型EKF&#xff1a; 【逐行注释】基于CV/CT模型的IMM|MATLAB程序|源代码复制后即可运行&#xff0c;无需下载三模型EKF&#xff1a; 【matlab代码】3个模型的IMM例程&…

【UART异步串口协议及verilog实现】

UART异步串口协议 1 UART1.1 数据格式1.2 波特率 2 UART的发送和接收模块2.1 uart发送模块2.2 uart的接收模块 【博客首发于微信公众号《 漫谈芯片与编程》】 本篇文章介绍常用的芯片外围低速协议&#xff1a;UART&#xff1b; 1 UART UART是异步串行传输协议&#xff0c;即…

TS-AWG控制电光调制器:推动科技应用新发展的利器

一、电光调制有什么用&#xff1f; 如今&#xff0c;基于光学、光子学和脉冲激光以及电光调制器的应用正变得极为流行&#xff0c;最新一代科学家正在为其实际应用开辟新领域&#xff0c;如汽车激光雷达、医疗解决方案、航空航天和国防、量子和激光传感器。 测试挑战、上市时…

ros与mqtt相互转换

vda5050 VDA5050协议介绍 和 详细翻译-CSDN博客 ros与mqtt相互转换 如何转换的&#xff0c;通过某个中转包&#xff0c;获取ros的消息然后以需要的格式转换为mqtt 需要的参数 ros相关 parameters[ (ros_subscriber_type, vda5050_msgs/NodeState), (ros_subscriber_queue…

探讨 | 大模型在传统NLP任务的使用姿势

以chatgpt为起始节点的大模型技术经过了两年左右的发展&#xff0c;大致沉淀了一些较为确定的研究领域。首先是基座大模型的研究&#xff0c;主要是国内外大厂集中大量财力、人力、算力进行大模型军备竞赛&#xff0c;企图将大模型的基础能力&#xff08;包括推理能力&#xff…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

Ceisum无人机巡检视频投放

公司投标内容有个视频投放的功能动画&#xff0c;原本想实现这么一个效果&#xff1a; 案例效果来自别人的展示作品&#xff0c;Leader一眼就相中了这个效果&#xff0c;可惜别人的终究是别人的&#xff0c;又不会白白给你&#xff0c;终究是要自己动手尝试。 动画方面的展示…

Redis为什么用跳表实现有序集合

Redis为什么用跳表实现有序集合 手写一个跳表 为了更好的回答上述问题以及更好的理解和掌握跳表&#xff0c;这里可以通过手写一个简单的跳表的形式来帮助读者理解跳表这个数据结构。 我们都知道有序链表在添加、查询、删除的平均时间复杂都都是 O(n) 即线性增长&#xff0c…

ubuntu双屏只显示一个屏幕另一个黑屏

简洁的结论&#xff1a; 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃&#xff0c;重新安装桌面安装不上&#xff0c;请IT帮忙&#xff0c;IT一番操作过后也表示…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

企业必备:一合通电子合同

一合通&#xff0c;让合同签署更简单。加密技术保障安全&#xff0c;随时随地可签。助力企业加速业务流程&#xff0c;提高办公效率。 在数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。特别是在人力资源管理和合同签署方面&#xff0c;传统的纸质合同已经难以…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…