react中JSX基础与useState的基本使用 + 评论显示删除需求案例

参考视频:https://www.bilibili.com/video/BV1ZB4y1Z7o8/?p=3&spm_id_from=pageDriver&vd_source=5c584bd3b474d579d0bbbffdf0437c70

如果没有安装create-react-app需要先全局安装

命令:npm i -g create-react-app

1.快速搭建开发环境

create-react-app是一个快速 创建react开发环境的工具,底层由webpack构建,封装了配置细节,开箱即用
执行命令:

npx create-react-app react-basic
  1. npx Node.js工具命令,查找并执行后续的包命令
  2. create-react-app 核心包(固定写法),用于创建react项目
  3. react-basic React项目的名称(可以自定义)
  4. 创建React项目的更多方式:https://zh-hans.react.dev/learn/start-a-new-react-project

2.项目文件

src/index.js ==> 入口文件
src/App.js ==>导入项目的根组件

3.JSX基础:概念和本质

  • 概念:
    JSX是Javascript和XML(HTML)的缩写,表示在JS代码中编写HTML模板结构,它是React中编写UI模板的方式
    优势:
  1. HTML的声明式模板写法
  2. JS的可编程能力
  • 本质:
    JSX并不是标准的JS语法,它是JS的语法扩展,浏览器本身不能识别,需要通过解析工具做解析之后才能在浏览器中运行。 (babel解析工具)
    babel网址:babeljs.io , 可以在左边输入js代码看右边编译在浏览器运行的代码,需要把react勾上才能解析JSX
    在这里插入图片描述
  • 高频场景:
  1. JSX中使用JS表达式:在JSX中可以使用大括号语法{}识别Javascript中的表达式,比如常见的变量、函数调用、方法调用等等。
    1.使用引号传递字符串 2.使用Javascript变量 3.函数调用和方法调用 4.使用Javascript对象
function getName() {return 'jack'
}
function Contuer() {const count = 100;return(<div>{/* 1.使用引号传递字符串, 字符串识别 */}{ 'this is message' }{/* 2.使用Javascript变量, 识别js变量 */}{ count }{/* 3.函数调用和方法调用 */}{ getName() } {/* 调用函数显示的是函数的返回值 */}{ new Date().getDate() } {/* 方法调用 */}{/* 4.使用Javascript对象, {}外层是识别对象的 */}<div style={{color: 'red'}}>this is div</div></div>)
}

注意:if语句、switch语句、变量声明属于语句,不是表达式,不能出现在{}中

4.JSX基础-实现列表渲染

在这里插入图片描述
map循环哪个结构直接return结构,通过map渲染需要绑定独一无二的key 字符串或者number,key的作用:React框架内部使用 提升更新性能的

5.JSX基础-实现条件渲染

在这里插入图片描述
语法:在React中,可以通过逻辑与运算符&&、三元表达式(?:)实现基础的条件渲染

{flag && <span>this is span</span>} // 判断一种情况,如果flag为true,span就显示,否则span不显示
{loading ? <span>loading...</span> : <span>加载完成</span>} // 两种情况(多个),loading为true就显示loading...,否则显示加载完成

6.JSX基础-复杂条件渲染

在这里插入图片描述

需求:列表中需要根据文章状态适配三种情况,单图、三图和无图三种模式
解决方案:自定义函数 + if 判断语句

const articleType = 3 // 0 1 3三种模式
function getArticleTem() {// 可以用switch做if (articleType === 0) {return <div>无图</div>} else if (articleType === 1) {return <div>一图</div>} else {return <div>三图</div>}
}
function Couter() {return(<div>{ getArticleTem() } {/* 调用函数渲染不同的模板 */}</div>)
}

8.React中的时间绑定

语法: on + 事件名称 = { 事件处理程序 }, 整体上遵循驼峰命名法
在这里插入图片描述

  • 使用事件对象参数
    在这里插入图片描述
  • 传递自定义参数
    在这里插入图片描述
  • 同时传递事件对象和自定义参数
    在这里插入图片描述

9.React组件基础使用

组件是什么?
概念:一个组件就是用户界面的一部分,它可以有自己的逻辑和外观,组件之间可以互相嵌套,也可以复用多次
在这里插入图片描述
组件化开发可以让开发者像搭积木一样构建一个完整的庞大的应用
在React中,一个组件就是首字母大写的函数(规定好的),内部存放了组建的逻辑和视图UI,渲染组件只需要把组件当成标签书写即可
在这里插入图片描述
在这里插入图片描述

function Button(){return <button>click me</button>
}
不一定非要function Button(){},  const Button = () => {}也是可以的,只要是首字母大写的函数就是组件
const Button = () => {return <button>click me</button>
}

10.useState基础使用

useState是一个React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果
本质:和普通JS变量不同的是,状态变量一旦发生变化组建的视图UI也会跟着变化(数据驱动视图)
在这里插入图片描述

  • useState修改状态的规则
    在这里插入图片描述
  • 修改对象状态
    在这里插入图片描述

11.React组件基础样式控制

  • 组件基础样式方案
    在这里插入图片描述
    使用style={{fontSize: '20px'}时,如果样式有带-的要改为驼峰写法}。使用class时<span className="class-name">span...</span>class要改为className

12.评论案例

在这里插入图片描述

12.1 列表渲染

思路:

  1. 使用useState维护评论列表
  2. 使用map方法对列表数据进行遍历渲染(别忘了加key)

-------------------------------------思考:为什么要用useState来维护评论列表?-----------------------------------
因为函数组件没有生命周期,执行完毕就结束了,即使值改变了,视图也不会更新。而用useState保存的数据改变之后会更新视图如图所示:
在这里插入图片描述
当点击事件发生,console.log(‘执行了’)也只会打印刚加载的一次,数据已经加上去了,但是视图还是两项没有更新
在这里插入图片描述
--------------------------------------------------思考结束:分割线--------------------------------------------

// 项目的根组件,组件从这往下分散
// App -> 引入到index.js -> 被里面的代码渲染到 public/index.html(root)import { useState } from 'react';
const list = [{name: 'jack',content: '这是评论回复111',time: '2023-6-10',likeNum: 100,uid: '1'},{name: 'rose',content: '这是评论回复222',time: '2023-6-11',likeNum: 230,uid: '2'}
]
const user = {uid: '3002017',avatar: '',uname: '张三'
}// 渲染评论列表
// 1.使用useState维护list
function App() {const [commentList, setCommentList] = useState(list);return (<div className="App"><span>评论{commentList.length}</span> <button>最新</button>|<button>最热</button><div>{user.uname}<input /><button>发布</button></div><div>{commentList.map(item => {return (<div key={item.uid}><div>{item.name}</div><div>{item.content}</div><div><span>{item.time}</span><span>点赞数:{item.likeNum}</span><button>删除</button></div></div>)})}</div></div>);
}export default App;
  • 实现评论删除
    做两件事情:删除按钮判断当前项里的uid是否等于用户uid,如果相等则显示删除按钮,如果不等不显示删除按钮
    给删除按钮绑定点击事件,当点击删除按钮时传入当前项的uid,在事件中用数组过滤掉当前项
const handleDelete = (uid) => {setCommentList(commentList.fliter(item => item.uid !== uid));
}

12.2 渲染tab + 点击高亮实现

在这里插入图片描述
map渲染tab数组之后,绑定一个点击事件,传当前项的type,判断当前项的type是否等于一个记录的值,如果相等就让字体颜色高亮

const [tabType, setTabType] = useState(0);
const handleTab = (type) => {setTabType(type);
}return内:
{tab.map(item => <span key={item.type} style={{color: tabType === item.type? 'blue' : '#aaa'}} onClick="() => handleTab(type)">{item.value}</span>)}

12.3 排序功能实现

在这里插入图片描述

  1. 排序可以使用lodash,会生成一份全新的数据,不会更改老数据
    lodash官网:lodash.com / lodash.com/docs/
    在这里插入图片描述
    在这里插入图片描述
    如果需要进来就按第一个高亮的排序,就在初始加载数据那排序
    在这里插入图片描述
  2. 用array.sort()给数组排序
// 项目的根组件,组件从这往下分散
// App -> 引入到index.js -> 被里面的代码渲染到 public/index.html(root)import { useState } from 'react';
const list = [{name: 'jack',content: '这是评论回复111',time: '2023-6-10',likeNum: 100,uid: '1'},{name: 'rose',content: '这是评论回复222',time: '2023-6-11',likeNum: 230,uid: '2'},{name: '张三',content: '这是评论回复333',time: '2023-6-9',likeNum: 320,uid: '3'},
]
const tab = [{type: 'time',value: '最新'},{type: 'likeNum',value: '最热'}
]
const user = {uid: '3',avatar: '',uname: '张三'
}// 渲染评论列表
// 1.使用useState维护list
function App() {const [commentList, setCommentList] = useState(list);const [tabType, setTabType] = useState();const handleDelete = (uid) => {// 拿到需要删除uid的评论setCommentList(commentList.filter(item => item.uid !== uid ));}const hanldeTab = (type) => {// 拿到点击的type值setTabType(type);// 基于列表的排序if (type === 'time') {// 根据时间排序setCommentList(commentList.sort((a,b) => {return new Date(b.time).getTime() - new Date(a.time).getTime();}))} else {// 根据点赞数排序setCommentList(commentList.sort((a,b) => {return b.likeNum - a.likeNum;}))}}return (<div className="App"><span>评论{commentList.length}</span>{tab.map(item => <span key={item.type} style={{padding: '9px',color: tabType === item.type ? 'blue' : '#aaa', cursor: 'pointer'}}onClick={() => hanldeTab(item.type)}>{item.value}</span>)}<div>{user.uname}<input /><button>发布</button></div><div>{commentList.map(item => {return (<div key={item.uid}><div>{item.name}</div><div>{item.content}</div><div><span>{item.time}</span><span>点赞数:{item.likeNum}</span>{ item.uid === user.uid && <button onClick={() => handleDelete(item.uid)}>删除</button> }</div></div>)})}</div></div>);
}export default App;

12.4发表评论

1.获取评论内容
const [content, setContent] = useState();<input type="text" value={content} onChange={(e) => setContent(e.target.value)}>2.点击发布按钮发布评论
const handlePublish = () => {setCommentList([...commentList,{name: user.uname,content: content,time: new Date(),likeNum: 0,uid: user.uid}])
}
<button onClick={handlePublish}></button>

在这里插入图片描述

  • 随机id可以使用uuid: git上搜索:uuidjs/uuid
    在这里插入图片描述
  • 日期时间格式化可以使用dayjs:dayjs官网:dayjs.gitee.io/zh-CN/
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

12.5清空内容并重新聚焦

在这里插入图片描述

import { useRef, useState } from 'react';
const [content, setContent] = useState(''); // 绑定input的value需要加初始值,否则会报错
const inputRef = useRef(null);
const handlePublish = () => {// ...做发布的逻辑// 1.清空输入框的内容setContent('');// 2.重新聚焦 dom(useRef) - focus()inputRef.current.focus();
}<input type="text" ref={inputRef} value={content} onChange={(e) => setContent(e.target.value)} />
<button onClick={handlePublish}>发布</button>

13.classnames工具优化类名控制

在这里插入图片描述
用classNames库之后使用方法:
在这里插入图片描述

1.命令安装classnames包
npm install classnames2.在组件中引入
import classNames from 'classname';3.在组件内使用, ‘’包裹的是静态的class, 
{// active是动态的class名,值是判断条件,是否需要加active这个classactive: type === item.type
}包裹的是动态的class从这样的:nav-item为静态class类名,active为动态class类名
<span className={`nav-item ${type === item.type && 'active'}`}>span...</span>变成这样:
<span className = {classNames('nav-item', {active: type === item.type
})}>span...</span>

在这里插入图片描述

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

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

相关文章

动态天气预报:Living Weather HD for Mac

Living Weather HD能够为Mac用户提供及时、准确、个性化的天气信息&#xff0c;并提供了丰富的定制选项&#xff0c;使用户能够更加方便地查看天气状况。 具有以下特点&#xff1a; 显示世界各地的准确天气预报和当地时间。自动探测出用户所在的首个地点&#xff0c;并通过搜…

CUDA学习笔记(八)Branch Divergence and Unrolling Loop

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 Avoiding Branch Divergence 有时&#xff0c;控制流依赖于thread索引。同一个warp中&#xff0c;一个条件分支可能导致很差的性能。通过重新组织数据获取模式可以减少或避免warp diverge…

HarmonyOS开发:Log工具类源码分析

前言 一转眼就十月中旬了&#xff0c;国庆的劲真大&#xff0c;到现在还未缓过来&#xff0c;以至于要更新的文章迟迟未发布&#xff0c;大家可以看到&#xff0c;最近一段时间的文章&#xff0c;都是关于HarmonyOS相关的&#xff0c;两个原因吧&#xff0c;一是我司有这样的任…

解决AndroidStudio Gradle只有testDebugUnitTest

问题复现&#xff1a; 问题解决&#xff1a; 1:点击Task list not built... 2:取消勾选Configure all Gradle tasks during Gradle Sync... 大功告成&#xff0c;现在去看看Gradle&#xff0c;屏蔽的都显示出来了。

深度学习 | Pytorch深度学习实践 (Chapter 1~9)

一、overview 基于pytorch的深度学习的四个步骤基本如下&#xff1a; 二、线性模型 - Linear Model 基本概念 数据集分为测试集和训练集&#xff08;训练集、开发集&#xff09;训练集&#xff08;x&#xff0c;y&#xff09;测试集只给&#xff08;x&#xff09;过拟合&#…

解读 | 快速精确的体素GICP三维点云配准算法

原创 | 文 BFT机器人 01 摘要 本文提出了体素化广义迭代最近点&#xff08;VGICP&#xff09;算法&#xff0c;用于快速准确的三维点云配准。所提出的方法通过体素化扩展了广义迭代最近点&#xff08;GICP&#xff09;方法&#xff0c;以避免昂贵的最近邻搜索&#xff0c;同时…

Microsoft Edge浏览器中使用免费的ChatGPT

一、双击打开浏览器 找到&#xff1a;扩展&#xff0c;打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页&#xff0c;使用GPT 六、使用举例 提问 GPT回复

酷开科技 | 酷开系统,为居家生活打开更精彩的窗口

电视在我们的日常生活中扮演着重要的角色。虽然&#xff0c;作为客厅C位的扛把子——电视的娱乐作用深入人心&#xff0c;但是&#xff0c;它的涵义和影响力却因我们每个人的具体生活环境而存在着种种差异&#xff0c;而我们的生活环境又受到我们所处的社会及文化环境的影响。 …

Gartner发布2024 年十大战略技术趋势

10月17日&#xff0c;Gartner 发布2024年企业机构需要探索的****十大战略技术趋势。Gartner研究副总裁Bart Willemsen表示&#xff1a;“由于技术变革以及社会经济方面的不确定性&#xff0c;我们必须大胆采取行动并从战略上提高弹性&#xff0c;而不是采取临时措施。IT领导者的…

页面查询多项数据组合的线程池设计 | 京东云技术团队

背景 我们应对并发场景时一般会采用下面方式去预估线程池的线程数量&#xff0c;比如QPS需求是1000&#xff0c;平均每个任务需要执行的时间是t秒&#xff0c;那么我们需要的线程数是t * 1000。 但是在一些情况下&#xff0c;这个t是不好估算的&#xff0c;即便是估算出来了&…

VS Code C# 开发工具包正式发布

前言 微软于本月正式发布Visual Studio Code C#开发工具包&#xff0c;此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整&#xff0c;微软修复了350多个问题&#xff0c;其中大部分是用户反馈导致的问题。此外&#xff0c;微软还对产品进行了300多项有针对…

1024 CSDN 程序员节-知存科技-基于存内计算芯片开发板验证语音识别

前言 在今年的 CSDN 程序员节上&#xff0c;我参与了这次知存科技举办的一个 AI Workshop 小活动——“基于存内计算芯片开发板验证语音识别”&#xff0c;并且有幸成为完成任务的学习者之一XD。上一次参与类似的活动是算能公司举办的“千校万里行”AIGC 大模型编译部署活动&a…

【Django 04】Serialization 序列化的高级使用

序列化器 serializers 序列化器的作用 序列化将 queryset 和 instance 转换为 json/xml/yaml 返回给前端 反序列化与序列化则相反 定义序列化器 定义类&#xff0c;继承自 Serializer 通常新建一个 serializers.py 文件 撰写序列化内容 suah as 目前只支持 read_only 只…

设计模式:外观模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

大家好&#xff01;本节主要介绍设计模式中的外观模式。 简介&#xff1a; 外观模式&#xff0c;它是一种设计模式&#xff0c;它为子系统中的一组接口提供一个统一的、简单的接口。这种模式主张按照描述和判断资料来评价课程&#xff0c;关键活动是在课程实施的全过程中进行…

科学计算语言Julia编程初步

文章目录 安装基本类型和计算函数初步条件和判断循环向量计算 Julia号称有着比肩C的速度&#xff0c;同时又像Python一样便捷的编程语言&#xff0c;非常适合科研狗使用。之前写了很多博客介绍Julia在数值分析中的应用&#xff0c;这次写一个适合初学者学习的Julia教程系列。 …

中科芯与IAR共建生态合作,IAR集成开发环境全面支持CKS32系列MCU

中国上海–2023年10月18日–嵌入式开发软件和服务的全球领导者IAR今日宣布&#xff0c;与中科芯集成电路有限公司&#xff08;以下简称中科芯&#xff09;达成生态合作&#xff0c;IAR已全面支持CKS32系列MCU的应用开发。这一合作将进一步推动嵌入式系统的发展&#xff0c;并为…

【吞噬星空】战神宫全体投票,为罗峰脱罪,徐欣补办婚礼,洪成功恢复脑电波

【侵权联系删除】【文/郑尔巴金】 吞噬星空动画第90集即将更新&#xff0c;官方相当给力&#xff0c;提前曝光了图文情报与先行预告。虽然罗峰与巴巴塔尚未正式开始闯荡宇宙&#xff0c;但却是斩杀阿特金三大巨头的平稳生活。不但有战神宫为罗峰脱罪&#xff0c;而且还给徐欣补…

Linux安装Redis(这里使用Redis6,其它版本类似)

目录 一、选择需要安装的Redis版本二、下载并解压Redis三、编译安装Redis四、启动Redis4.1、修改配置文件4.2、启动 五、测试连接5.1、本地连接使用自带客户端redis-cli连接操作redis5.2、外部连接使用RedisDesktopManager操作redis 六、关闭Redis七、删除Redis 一、选择需要安…

【Chrome】使用k8s、docker部署无头浏览器Headless,Java调用示例

什么是无头浏览器&#xff1f; 无头浏览器是一种没有图形用户界面的浏览器。无头浏览器不通过其图形用户界面(GUI)控制浏览器的操作&#xff0c;而是使用命令行。 为什么要用Chrome无头&#xff1f; Chrome Headless用于抓取(谷歌)、测试(开发者)和黑客(黑客)。搜索引擎&…

倾斜摄影三维模型根节点合并技术方法探讨

倾斜摄影三维模型根节点合并技术方法探讨 倾斜摄影技术是一种通过无人机或其他航空器采集大量高分辨率照片&#xff0c;并使用特殊软件将这些照片拼接成三维模型的方法。在这个过程中&#xff0c;摄影机以倾斜角度拍摄照片&#xff0c;从而捕捉到目标物体的多个视角&#xff0c…