想象一下,你想制作一个超酷的 “美食相册” 网页,能展示各种美食图片,还能随时切换查看不同美食。这听起来是不是很有趣?别担心,React 能帮你轻松实现!作为前端开发领域最受欢迎的库之一,React 以其高效的组件化开发模式和虚拟 DOM 技术,让网页开发变得简单又有趣。接下来,就让我们从入门开始,一步步揭开 React 的神秘面纱,打造属于自己的美食相册!​

一、React 入门准备:搭建开发环境​

在开始编写代码之前,我们需要先搭建好 React 的开发环境。就像厨师做菜前要准备好锅碗瓢盆一样,我们也得把 “工具” 准备齐全。​

1.1 安装 Node.js​

React 项目的运行依赖 Node.js,它就像是我们开发的 “发动机”。你可以在Node.js 官方网站下载并安装最新版本的 Node.js。安装完成后,在命令行中输入node -v和npm -v,如果能显示出版本号,就说明安装成功啦!​

1.2 创建 React 项目​

有了 Node.js,我们就可以使用create-react-app工具来创建 React 项目了。打开命令行,输入以下命令:

npx create-react-app food-album

这里的food-album是我们项目的名字,你也可以换成自己喜欢的名字。等待一会儿,一个基础的 React 项目就创建好啦!进入项目目录:

cd food-album

然后启动项目:

npm start

这时,你的浏览器会自动打开http://localhost:3000,展示出一个默认的 React 页面,这就意味着我们的开发环境搭建成功了!​

二、初识 React 组件:构建美食相册的 “积木”​

在 React 中,组件是构建页面的基本单元,就像搭积木一样,我们可以把不同的组件组合在一起,拼成我们想要的页面。接下来,我们就来创建第一个 React 组件 —— 美食卡片组件。​

2.1 函数式组件​

在 React 中,创建组件有两种常见方式,我们先来看函数式组件。在src目录下创建一个新文件FoodCard.js,输入以下代码:

import React from'react';const FoodCard = (props) => {return (<div className="food-card"><img src={props.image} alt={props.name} /><h2>{props.name}</h2><p>{props.description}</p></div>);
};export default FoodCard;

这段代码定义了一个名为FoodCard的函数式组件。它接收一个props参数,props就像是组件的 “快递包裹”,里面装着组件需要的数据。在组件内部,我们使用JSX语法(一种类似 HTML 的语法)来描述组件的结构,通过{props.image}、{props.name}等方式来展示传递进来的数据。​

2.2 类组件(了解即可)​

除了函数式组件,还有类组件。虽然现在函数式组件更常用,但了解类组件也能帮助我们更好地理解 React 的发展。以下是FoodCard类组件的实现方式:

import React, { Component } from'react';class FoodCard extends Component {render() {return (<div className="food-card"><img src={this.props.image} alt={this.props.name} /><h2>{this.props.name}</h2><p>{this.props.description}</p></div>);}
}export default FoodCard;

类组件通过继承React.Component,并实现render方法来返回组件的结构。使用this.props来访问传递的数据,相比函数式组件,类组件的语法稍微复杂一些。​

2.3 使用组件​

创建好组件后,我们要在页面中使用它。打开src/App.js文件,修改代码如下:

import React from'react';
import FoodCard from './FoodCard';
import './App.css';function App() {return (<div className="App"><h1>我的美食相册</h1><FoodCardimage="https://example.com/pizza.jpg"name="美味披萨"description="香浓芝士,美味可口"/><FoodCardimage="https://example.com/sushi.jpg"name="精致寿司"description="新鲜食材,口感丰富"/></div>);
}export default App;

在这里,我们引入了FoodCard组件,并在App组件中使用了两次,通过传递不同的image、name和description数据,展示了不同的美食卡片。​

三、React 状态(State):让美食相册 “动起来”​

现在我们的美食相册只能展示固定的美食,如果想要点击按钮切换不同的美食,或者实现其他交互效果,就需要用到 React 的状态(State)了。状态就像是组件的 “小秘密”,它的值可以改变,并且当状态改变时,组件会重新渲染,更新页面展示。​

3.1 函数式组件的状态​

在FoodCard.js中,我们为美食卡片添加一个 “喜欢” 按钮,点击按钮可以切换美食是否被喜欢的状态。修改代码如下:

import React, { useState } from'react';const FoodCard = (props) => {// 使用useState Hook创建状态const [isLiked, setIsLiked] = useState(false);return (<div className="food-card"><img src={props.image} alt={props.name} /><h2>{props.name}</h2><p>{props.description}</p><button onClick={() => setIsLiked(!isLiked)}>{isLiked? '取消喜欢' : '喜欢'}</button></div>);
};export default FoodCard;

这里我们使用了useState Hook,它是 React 中用于在函数式组件中添加状态的方法。useState(false)初始化了一个名为isLiked的状态,初始值为false,并返回一个更新状态的函数setIsLiked。当点击按钮时,通过setIsLiked(!isLiked)来切换isLiked的状态,从而改变按钮的文字显示。​

3.2 状态的重要性​

状态的引入让我们的组件变得更加灵活和交互性更强。比如,我们还可以根据状态来改变美食卡片的样式,或者实现更多复杂的交互逻辑。在实际开发中,合理管理和使用状态是非常关键的。​

四、React 生命周期(了解进阶):组件的 “一生”​

在类组件中,React 提供了生命周期方法,这些方法会在组件的不同阶段自动调用,就像人的一生会经历出生、成长、衰老等阶段一样,组件也有自己的 “一生”。虽然现在函数式组件配合 Hook 更常用,但了解生命周期方法能帮助我们更好地理解 React 的运行机制。​

4.1 挂载阶段​

当组件首次被渲染到页面上时,会经历挂载阶段。这个阶段常用的生命周期方法有componentDidMount,它会在组件挂载完成后立即调用。比如,我们可以在这个方法中发送网络请求获取美食数据:

class FoodCard extends Component {componentDidMount() {// 模拟发送网络请求获取美食数据fetch('https://example.com/api/food').then(response => response.json()).then(data => {// 更新组件状态或进行其他操作});}render() {return (<div className="food-card"><img src={this.props.image} alt={this.props.name} /><h2>{this.props.name}</h2><p>{this.props.description}</p></div>);}
}

4.2 更新阶段​

当组件的状态或props发生变化时,会进入更新阶段。componentDidUpdate方法会在组件更新完成后调用,我们可以在这个方法中进行一些依赖于更新后的操作。​

4.3 卸载阶段​

当组件从页面中移除时,会进入卸载阶段。componentWillUnmount方法会在组件卸载前调用,我们可以在这里进行一些清理工作,比如取消网络请求、清除定时器等。​

五、React 组件通信:让美食相册 “协作” 起来​

在一个复杂的应用中,多个组件之间常常需要相互通信,传递数据和信息。比如,我们想在美食相册的顶部添加一个筛选按钮,根据用户选择的美食类型来展示相应的美食卡片,这就涉及到组件之间的通信了。​

5.1 父子组件通信​

最常见的组件通信方式是父子组件通信。父组件可以通过props向子组件传递数据,子组件也可以通过回调函数向父组件传递信息。例如,我们在App.js中添加一个筛选功能:

import React, { useState } from'react';
import FoodCard from './FoodCard';
import './App.css';function App() {const [selectedType, setSelectedType] = useState('all');const foodList = [{id: 1,image: "https://example.com/pizza.jpg",name: "美味披萨",description: "香浓芝士,美味可口",type: "西餐"},{id: 2,image: "https://example.com/sushi.jpg",name: "精致寿司",description: "新鲜食材,口感丰富",type: "日料"},{id: 3,image: "https://example.com/dumplings.jpg",name: "美味饺子",description: "传统美食,味道鲜美",type: "中餐"}];const filteredFoodList = selectedType === 'all'? foodList : foodList.filter(food => food.type === selectedType);return (<div className="App"><h1>我的美食相册</h1><div><button onClick={() => setSelectedType('all')}>全部</button><button onClick={() => setSelectedType('西餐')}>西餐</button><button onClick={() => setSelectedType('日料')}>日料</button><button onClick={() => setSelectedType('中餐')}>中餐</button></div>{filteredFoodList.map(food => (<FoodCardkey={food.id}image={food.image}name={food.name}description={food.description}/>))}</div>);
}export default App;

在这个例子中,App组件作为父组件,通过props向FoodCard子组件传递美食数据。同时,父组件通过useState管理selectedType状态,并在按钮的点击事件中更新状态,从而实现筛选功能。​

5.2 其他通信方式​

除了父子组件通信,还有兄弟组件通信、跨层级组件通信等。可以通过状态提升、使用 Context API、Redux 等方式来实现更复杂的组件通信需求。​

六、总结​

通过以上内容,我们从 React 的开发环境搭建开始,学习了组件的创建和使用、状态的管理、生命周期方法以及组件通信等核心知识,并通过打造一个趣味美食相册的实例,将这些知识应用到实际开发中。当然,React 的世界还有很多有趣和强大的功能等待我们去探索,比如路由管理、与后端 API 的交互、性能优化等等。希望这篇入门分享能激发你对 React 的兴趣,让你在前端开发的道路上越走越远!快动手尝试一下,打造属于你自己的酷炫 React 应用吧!​

通过美食相册案例,相信你对 React 有了初步认识。若你想深入了解某部分内容,请你关注我,后续我会更新相关内容。

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

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

相关文章

深入浅出:RocketMQ与Kafka的双剑合璧,实现高可用与高吞吐

本文在创作过程中借助 AI 工具辅助资料整理与内容优化。图片来源网络。 文章目录 引言一、RocketMQ与Kafka的江湖地位1.1 RocketMQ的独门绝技1.2 Kafka的凌厉攻势 二、双剑合璧的策略&#xff1a;双写队列2.1 策略概述2.2 代码实现 三、双剑合璧的实战应用3.1 电商订单处理3.2 …

Apache POI-02.入门案例-通过POI向Excel文件写入文件内容-通过POI读取Excel文件内容

一.入门案例 向excel文件中写入并读出 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; impor…

MongoDB06 - MongoDB 地理空间

MongoDB06 - MongoDB 地理空间 文章目录 MongoDB06 - MongoDB 地理空间一&#xff1a;地理空间数据基础1&#xff1a;地理数据表示方式1.1&#xff1a;GeoJSON 格式1.2&#xff1a;传统坐标对 2&#xff1a;地理空间索引2.1&#xff1a;2dsphere 索引2.2&#xff1a;2d索引2.3&…

Bugku——WEB篇(持续更新ing)

目录 一、滑稽 二、计算器 方法一 方法二 三、alert 四、你必须让他停下 五、头等舱 六、GET 七、POST 方法一 方法二 八、source 九、矛盾 十、备份是个好习惯 一、滑稽 1.启动环境后&#xff0c;访问URL&#xff0c;页面出现了一堆滑稽表情 2.按f12(或fnf12)打…

Linux 网络命名空间的奥秘:深入解析struct net与内核模块编译陷阱

引言:网络隔离的基石 在Linux容器化技术(如Docker)和云计算网络中,网络命名空间是实现网络隔离的核心机制。每个隔离的网络环境都由一个关键的内核数据结构描述——struct net。这个结构体不仅是网络隔离的技术基础,也是内核开发者常遇到的编译陷阱源头。 一、解剖网络命…

idea的EasyCode插件连接瀚高数据库(APP)

文章目录 环境症状问题原因解决方案 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;5.6.5 症状 客户在idea工具中使用EasyCode插件连接瀚高数据库的企业版时&#xff0c;连接设置的url中提示“jdbc:highgo不存在”的错误 问题原因 E…

VMware设置虚拟机为固定IP

1. 修改虚拟网络编辑器 打开虚拟机网络“编辑” 点击“VMnet8” 选择“NAT”模式 修改网关&#xff1a;前面的不要修改&#xff0c;最后一位设置为“1”&#xff0c;然后确定 记住这里的网关&#xff0c;后面的配置要保持一致 设置子网IP和子网掩码&#xff1a;一般就…

智核引擎融合生成式AI,重塑企业知识图谱与研发创新范式!

目录 系统架构设计核心实现步骤步骤1&#xff1a;知识图谱构建与数据预处理步骤2&#xff1a;生成式AI与知识图谱融合&#xff08;RAG增强&#xff09;步骤3&#xff1a;智能推理工作流 核心流程可视化企业级部署方案性能优化策略应用场景示例结语 本文将手把手实现企业级知识图…

LogisticRegression(solver = ‘lbfgs‘)的ConvergenceWarning问题解决

&#x1f466;&#x1f466;一个帅气的boy&#xff0c;你可以叫我Love And Program &#x1f5b1; ⌨个人主页&#xff1a;Love And Program的个人主页 &#x1f496;&#x1f496;如果对你有帮助的话希望三连&#x1f4a8;&#x1f4a8;支持一下博主 LogisticRegression的Co…

web3 docs

区块链重构信任机制&#xff0c;去中心化&#xff0c;用唯一的hash编号来实现防篡改。以数字货币的形式交易&#xff0c;个人持有唯一的数字秘钥(唯一&#xff0c;不可篡改) 详见 以太坊的白皮书 和 数字货币 (加密货币实现隐私交易) 底层基础的很多特点 1.例如p2p&#xf…

AI入门 | 计算自注意力时QK^T的计算复杂度是多少?

0. 背景 假设我们有两个矩阵&#xff1a; 矩阵 A&#xff0c;尺寸为 (n, d_k)矩阵 B&#xff0c;尺寸为 (d_k, n) 我们要计算它们的乘积 C A * B。 那么这个过程所需的计算量是多少&#xff1f; 1. 结果矩阵的尺寸 首先&#xff0c;结果矩阵 C 的尺寸是由第一个矩阵的行数…

NeRF-Lidar实景重建:大疆Mavic 4 Pro低成本建模方案(2025实战指南)

摘要 面对传统激光雷达建模​​成本高昂​​&#xff08;单设备超$20万&#xff09;与​​操作复杂​​的行业痛点&#xff0c;本文提出基于消费级无人机大疆Mavic 4 Pro的​​NeRF-LiDAR融合重建方案​​&#xff0c;实现厘米级精度建模成本降低至1/10。核心技术突破在于&…

x64dbg设置条件断点

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、x64是什么?二、条件断点1.CreateWindowExW函数设置当窗口名称为xxx字符串时候break总结前言 提示:这里可以添加本文要记录的大概内容: x64dbg设置条件断点 版本 2024 mar 27 提示:以…

RNN人名分类器案例

RNN人名分类器案例 1 任务目的&#xff1a; 目的: 给定一个人名&#xff0c;来判定这个人名属于哪个国家 典型的文本分类任务: 18分类---多分类任务 2 数据格式 注意&#xff1a;两列数据&#xff0c;第一列是人名&#xff0c;第二列是国家类别&#xff0c;中间用制表符号&q…

鸿蒙HarmonyOS 关于图片、视频的选择详解

背景 在聊天软件中&#xff0c;发送相册中视频和照片、用相机拍摄视频和图片发送是很常用的功能。在Android和iOS端&#xff0c;大部分应用都通过API方式定义UI来实现相册选择照片、视频&#xff0c;相机拍摄照片、视频&#xff0c;它们一般都支持以下功能&#xff1a; 相册选…

iOS 网络请求断连重试失败?抓包分析丢包原因的完整流程

在移动 App 的开发中&#xff0c;中断网络环境&#xff08;如切换到飞行模式再回网&#xff09;后&#xff0c;App 在重连过程中有时会出现请求未重新发送或丢包的情况。这类问题难重现、难定位&#xff0c;尤其在 iOS 平台上更容易被忽视。我们最近就遇到一个用户反馈“切换网…

使用 DHTMLX Gantt 添加迷你地图:提升大型项目可视化与导航体验

在应对数千个任务构成的大型项目时&#xff0c;DHTMLX Gantt 以其卓越的性能表现和流畅渲染能力广受欢迎。然而&#xff0c;在实际使用中&#xff0c;终端用户往往需要快速定位到时间线中的特定位置&#xff0c;这在面对庞杂任务结构时尤为困难。为此&#xff0c;DHTMLX 提供了…

ROM修改进阶教程------用于自启脚本来打开系统的一些常用开关等指令 备份收藏 【一】

在定制化rom中。有很多项目需要反编译系统的相关应用来实现。但有些功能项完全可以使用指令来更改。那么结合自启脚本就可以很方便的来实现很多功能。网络虽然有很多类似的指令,但一些相关定制化项目的指令很少见而且不全面。此博文将全面收录此类指令。方便rom修改用户借鉴参…

腾讯云TSE注册中心实战:Nacos高可用集群搭建与流量治理避坑指南

1. 为什么选择腾讯云TSE托管Nacos&#xff1f; 在微服务架构中&#xff0c;注册中心承担着服务发现与配置管理的核心职能。Nacos作为阿里开源的动态服务发现组件&#xff0c;已成为国内微服务生态的事实标准。腾讯云微服务引擎TSE&#xff08;Tencent Cloud Service Engine&am…

领域驱动设计(DDD)【26】之CQRS模式初探

文章目录 一 CQRS初探&#xff1a;理解基本概念1.1 什么是CQRS&#xff1f;1.2 CQRS与CRUD的对比1.3 为什么需要CQRS&#xff1f; 二 CQRS深入&#xff1a;架构细节2.1 基本架构组成2.2 数据流示意图 三 CQRS实战&#xff1a;电商订单案例3.1 传统CRUD方式的订单处理3.2 CQRS方…