# react-study **Repository Path**: ninghongkang/react-study ## Basic Information - **Project Name**: react-study - **Description**: react核心语法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-25 - **Last Updated**: 2025-06-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: React ## README # :star:React介绍 React由Meta公司开发,是一个用于 构建Web和原生交互界面的库 ![image.png](assets/01.png) ## React的优势 相较于传统基于DOM开发的优势 1. 组件化的开发方式 2. 不错的性能 相较于其它前端框架的优势 1. 丰富的生态 2. 跨平台支持 ## React的市场情况 全球最流行,大厂必备 ![image.png](assets/02.png) # 开发环境创建 create-react-app是一个快速创建React开发环境的工具,底层由Webpack构件,封装了配置细节,开箱即用 执行命令: ```bash npx create-react-app react-basic ``` 1. npx - Node.js工具命令,查找并执行后续的包命令 2. create-react-app - 核心包(固定写法),用于创建React项目 3. react-basic React项目的名称(可以自定义) 创建React项目的更多方式:[https://zh-hans.react.dev/learn/start-a-new-react-project](https://zh-hans.react.dev/learn/start-a-new-react-project) 补充,基于国情,我们也可以选择`vite`来构建项目: ```shell npm create vite@latest ``` # 学React之前 注意!!Vue和React 两者思想不太一样,不能用 vue 的习惯学习 react 注意!!Vue和React 两者思想不太一样,不能用 vue 的习惯学习 react 注意!!Vue和React 两者思想不太一样,不能用 vue 的习惯学习 react # JSX基础 ## 什么是JSX > 概念:JSX是JavaScript和XMl(HTML)的缩写,表示在**JS代码中编写HTML模版结构**,它是React中构建UI的方式 ```jsx const message = 'this is message' function App(){ return (

this is title

{message}
) } ``` 优势: 1. HTML的声明式模版写法 2. JavaScript的可编程能力 react官网对JSX的要求: - JSX 比 HTML 更严格。你必须闭合像 `
` 这样的标签 - 你的组件也不能返回多个 JSX 标签。你必须将它们封装到共享的父级中,例如 `
...
` 或空的 `<>...` 封装器 - 简单来说:就是只能都会一个跟标签,与Vue2相似 ## JSX的本质 > JSX并不是标准的JS语法,它是 JS的语法扩展,**浏览器本身不能识别**,需要通过**解析工具做解析**之后才能在浏览器中使用 babel:https://www.babeljs.cn/ ![image.png](assets/03.png) ## JSX高频场景-JS表达式 > 在JSX中可以通过 `大括号语法{}` 识别JavaScript中的表达式,比如常见的变量、函数调用、方法调用等等 1. 使用引号传递字符串 2. 使用JS变量 3. 函数调用和方法调用 4. 使用JavaScript对象 注意:if语句、switch语句、变量声明不属于表达式,不能出现在{}中 ```jsx const message = 'this is message' function getAge(){ return 18 } function App(){ return (

this is title

{/* 字符串识别 */} {'this is str'} {/* 变量识别 */} {message} {/* 变量识别 */} {message} {/* 函数调用 渲染为函数的返回值 */} {getAge()}
) } ``` ## JSX高频场景-列表渲染 ![image.png](assets/04.png) > 语法:在JSX中可以使用原生js种的`map方法` 实现列表渲染 ```jsx const list = [ {id:1001, name:'Vue'}, {id:1002, name: 'React'}, {id:1003, name: 'Angular'} ] function App(){ return ( ) } ``` 说明:key 在循环时是必须的,否则会有 warning ## JSX高频场景-条件渲染 ![image.png](assets/05.png) > 在React中,可以通过**逻辑与运算符&&、三元表达式(?:)** 实现基础的条件渲染 ```jsx const flag = true const loading = false function App(){ return ( <> {flag && this is span} {loading ? loading...:this is span} ) } ``` ## JSX高频场景-复杂条件渲染 ![image.png](assets/06.png) > 需求:列表中需要根据文章的状态适配 > > 解决方案:**自定义函数 + 判断语句** ```jsx const type = 1 // 0|1|3 function getArticleJSX() { if (type === 0) { return
无图模式模版
} else if (type === 1) { return
单图模式模版
} else { // type === 3 return
三图模式模版
} } function App(){ return ( <> { getArticleJSX() } ) } ``` # React的事件绑定 ## 基础实现 > React中的事件绑定,通过语法 `on + 事件名称 = { 事件处理程序 }`,整体上遵循驼峰命名法 下面以单击事件举例,其他大同小异 ```jsx function App() { const clickHandler = () => { console.log('button被点击了') } return (
{/* 事件绑定-基础实现 */}
) } ``` ## 使用事件参数 > 在事件回调函数中设置形参e即可 ```jsx function App() { // 事件绑定-使用事件参数e const clickHandler = (e) => { console.log('button被点击了', e) } return (
{/* 事件绑定 */}
) } ``` 注意: ​ `onClick={clickHandler}` 末尾没有括号!不要调用事件处理函数:你只需要传递下去。当用户单击按钮时,React 将调用你的事件处理程序 ## 传递自定义参数 > 语法:事件绑定的位置改造成箭头函数的写法,在执行clickHandler实际处理业务函数的时候传递实参 ```jsx function App() { // 事件绑定-传递自定义参数 const clickHandler = (name) => { console.log('button被点击了', name) } return (
{/* 事件绑定 */}
) } ``` 注意: ​ 不能直接写函数调用,这里事件绑定需要一个**函数引用** ## 同时传递事件对象和自定义参数 > 语法:在事件绑定的位置传递事件实参e和自定义参数,clickHandler中声明形参,注意顺序对应 ```jsx function App() { // 事件绑定-同时传递事件对象和自定义参数 const clickHandler = (name, e) => { console.log('button被点击了', name, e) } return (
{/* 事件绑定 */}
) } ``` # React组件基础使用 ## 组件是什么 概念:一个组件就是一个用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以**互相嵌套,也可以复用多次** ![image.png](assets/07.png) ## 组件基础使用 > 在React中,一个组件就是**首字母大写的函数**,内部存放了组件的逻辑和视图UI, 渲染组件只需要把组件当成标签书写即可 > > 使用组件时:组件标签必须用大驼峰命名 ```jsx // 1.定义函数式组件 // function Button() { // return // } // 箭头函数定义组件 const Button = () => { return } function App() { return (
{/* 2.使用组件:组件标签必须是大驼峰 */} {/* 自闭和方式 */}
) } ``` # 组件状态管理-useState - **函数是无状态的**,执行完毕后,它内部用的数据都不会保存下来 - 要想让函数有状态,就需要使用 useState 把数据保存在函数之外的地方,这些数据,称之为状态 ## 基础使用 > useState 是一个 React Hook(函数),它允许我们向组件添加一个`状态变量`, 从而控制影响组件的渲染结果 > > 本质:和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化(**数据驱动视图**) ![image.png](assets/08.png) ```jsx function App() { // 1.调用useState添加一个状态变量 /** * count 状态变量 * setCount 修改状态变量的方法 */ const [count, setCount] = useState(0) return (
{/* 错误示范 */} {/* */} {/* 正确示范 */}
) } ``` ## 状态的修改规则 > 在React中状态被认为是只读的,我们应该始终`替换它而不是修改它`, 直接修改状态不能引发视图更新 ![image.png](assets/09.png) ## 修改对象状态 > 对于对象类型的状态变量,应该始终给set方法一个`全新的对象` 来进行修改 ![image.png](assets/10.png) # 组件的基础样式处理(添加样式) > React组件基础的样式控制有俩种方式,行内样式 和 class类名控制 1、行内样式(不推荐) ```jsx
this is div
/* 说明:style={{}} 不是特殊语法,而是 style={ } JSX 大括号内的常规 {} 对象 */ ``` 2、class类名控制 在 React 中,你使用 `className` 指定一个 CSS 类。它的工作方式与 HTML [`class`](https://web.nodejs.cn/en-US/docs/Web/HTML/Global_attributes/class) 属性相同: ```css .foo{ color: red; } ``` ```jsx import './index.css' function App(){ return (
this is span
) } ``` # B站评论案例 ![image.png](assets/11.png) 1. 渲染评论列表 1. 做列表渲染 2. 删除评论实现(规定自己只能删自己的评论) 1. 根据条件渲染,显示删除按钮 2. 删除功能:拿到当前项id,以id为条件为评论列表做filter过滤 3. 渲染导航Tab和高亮实现 4. 评论列表排序功能实现 ## 基础模版 ```tsx import { useState } from 'react' import './App.scss' import avatar from './images/bozai.png' /** * 评论列表的渲染和操作 * * 1. 根据状态渲染评论列表 * 2. 删除评论 */ // 评论列表数据 const defaultList = [ { // 评论id rpid: 3, // 用户信息 user: { uid: '13258165', avatar: '', uname: '周杰伦', }, // 评论内容 content: '哎哟,不错哦', // 评论时间 ctime: '10-18 08:15', like: 88, }, { rpid: 2, user: { uid: '36080105', avatar: '', uname: '许嵩', }, content: '我寻你千百度 日出到迟暮', ctime: '11-13 11:29', like: 88, }, { rpid: 1, user: { uid: '30009257', avatar, uname: '黑马前端', }, content: '学前端就来黑马', ctime: '10-19 09:00', like: 66, }, ] // 当前登录用户信息 const user = { // 用户id uid: '30009257', // 用户头像 avatar, // 用户昵称 uname: '黑马前端', } /** * 导航 Tab 的渲染和操作 * * 1. 渲染导航 Tab 和高亮 * 2. 评论列表排序 * 最热 => 喜欢数量降序 * 最新 => 创建时间降序 */ // 导航 Tab 数组 const tabs = [ { type: 'hot', text: '最热' }, { type: 'time', text: '最新' }, ] const App = () => { return (
{/* 导航 Tab */}
{/* 发表评论 */}
{/* 当前用户头像 */}
用户头像
{/* 评论框 */}