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

news2024/11/16 1:58:48

参考视频: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 classnames

2.在组件中引入
import classNames from 'classname';

3.在组件内使用, ‘’包裹的是静态的class, 
{
	// active是动态的class名,值是判断条件,是否需要加active这个class
	active: 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.coloradmin.cn/o/1116385.html

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

相关文章

国内有哪些做得好的企业协同办公软件

在当今信息化时代&#xff0c;企业协同办公软件成为了提升企业效率和推动协作的重要工具。国内市场涌现出许多优秀的企业协同办公软件&#xff0c;为企业提供了高效、便捷的协同办公解决方案。在本文中&#xff0c;我们将向大家介绍3款在国内好评如潮的企业协同办公软件&#x…

驱动day2 字符设备驱动 LED亮灯

可参考arm点灯C语言 cortex-A7核 点LED灯 &#xff08;附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】&#xff09;-CSDN博客 1 应用程序 test.c #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

软考系列(系统架构师)- 2019年系统架构师软考案例分析考点

试题一 软件架构&#xff08;架构风格、质量属性&#xff09; 【问题1】&#xff08;13分&#xff09; 针对用户级别与折扣规则管理功能的架构设计问题&#xff0c;李工建议采用面向对象的架构风格&#xff0c;而王工则建议采用基于规则的架构风格。请指出该系统更适合采用哪种…

ant design vue Message 用法以及内容为 html片段情况

ant design vue 的 Message 用法 全局展示操作反馈信息 何时使用 # 可提供成功、警告和错误等反馈信息。顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 全局配置&#xff1a; // main.ts// 进行全局配置 message.config({top: 0.7rem,//高度…

Qt作业九

1、思维导图 2、作业 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

面向对象设计原则,详细介绍及分析

一、介绍&#xff1a; 面向对象设计原则是面向对象设计的基石&#xff0c;是面向对象设计的质量、保障、思想。 一共有七个设计原则&#xff0c;设计模式就是面向对象设计原则的经典应用 单一职责原则* 强调&#xff1a;高内聚低耦合&#xff0c;每一种类型的业务区分 开闭原则…

计算各数位的和是否相等(桶排)

// 分别计算左右两边各数的和&#xff0c;不同值时的数量 eg.四位数&#xff0c;左边数的有10~99&#xff0c;右边数有00~99 和有1~18 和有0~18 桶排&#xff0c;和相同放一个桶&#xff0c;分别计算左右两边不同和的数量 while (len < 8){int left[50] …

2023区块链国赛有黑幕

2023全国职业院校技能大赛区块链技术应用赛项 有黑幕&#xff01;&#xff01;河北软件职业技术学院举行的全国职业院校技能大赛区块链技术应用赛项违反比赛公平原则&#xff1a; 1、在评分阶段居然允许企业人员进入裁判所在区域&#xff0c;偏向性的引导裁判评分&#xff0c…

只需五步,在Linux安装chrome及chromedriver(CentOS)

一、安装Chrome 1&#xff09;先执行命令下载chrome&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2&#xff09;安装chrome yum localinstall google-chrome-stable_current_x86_64.rpm看到下图中的Complete出现则代表安装…

网络安全—自学笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…

搭建哨兵架构(windows)

参考文章&#xff1a;Windows CMD常用命令大全&#xff08;值得收藏&#xff09;_cmd命令-CSDN博客 搭建哨兵架构&#xff1a;redis-server.exe sentinel.conf --sentinel 1.在主节点上创建哨兵配置 - 在Master对应redis.conf同目录下新建sentinel.conf文件&#xff0c;名字绝…

<蓝桥杯软件赛>零基础备赛20周--第1周

报名明年年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列。 每个周末发1个博客&#xff0c;共20周&#xff0c;到明年3月初结束。跟上本博客的节奏&#xff0c;省赛三等奖跑不掉。 每周…

性能强劲又通用!Meta-CoT: 混合问题场景下的自适应思维链推理

©PaperWeekly 原创 作者 | 邹安妮 单位 | 上海交通大学 研究方向 |NLP&#xff0c;大模型推理 大语言模型&#xff08;LLMs&#xff09;通过思维链&#xff08;CoT&#xff09;提示技术&#xff0c;生成中间推理链作为得出答案的依据。然而&#xff0c;当前的 CoT 方法要…

计算机网络-计算机网络体系结构-传输层

目录 一、UDP 二、TCP 特点 首部格式 连接管理 可靠传输 流量控制(点对点) 拥塞控制(全局) 三、拥塞控制算法 慢开始&拥塞避免 快重传&快恢复 功能一&#xff1a;提供进程与进程之间的逻辑通信 功能二&#xff1a;复用和分用 功能三&#xff1a;对收到的报…

文件列表创建工具 Nifty File Lists mac中文版功能特色

Nifty File Lists mac是一款文件列表创建工具&#xff0c;全面的元数据支持&#xff0c;涵盖了从基本文件信息&#xff0c;如文件名、路径、大小、创建和修改日期等等内容。 Nifty File Lists mac功能特色 全面的 元数据支持强大的多线程元数据提取系统涵盖了从基本文件信息&a…

紫光同创FPGA实现HSSTLP高速接口通信,8b/10b编解码数据回环,提供PDS工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、设计思路框架HSSTLP详解HSSTLP基本了解HSSTLP之时钟HSSTLP之PCSHSSTLP之PMAHSSTLP之接口说明 硬件设计HSSTLP IP调用和配置 4、PDS工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取 紫光同创FPGA实…

【计算机网络】网络编程 Socket

目录 1.TCP和UDP的区别 2.基于UDP的 Socket API 总结 3.基于TCP的Socket API 服务器程序的问题 网络编程的目的&#xff1a;通过网络&#xff0c;让不同主机之间能够进行通信。 在进行网络编程的时候&#xff0c;需要操作系统提供一组API&#xff0c;也就是Socket API&am…

用Node.js开发基于稳定扩散的AI应用

在本文中&#xff0c;我们将介绍如何构建一个 Web 应用程序&#xff0c;该应用程序使用 ChatGPT 和 Stable Diffusion 为你提供的任何网站描述生成徽标和合适的域名。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、介绍 人工智能正在接管世界。 这些技术每天都在震…

基于GRU的 电影评论情感分析 - python 深度学习 情感分类 计算机竞赛

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖&#xff0c;适合作为竞…