React---使用react脚手架搭建项目

2023-11-16

一、 使用create-react-app创建react应用

1.1. react脚手架

  1. xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目
    1. 包含了所有需要的配置(语法检查、jsx编译、devServer…)
    2. 下载好了所有相关的依赖
    3. 可以直接运行一个简单效果
  2. react提供了一个用于创建react项目的脚手架库: create-react-app
  3. 项目的整体技术架构为:  react + webpack + es6 + eslint
  4. 使用脚手架开发的项目的特点: 模块化, 组件化, 工程化

1.2. 创建项目并启动

  第一步,全局安装:npm i -g create-react-app

  第二步,切换到想创项目的目录,使用命令:create-react-app hello-react

  第三步,进入项目文件夹:cd hello-react

  第四步,启动项目:npm start

1.3. react脚手架项目结构

public ---- 静态资源文件夹

favicon.icon ------ 网站页签图标

index.html -------- 主页面

logo192.png ------- logo图

logo512.png ------- logo图

manifest.json ----- 应用加壳的配置文件

robots.txt -------- 爬虫协议文件

src ---- 源码文件夹

App.css -------- App组件的样式

App.js --------- App组件

App.test.js ---- 用于给App做测试

index.css ------ 样式

index.js ------- 入口文件

logo.svg ------- logo图

reportWebVitals.js  --- 页面性能分析文件(需要web-vitals库的支持)

setupTests.js  ---- 组件单元测试的文件(需要jest-dom库的支持)

1.4. 功能界面的组件化编码流程(通用)

1. 拆分组件: 拆分界面,抽取组件

2. 实现静态组件: 使用组件实现静态页面效果

3. 实现动态组件

3.1 动态显示初始化数据

3.1.1 数据类型

3.1.2 数据名称

3.1.2 保存在哪个组件

3.2 交互(从绑定事件监听开始)

二、案例

1. TodoList分析

  1.拆分组件、实现静态组件,注意:className、style的写法
        2.动态初始化列表,如何确定将数据放在哪个组件的 state中?
                    ——某个组件使用:放在其自身的 state
                    ——某些组件使用:放在他们共同的父组件 state中(官方称此操作为:状态提升)
        3.关于父子之间通信:
                1.【父组件】给【子组件】传递数据:通过 props传递
                2.【子组件】给【父组件】传递数据:通过 props传递,要求父提前给子传递一个函数
        4.注意 defaultChecked 和  checked的区别,类似的还有: defaultValue 和  value, checked必须要写onChange方法配合使用
        5.状态在哪里,操作状态的方法就在哪里

2. 代码

(1)App.jsx

 1 import React, { Component } from 'react'
 2 import Header from './components/Header'
 3 import List from './components/List'
 4 import Footer from './components/Footer'
 5 import './App.css'
 6 
 7 export default class App extends Component {
 8     //状态在哪里,操作状态的方法就在哪里
 9 
10     //初始化状态
11     state = {todos:[
12         {id:'001',name:'吃饭',done:true},
13         {id:'002',name:'睡觉',done:true},
14         {id:'003',name:'打代码',done:false},
15         {id:'004',name:'逛街',done:false}
16     ]}
17 
18     //addTodo用于添加一个todo,接收的参数是todo对象
19     addTodo = (todoObj)=>{
20         //获取原todos
21         const {todos} = this.state
22         //追加一个todo
23         const newTodos = [todoObj,...todos]
24         //更新状态
25         this.setState({todos:newTodos})
26     }
27 
28     //updateTodo用于更新一个todo对象
29     updateTodo = (id,done)=>{
30         //获取状态中的todos
31         const {todos} = this.state
32         //匹配处理数据
33         const newTodos = todos.map((todoObj)=>{
34             if(todoObj.id === id) return {...todoObj,done}
35             else return todoObj
36         })
37         this.setState({todos:newTodos})
38     }
39 
40     //deleteTodo用于删除一个todo对象
41     deleteTodo = (id)=>{
42         //获取原来的todos
43         const {todos} = this.state
44         //删除指定id的todo对象
45         const newTodos = todos.filter((todoObj)=>{
46             return todoObj.id !== id
47         })
48         //更新状态
49         this.setState({todos:newTodos})
50     }
51 
52     //checkAllTodo用于全选
53     checkAllTodo = (done)=>{
54         //获取原来的todos
55         const {todos} = this.state
56         //加工数据
57         const newTodos = todos.map((todoObj)=>{
58             return {...todoObj,done}
59         })
60         //更新状态
61         this.setState({todos:newTodos})
62     }
63 
64     //clearAllDone用于清除所有已完成的
65     clearAllDone = ()=>{
66         //获取原来的todos
67         const {todos} = this.state
68         //过滤数据
69         const newTodos = todos.filter((todoObj)=>{
70             return !todoObj.done
71         })
72         //更新状态
73         this.setState({todos:newTodos})
74     }
75 
76     render() {
77         const {todos} = this.state
78         return (
79             <div className="todo-container">
80                 <div className="todo-wrap">
81                     <Header addTodo={this.addTodo}/>
82                     <List todos={todos} updateTodo={this.updateTodo} deleteTodo={this.deleteTodo}/>
83                     <Footer todos={todos} checkAllTodo={this.checkAllTodo} clearAllDone={this.clearAllDone}/>
84                 </div>
85             </div>
86         )
87     }
88 }

(2) Header.jsx

 1 import React, { Component } from 'react'
 2 import PropTypes from 'prop-types'
 3 import {nanoid} from 'nanoid'
 4 import './index.css'
 5 
 6 export default class Header extends Component {
 7 
 8     //对接收的props进行:类型、必要性的限制
 9     static propTypes = {
10         addTodo:PropTypes.func.isRequired
11     }
12 
13     //键盘事件的回调
14     handleKeyUp = (event)=>{
15         //解构赋值获取keyCode,target
16         const {keyCode,target} = event
17         //判断是否是回车按键
18         if(keyCode !== 13) return
19         //添加的todo名字不能为空
20         if(target.value.trim() === ''){
21             alert('输入不能为空')
22             return
23         }
24         //准备好一个todo对象
25         const todoObj = {id:nanoid(),name:target.value,done:false}
26         //将todoObj传递给App
27         this.props.addTodo(todoObj)
28         //清空输入
29         target.value = ''
30     }
31 
32     render() {
33         return (
34             <div className="todo-header">
35                 <input onKeyUp={this.handleKeyUp} type="text" placeholder="请输入你的任务名称,按回车键确认"/>
36             </div>
37         )
38     }
39 }

(3) List.jsx

 1 import React, { Component } from 'react'
 2 import PropTypes from 'prop-types'
 3 import Item from '../Item'
 4 import './index.css'
 5 
 6 export default class List extends Component {
 7 
 8     //对接收的props进行:类型、必要性的限制
 9     static propTypes = {
10         todos:PropTypes.array.isRequired,
11         updateTodo:PropTypes.func.isRequired,
12         deleteTodo:PropTypes.func.isRequired,
13     }
14 
15     render() {
16         const {todos,updateTodo,deleteTodo} = this.props
17         return (
18             <ul className="todo-main">
19                 {
20                     todos.map( todo =>{
21                         return <Item key={todo.id} {...todo} updateTodo={updateTodo} deleteTodo={deleteTodo}/>
22                     })
23                 }
24             </ul>
25         )
26     }
27 }

(4) Item.jsx

 1 import React, { Component } from 'react'
 2 import './index.css'
 3 
 4 export default class Item extends Component {
 5 
 6     state = {mouse:false} //标识鼠标移入、移出
 7 
 8     //鼠标移入、移出的回调
 9     handleMouse = (flag)=>{
10         return ()=>{
11             this.setState({mouse:flag})
12         }
13     }
14 
15     //勾选、取消勾选某一个todo的回调
16     handleCheck = (id)=>{
17         return (event)=>{
18             this.props.updateTodo(id,event.target.checked)
19         }
20     }
21 
22     //删除一个todo的回调
23     handleDelete = (id)=>{
24         if(window.confirm('确定删除吗?')){
25             this.props.deleteTodo(id)
26         }
27     }
28 
29 
30     render() {
31         const {id,name,done} = this.props
32         const {mouse} = this.state
33         return (
34             <li style={{backgroundColor:mouse ? '#ddd' : 'white'}} onMouseEnter={this.handleMouse(true)} onMouseLeave={this.handleMouse(false)}>
35                 <label>
36                     <input type="checkbox" checked={done} onChange={this.handleCheck(id)}/>
37                     <span>{name}</span>
38                 </label>
39                 <button onClick={()=> this.handleDelete(id) } className="btn btn-danger" style={{display:mouse?'block':'none'}}>删除</button>
40             </li>
41         )
42     }
43 }

3. 效果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React---使用react脚手架搭建项目 的相关文章

随机推荐

  • MM32F3273G8P火龙果开发板MindSDK开发教程15 - 获取msa311加速器的方向改变事件

    MM32F3273G8P火龙果开发板MindSDK开发教程15 获取msa311加速器的方向改变事件 1 功能描述 类似手机里横屏竖屏检测 当方向发生变化时 横屏竖屏自动切换 当msa311方向改变时 会产生中断 然后从寄存器Reg 0x0
  • 性能测试 —— Tomcat监控与调优:Jconsole监控

    JConsole的图形用户界面是一个符合Java管理扩展 JMX 规范的监测工具 JConsole使用Java虚拟机 Java VM 提供在Java平台上运行的应用程序的性能和资源消耗的信息 在Java平台 标准版 Java SE平台 6
  • 【转载】wireshark抓包教程详解

    Wireshark软件安装 软件下载路径 wireshark官网 按照系统版本选择下载 下载完成后 按照软件提示一路Next安装 说明 如果你是Win10系统 安装完成后 选择抓包但是不显示网卡 下载win10pcap兼容性安装包 下载路径
  • 存储的一些基本概念(HBA,LUN)

    time 2008 11 12auther skate 最近存储要升级 对存储的认识也更进一步了 下面是关于存储的一些相关的概念 存储的一些基本概念 HBA LUN 有些新手总是在各式各样的概念里绕来绕去 弄的不亦乐乎 所以我就把我的一些理
  • jmeter断言

    1 设置断言 右击线程组 断言 响应断言 2 设置响应断言 测试的模式输入的内容来自 察看结果树中的响应结果 3 察看结果树执行结果 4 断言结果
  • 《深入浅出OCR》前言知识(一):机器学习最新全面总结

    专栏介绍 经过几个月的精心筹备 本作者推出全新系列 深入浅出OCR 专栏 对标最全OCR教程 具体章节如导图所示 将分别从OCR技术发展 方向 概念 算法 论文 数据集等各种角度展开详细介绍 面向对象 本篇前言知识主要介绍机器学习 方便小白
  • Windows10 - 在当前文件夹下打开cmd(命令行)的方法

    1 清除文件路径输入cmd 2 按住shift 再点击鼠标右键 在某个版本前 这里右键还是打开命令行 后来换成了打开ps 有改注册表的方法 将其改回打开cmd
  • vue3 使用vant框架的van-list 上拉加载用法

  • STM32PWM知识详解

    目录 一 PWM简介 1 定义 2 主要参数 二 PWM产生方式 1 普通IO口与PWM口 2 普通IO口产生PWM 3 PWM口产生PWM 总结 参考链接归纳 一 PWM简介 1 定义 脉冲宽度调制 PWM 是一种数字信号 最常用于控制电
  • 【C++入门】虚继承的实现原理

    转载自 http blog csdn net xiejingfa article details 48028491 准备工作 1 VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C 对象在内存中的
  • 计算两个数的平方和

    3 计算两个数的平方和 从键盘读入两个实数 编程计算并输出它们的平方和 要求使用数学函数pow x y 计算平方值 输出结果保留2位小数 程序中所有浮点数的数据类型均为float include
  • html右侧增加页面导航快捷键效果图及代码

    如果一个页面非常长时 在页面右侧增加导航快捷键还是比较有必要的 见效果图 局部放大后的效果 具体实现代码如下 html相关代码 div class gototop none div a href img src static imgs to
  • exit()函数

    进程的终止方式 有8种方式使进程终止 其中前5种为正常终止 它们是 1 从 main 返回 2 调用 exit 3 调用 exit 或 Exit 4 最后一个线程从其启动例程返回 5 最后一个线程调用pthread exit 异常终止有3种
  • Redis4.0从库复制报错"master_link_status:down"处理一例

    环境描述 Redis版本 4 0 2 主库 192 168 0 190 从库 192 168 0 191 今天Zabbix告警一直出现redis sync error的信息 于是登陆redis发现从库复制状态一直是master link s
  • 若依前端框架登录执行过程

    一 登录页面 登录页面是Views文件夹下的login vue文件 二 点击登录调用的方法为 handleLogin handleLogin this refs loginForm validate valid gt if valid th
  • Bugku题目MISC部分(持续更新)

    目录 telnet 1和0的故事 这是一张单纯的图片 隐写 社工 进阶收集 来自论坛提问 gQiRf的附件 zip 简单取证1 mimikatz PasswareKitForensic工具 眼见非实 啊哒 ping FileStoraged
  • spring中使用ThreadPoolTaskExecutor配置线程池

    背景 spring中经常使用ThreadPoolTaskExecutor来调用JDK的ThreadPoolExecutor初始化线程池 尤其在有异步执行的任务时 由于spring 异步任务默认使用的executor不会reuse线程 因此需
  • 寄存器优化补充

    一 简要概述 结构体在寄存器中应用可以简化繁琐的寄存器 这段代码在每个结构体成员前增加了一个 IO 前缀 它的原型在这段代码的第一行 代表了C 语言中的关键字 volatile 在 C 语言中该关键字用于表示变量是易变的 要求编译器不要优化
  • Pytorch cpu版安装及卸载详细教程(以及安装成功后无法在ide中使用问题解决方法)

    Pytorch cpu版安装及卸载详细教程 以及安装成功后无法在ide中使用问题解决方法 一 准备 1 首先确定python的版本 且python是64位 win R 输入cmd 确定 在页面中输入python回车 可查看python版本既
  • React---使用react脚手架搭建项目

    一 使用create react app创建react应用 1 1 react脚手架 xxx脚手架 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置 语法检查 jsx编译 devServer 下载好了所有相关的依赖 可