React项目学习笔记2

create React-app脚手架中封装withRouter.js高阶组件 由于 useNavigate、useLocation、useSearchParams等方法,只能写在函数内,也就是说我们可以在React Hooks 函数组件内可以直接 import 导入,创建实例化对象后我们就可以直接使用(必须在组件的最顶层使用,不能写在函数方法或jsx内),但是对于React class类组件,显然我们是无法直接使用这些组件方法的,因此我们需要封装一个高阶组件。 高阶组件:高阶组件必须是一个函数,该函数接收一个组件作为参数,被调用时将组件传进去,返回一个新的组件..... 阅读详情

 1.当param发送变化,副作用的依赖监控到变化,则发起请求得到列表数据,但我们用到列表数,所以操作列表数据的hook也定义在此页面,在List组件中该怎么得到父组件中拿到的数据呢,这就需要用到状态提升。随后将其中的数据拿到父组件中,然后通过React的prop传值传给子组件进行使用,在函数子组件中解构给子组件内部进行使用。

import { useState, useEffect } from "react"

export const SearchPanle = () => {
    // input
    const [param, setParam] = useState({
        name: '',
        personId: ''
    })
    // select
    const [users, setUsers] = useState([])
    // list
    const [list, setList] = useState([])

    // param变化的时候请求项目列表的接口  加一个依赖 意思是param改变的时候进行获取接口
    useEffect(() => {
        //请求接口
        fetch('').then(async response => {
            if (response.ok) {
                // json()返回一个被解析为JSON格式的promise对象
                setList(await response.json())
            }
        })
    }, [param])
    return <form>
        <div>
            {/* 相当于 setParam(Object.assign({},param,{name:e.target.value})) */}
            <input type="text" value={param.name} onChange={e => setParam({
                ...param,
                name: e.target.value
            })} />
            <select value={param.personId} onChange={e => setParam({
                ...param,
                personId: e.target.value
            })}>
                <option value={''}>负责人</option>
                {
                    users.map(user => <option value={user.id}>{user.name}</option>)
                }
            </select>
        </div>
    </form>
}

解构传递给子组件进行使用

export const SearchPanle = ({param,setParam}) => {
//具体内容...

2.react的项目占据了3000端口,将json-server端口设置为3001,在script里添加--port3001。

3.fetch()中如果将请求地址写死,则当后端完成接口后我们需要一个个更改,解决方案是在根目录下建立了两个文件:

 

在index.jsx里面定义fetch请求的地址,放在fetch中使用,

const apiUrl =process.env.REACT_APP_API_URL
// 请求接口
fetch(`${apiUrl}/projects`).then(async response => {
            if (response.ok) {
                // json()返回一个被解析为JSON格式的promise对象
                setList(await response.json())

当我们运行npm start命令时,说明是开发环境,webpack会读取.env.development中的REACT_APP_API_URL,而运行npm run build线上打包时,webpack则会读取.env中的变量。

4.后台返回的数据中并没有我们想要的usersname,也就是说我们需要自己对照id找到相应的项目name

//通过json-server返回的数据类型
 {
        "id": 4,
        "name": "王文静"
      }
    ],
    "projects": [
      {
        "id": 1,
        "name": "骑手管理",
        "personId": 1,
        "organization": "外卖组",
        "created": 1604989757139
      },

// 找到projects(具体项目)中的personid与选择负责人的users.id相同的那一项的name 
<td>{users.find(users => users.id === project.personId)?.name || '未知'}</td>

?的意思是当name前面的表达式是undefined时,整个表达式会undefined,不会报错,我们让其默认值为"未知"

5.注意每个map渲染的列表都需要独特的key属性。

6.如果查询条件像这样...?name=&id=2,后台可能未对数据进行处理,不知道该返回所有还是name未空的项,我们引入一个函数对后台值为空的数据进行处理。

// 排除value为0的情况 !!的意思是转换为布尔值
export const isFalsy = (value) => value === 0 ? false : !value

// 该函数用来删除数据里值是空的那一项
export const cleanObject = (object) => {
    // 直接对对象进行操作是不好的,用拓展运算符拷贝一份新数据result
    // 思路是对result进行修改后再return出去
    const result = { ...object }
    // 拿到传进来的对象的所以键名 然后用foreach遍历所有键名(key)
    Object.keys(result).forEach(key => {
        //拿到该对象对应键名的值 定义为value
        const value = object[key]
        // 判断value是否存在 如果不存在 则删除该键
        // 有时候value=0时也是有效数据 故直接判断if(!value)会忽略value为0的情况
        // 所以定义一个函数先排除value为0的情况
        if(isFalsy(value)){
            delete result[key]
        }
    })
    return result
}

如果查询条件过多,写入必定很繁琐,用yarn add qs进行处理,将查询条件传入先前定义好的去除值为空的函数

fetch(`${apiUrl}/projects?${qs.stringify(cleanObject(param))}`).then(async response => {
            if (response.ok) {
                // json()返回一个被解析为JSON格式的promise对象
                setList(await response.json())
            }
        })
    }, [param])

 

【ReactJs学习笔记】【编译生产环境的React应用】 目录 目录 package.json 本地服务器打开编译好的项目 可以快速以当前路径为根目录建立服务的工具pushstate-server 快捷链接 package.json &quot;scripts&quot;: { &quot;start&quot;: &quot;react-scripts start&quot;, &quot;build&quot;: &quot;reac 阅读详情

相关推荐

自学PCB思路 | PCB设计零基础入门-小白适用(附详细入门经验分享)

本人大一在实践课上就听说PCB,被虎的一楞一楞的,不过现在回看,发现其实并没有相信的那么难!想着把自己这一路摸索的学习路线分享一下,当时我是一边摸索一边上手,一把鼻涕一把泪的过来的。如果你想搞硬件或者需要搞硬件,下面是我的入门学习过程,希望可以帮到你。目录前言选择一款设计软件好的入门课程掌握抄板元件采购焊板子烙铁头热风枪自己半设计明确设计需求全设计最后我并非什么大佬,也没法自己去教大家如何画板。

自动化小秋葵的博客 1万+

学习react-router-v6 : useSearchParams、Outlet、Navigate

学习react-router-v6 : useSearchParams、Outlet、useOutletContext、Navigate、useNavigate。

weixin_45696837的博客 1315

别再被SpringerLink虐了!手把手教你搞定LaTeX源文件提交(附正确文件顺序和类型选择)

本文详细解析了SpringerLink投稿系统中LaTeX源文件提交的常见问题与解决方案,包括文件打包、类型选择和顺序排列等关键步骤。通过实战经验,帮助科研人员避开隐形陷阱,一次性完成LaTeX提交,提升投稿效率。特别针对`.bst`和`.cls`文件的正确处理提供了专业指导。

weixin_42522964的博客 445

React一些拓展以及react-router6新版本修改及新增内容

React一些拓展以及react-router6新版本修改及新增内容 与React Router 5.x 版本相比,改变了什么? 内置组件的变化:移除<Switch/> ,新增 <Routes/>等。 语法的变化:component={About} 变为 element={<About/>}等。 新增多个hook:useParams、useNavigate、useMatch等。 官方明确推荐函数式组件了!!!

wanghe1111_的博客 1926

java三角套利_三角对冲套利-EA原理全解析

它是两个直盘货币和一个交叉盘货币之间的相互对冲,交易员往往受到外界因素的影响无法严格执行造成亏损。该系统经过大量数据统计分析和严格的科学论证计算,并通过多年实盘交易验证可以达到稳定盈利。希望交易员严格按照交易规则执行。此策略利用交叉外汇对的市场价格与其合成价格的价差来实现套利,还以EUR/USD和GBP为例:1,我们关注三个外汇对:EUR/USD,GBP/USD,以及GBP/EUR2,计算GBP/...

weixin_29531897的博客 2418

避坑指南:群晖DSM 7.X挂载NTFS硬盘,为什么你的SATA口不行?从原理到实战一次讲清

本文深入解析群晖DSM 7.X系统挂载NTFS硬盘的底层原理与实战排查方法,揭示SATA接口权限配置的关键参数(如esataportcfg和internalportcfg),并提供安全修改端口配置的详细步骤。针对不同型号群晖NAS的配置差异,给出替代方案与常见故障排查技巧,帮助用户解决NTFS硬盘挂载问题。

weixin_26757925的博客 256

React使用?/search和params传参 (react 函数非类)

react 页面跳转传参 search ? params

ICUiseeyou的博客 1529

告别玄学调试:用STM32CubeMX和逻辑分析仪搞定DP83848的RMII与SMI接口

本文详细介绍了如何使用STM32CubeMX和逻辑分析仪调试DP83848的RMII与SMI接口,帮助开发者超越表象,直接观察底层通信波形。通过实战案例和高级调试技巧,解决常见问题如时钟偏移、信号完整性等,提升网络接口的稳定性和可靠性。

weixin_30752699的博客 299

react路由01——react-routerV6 中路由传递参数的几种方式

react路由01——react-routerV6 中路由传递参数的几种方式

@素素~的博客 2121

cartographer ceres后端优化

这里引用一篇文章作用一:用户可以选择使用Problem::AddParameterBlock显式添加参数块;在显式添加的时候ceres会内部进行额外的正确性检查。当Problem::AddParameterBlock()不存在时,Problem::AddResidualBlock()会隐式添加参数块,因此不需要显式调用Problem::AddParameterBlock()函数。ps:类似构造函数,显式构造函数。

南北粉面馆 802

【OCPP】ocpp1.6协议3.3章节:功能配置文件及接口

Smart Charging Profile中定义了4个接口请求,即GetCompositeSchedule、ClearChargingProfile、SetChargingProfile和ClearCache等。Smart Charging: 包含智能充电相关的功能,如计划充电,报告充电计划,并改变充电速度。Core: 包含电动汽车充电相关的基础功能,如启动和停止充电,更改充电配置,报告充电状态等。Reservation: 包含预约服务相关的功能,如创建,取消和更改预约。

qq_53871375的博客 2171

React学习笔记(2)—使用create-react-app自动化构建项目

使用create-react-app自动化构建项目 $ cnpm install -g create-react-app $ create-react-app react-learning $ cd react-learning/ $ npm start create-react-app是基于webpack+es6的react项目自动化构建工具,假设您已经安装好node npm cnpm...

生如夏花 炫至茶靡 1225

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

react简书项目学习笔记2组件,jsx基础语法

jsx里return的内容必须只有一个根元素,如果不希望包在最外层的元素显示出来,可以使用react的fragment占位符,先在js中引入fragment,然后就可以直接使用&amp;lt;Fragment&amp;gt;标签去包裹 ...

MeiLuan_yahoho的博客 220

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2024年Web前端最全React学习笔记六——用creact-react-app脚手架创建项目(2),2024年最新面试题目100及最佳答案

进入项目:cd my-react-project。启动项目:npm/yarn start。React脚手架项目结构。

2401_84447262的博客 234

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

reactjs-vite-tailwindcss-boilerplate核心功能揭秘:为什么它是React项目的终极选择

reactjs-vite-tailwindcss-boilerplate是一个集成了Vite、React 18、TypeScript、Vitest、Testing Library、TailwindCSS 3、Eslint和Prettier的强大项目模板,为React开发者提供了一站式的开发解决方案,帮助快速构建现代化的Web应用。 ## 🌟 核心技术栈解析 ### Vite:极速构建体验 作

gitblog_00620的博客 1940

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ReactJs-Phonegap 项目教程

ReactJs-Phonegap 项目教程 1、项目介绍 ReactJs-Phonegap 是一个基于 ReactJS 和 Phonegap 的启动模板,它将强大的 React 框架与 Phonegap 的跨平台移动开发能力结合在一起,让你可以快速搭建原生的移动应用程序。此外,这个项目还集成了 ReactFlux 以提供状态管理,以及 React-TopcoatUI 进行现代化的 UI 设计。 主...

gitblog_00650的博客 1108

推荐项目:AngularJS与ReactJS的完美融合 —— angular-react

推荐项目:AngularJS与ReactJS的完美融合 —— angular-react 在现代前端开发中,寻求高效、灵活的技术解决方案一直是开发者们的追求。今天要向大家隆重推荐的开源项目——angular-react,正是这样一座连接两大前端巨头AngularJS和ReactJS的桥梁。该项目巧妙地将AngularJS的丰富功能与ReactJS的高性能视图渲染能力融为一体,为复杂Web应用提供了...

gitblog_00261的博客 1823

Reactjs-popup贡献指南:如何参与开源项目开发与维护

Reactjs-popup是一个功能强大的React弹窗组件库,支持模态框、工具提示和菜单等多种弹窗类型。如果你想为这个优秀的开源项目贡献代码,本指南将为你提供完整的参与流程和实用技巧。无论你是React新手还是经验丰富的开发者,都能找到适合的贡献方式。 ## 为什么选择Reactjs-popup进行贡献? Reactjs-popup是一个轻量级但功能丰富的React弹窗库,具有以下优势: -

gitblog_00571的博客 1760

WebStrom创建ReactJs项目

1.下载安装 WebStrom 可以在官网直接下载,也可以点击提供链接直接前往https://www.jetbrains.com/webstorm/具体破解方法核心就是一直下一步出现在需要选择地址的时候输入http://idea.codebeta.cn(填写的地址不是超链接)2.下载NodeJS并安装可以在网上直接百度官网下载并安装即可,主要目的是为了安装和他一起下载并安装的NPM(包管理器)wi...

爪哇犀牛 1482

ReactJS Vite TailwindCSS 样板项目教程

ReactJS Vite TailwindCSS 样板项目教程 项目介绍 reactjs-vite-tailwindcss-boilerplate 是一个基于 Vite、React 18、TypeScript、Vitest、Testing Library、TailwindCSS 3、Eslint 和 Prettier 的样板项目。该项目旨在为开发者提供一个快速启动 React 应用的基础框架,集成...

gitblog_00825的博客 1013

Spring PetClinic ReactJS 项目教程

Spring PetClinic ReactJS 项目教程 项目介绍 Spring PetClinic ReactJS 是一个基于 ReactJS 和 TypeScript 的前端项目,与 Spring Boot 后端相结合,用于展示宠物诊所的管理系统。该项目是 Spring PetClinic 示例应用程序的一个端口,旨在通过 React 前端提供更现代的用户界面。 项目快速启动 环境准备 在开...

gitblog_00743的博客 1145

Markdown Editor ReactJS 项目教程

Markdown Editor ReactJS 项目教程 项目介绍 Markdown Editor ReactJS 是一个基于 React.js 的开源 Markdown 编辑器项目。它提供了一个简单易用的界面,使用户能够轻松地编写和预览 Markdown 文档。该项目旨在帮助开发者快速集成一个功能强大的 Markdown 编辑器到他们的 React 应用中。 项目快速启动 安装 首先,克隆项目到...

gitblog_01133的博客 1123

使用reactjs-popup创建React模态框(Modal)的完整指南

在现代Web开发中,模态框(Modal)是一种常见的UI组件,用于显示重要信息、收集用户输入或确认操作。reactjs-popup库提供了一种简单而强大的方式来创建React模态框,无需复杂的配置即可实现专业级的弹窗效果。 ## 基础模态框实现 使用reactjs-popup创建基础模态框非常简单,只需在Popup组件上添加`modal`属性即可: ```jsx import Popup f

gitblog_00215的博客 1259

reactjs-swiper 在react项目中实现轮播

1.快速新建项目 npx create-react-app swiper 2.安装依赖 yarn add reactjs-swiper axios --save-dev 3.文件目录 App.js import React, { Component } from 'react'; import './App.scss'; import SwiperBar from './Swip...

Twinkle的博客 5940

入门指南:从零开始学习ReactJS

ReactJS是一个强大的JavaScript库,用于构建用户界面。它由Facebook开发,并于2013年首次发布。自那时以来,React已成为前端开发中最受欢迎的库之一,许多公司和开发者都在使用它来构建高性能、交互式的Web应用程序。本文将向您介绍ReactJS的基础知识,并通过实践示例来帮助您入门。我们将从React的核心概念开始,逐步深入,直到您能够构建简单的React应用为止。

努力是为了站在万人之中,成为别人的光 2万+
上一篇: React项目笔记1-json-server的配置
下一篇: 用Custom Hook提取并复用组件代码
cloudgaps
博客等级 码龄6年 11粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值