前端(三)React踩坑记录

news2024/11/25 6:55:29

一、引言

        作者最近新的平台项目是需要用react的,和vue区别还是比较大的,这里记录下踩坑和使用经验。

二、环境

        框架:antd

        依赖:

"dependencies": {
        "@ant-design/icons": "^4.7.0",
        "@ant-design/plots": "^1.0.9",
        "@aws-sdk/token-providers": "3.501.0",
        "@babel/helper-string-parser": "^7.22.5",
        "@loadable/component": "5.15.3",
        "@rjsf/antd": "^5.13.0",
        "@rjsf/core": "^5.13.0",
        "@rjsf/utils": "^5.13.0",
        "@rjsf/validator-ajv8": "^5.13.0",
        "@testing-library/jest-dom": "^4.2.4",
        "@testing-library/react": "^9.3.2",
        "@testing-library/user-event": "^7.1.2",
        "ajv": "^8.12.0",
        "antd": "^4.20.0",
        "axios": "^0.21.1",
        "babel-eslint": "^10.1.0",
        "bignumber.js": "^9.1.2",
        "core-js": "^3.20.3",
        "cross-env": "^7.0.2",
        "customize-cra": "^1.0.0",
        "diff_match_patch": "^0.1.1",
        "ejs": "^3.1.3",
        "enzyme": "^3.11.0",
        "express": "^4.17.1",
        "json-bigint": "^1.0.0",
        "lodash": "^4.17.21",
        "mockjs": "^1.1.0",
        "moment": "^2.29.4",
        "nodemon": "^2.0.4",
        "qrcode": "^1.5.1",
        "qrcode.react": "^3.1.0",
        "rc-queue-anim": "^2.0.0",
        "rc-texty": "^0.2.0",
        "rc-tween-one": "^3.0.6",
        "react": "^17.0.2",
        "react-app-rewired": "^2.1.8",
        "react-dom": "^17.0.2",
        "react-router-dom": "^5.2.0",
        "react-scripts": "4.0.2",
        "react-transition-group": "^4.4.2",
        "styled-components": "^6.1.8",
        "tslib": "^2.4.0",
        "typescript": "~3.7.2",
        "xlsx": "^0.18.5",
        "yarm": "^0.4.0",
        "yarn": "^1.22.19"
    },

三、React踩坑

1、编译

        不知道是react本身编译规则严苛,还是公司的pipline设定,代码里面编译的时候不允许有未使用的变量,不允许使用未导入的组件

        举个例子,如果使用了分页,但是没有导入Pagination,编译报错

import {Button, Modal, Layout, messag, Space, Table, Cascader, Input} from 'antd';


<Pagination onChange={this.onPageChange} total={this.state.totalSize}/>

        如果标识了参数但是没有用,编译报错

onPageChange = (page, size) => {
        this.setState({page: page});
        this.loadList();
    };

2、变量延迟

        这是很坑的,设置变量值之后居然没有变,是有延迟的,所以当设置完之后需要间隔一下再去使用,作者就出现了点击第二页显示第一页

onPageChange = (page, size) => {
        this.setState({size: size});
        this.setState({page: page});
        setTimeout(() => {
            this.loadList();
        }, 5);
    };

3、分页

        根据官网显示,列表数量超过50才会显示数量选择器,除非你显式指定,但是问题是有必要组件自己做这种判断吗,看的人一头雾水

4、上传文件多次触发

        这里就是上传组件里面嵌套了一个按钮,不知道为什么选中文件之后会多次触发fileChange

,fileChange调用upload然后后面两次的文件还是空的,然后就告警两次

<Upload
                                        loading={this.state.uploadLoading}
                                        id='modify-excel-input'
                                        className='modify-excel-input'
                                        accept='.xls,.xlsx'
                                        action={getUploadFileUrl()}
                                        beforeUpload={this.checkFile}
                                        onRemove={this.deleteFile}
                                        onChange={this.fileChange}
                                        maxCount={1}
                                    >
                                        <Button
                                            loading={this.state.uploadLoading}
                                            icon={<UploadOutlined/>}>上传</Button>
                                    </Upload>


upload = () => {
        console.log('RetrySelect upload');
        if (this.state.fileList == null || this.state.fileList.length <= 0
            || this.state.fileList[0].response == null || this.state.fileList[0].response.length <= 0) {
            message.error("请上传文件");
            return;
        }
 }

        所以作者就在fileChange里面加了判断看文件是否为空

fileChange = ({fileList: newFileList}) => {
        if (newFileList == null || newFileList.length <= 0
            || newFileList[0].response == null || newFileList[0].response.length <= 0) {
            return;
        }
        console.log("文件列表: ", newFileList);
        this.state.fileList = newFileList;
        this.upload();
    }

 5、绑定本地变量

        输入框、选择框之类的组件需要和本地变量进行绑定,但是他就不像vue简单的设置v-model就可以,他需要识别变更方法

        还必须bind(this),不然绑定本地变量的话根本没法写进输入框,官网也没什么说法,chatGpt也不知道,让人一头雾水

<Input 
                                       maxLength={100}
                                       value={this.state.subject}
                                       style={{width: '350px'}}
                                       onChange={this.changeSubject.bind(this)}
                                       placeholder="请输入"/>

changeSubject = (event) => {
        this.setState({subject: event.target.value});
    };

四、使用

        这里再介绍一些基础使用

1、动态列

        如果表格数据不固定,就可以后端返回列名

const processedColumns = resData.columns.map(column => {
                return {
                    ...column,
                    dataIndex: column.dataIndex,
                    title: column.title,
                    width: '200px',
                };
            });


            this.setState({columns: processedColumns})


<Table
                                columns={this.state.columns}
                                dataSource={this.state.list}
                                bordered
                                scroll={{x: 1500, y: 'calc(100vh - 350px)'}}
                                pagination={false}
                            />

2、超长展示

        超过一定长度展示省略号,悬浮展示所有

{
                title: 'response',
                dataIndex: 'response',
                width: '180px',
                render: (text) => {
                    return <Tooltip placement="top" title={text}>
                        <div style={{
                            width: 150,
                            overflow: "hidden",
                            textOverflow: "ellipsis",
                            whiteSpace: "nowrap"
                        }}>{text}</div>
                    </Tooltip>

                }
            },

3、跳转携带参数

        原始页面把参数直接缀在路径后面就可以,如果是很多参数可以用json转字符串,到目标页面进行解析

const w = window.open('about:blank');
        w.location.href = '#/detail/' + record.id;

        目标页面通过匹配参数拿到

constructor(props) {
        super(props);
        this.state = {
            loadingExecute: false,
            id: props.match.params.id,

        参数的名字是由配置url页面决定的

{
        path: '/detail/:id?',
        name: 'detail',
        pageId: '1010',
        authPass: true,
    },

4、弹窗

        他的弹窗使用visible属性判断是否展示的,在render里面定义号,然后通过更新本地变量进行展示隐藏

<Modal visible={this.state.executeVisible} onOk={this.goExecute.bind(this)}
                               onCancel={this.handleCancel.bind(this)}
                               footer={[
                                   <Button key="submit" type="primary" onClick={this.goExecute.bind(this)}>
                                       确认
                                   </Button>,
                                   <Button key="back" onClick={this.handleCancel.bind(this)}>
                                       取消
                                   </Button>
                               ]}>
                            <div style={{marginTop: '20px'}}>
                                <span style={{width: '80px', marginRight: '10px'}}>工单</span>
                                <Input 
                                       maxLength={100}
                                       value={this.state.woCode}
                                       style={{width: '350px', marginRight: '20px'}}
                                       onChange={this.changeWoCode.bind(this)}
                                       placeholder="请输入"/>
                            </div>
                            <div style={{marginTop: '20px'}}>
                                <span style={{width: '80px', marginRight: '10px'}}>主题</span>
                                <Input 
                                       maxLength={100}
                                       value={this.state.subject}
                                       style={{width: '350px'}}
                                       onChange={this.changeSubject.bind(this)}
                                       placeholder="请输入"/>
                            </div>
                        </Modal>

5、获取浏览器信息

        主要是获取域名和cokkie

const cookie = document.cookie.split(';')

const host = document.domain.toLowerCase()

五、总结

        不同的前端使用起来区别挺大的,作者感觉还是vue好用一些,不过react好像更加国际化一些,公司整体还是偏向用react。

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

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

相关文章

Linux使用Docker部署RStudio Server结合内网穿透实现公网访问本地服务

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

卷积层+多个输入通道

卷积层多输入输出通道 在深度学习中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;通常用于处理具有多个输入通道的数据。当输入数据具有多个通道&#xff08;例如彩色图像的RGB通道&#xff09;时&#xff0c;卷积操作可以同时在每个通道上进行&#xff0c;并将各通道的…

【成功案例】间隔数月双团伙先后利用某ERP0day实施入侵和勒索的解密恢复项目

1.背景 在2024年3月23日&#xff0c;我们的Solar应急响应团队&#xff08;以下简称Solar团队&#xff09;应某公司之邀&#xff0c;介入处理了一起财务系统服务器遭受黑客攻击的事件。该事件导致服务器上大量文件被加密。我们的团队迅速获取了一个被加密的文件&#xff0c;并立…

面试题:MySQL 优化篇

定位慢查询 &#x1f496; 开源工具 调试工具&#xff1a;Arthas&#xff08;阿尔萨斯&#xff09;运维工具&#xff1a;Prometheus&#xff08;普罗米修斯&#xff09;、Skywalking &#x1f496; MySQL 慢查询日志 # 开启 MySQL 慢查询日志开关 slow_query_log1 # 设置慢…

HWOD:整型数组排序

一、知识点 while(1){}表示永久循环 使用break结束循环 二、题目 1、描述 输入整型数组和排序标识&#xff0c;对其元素按照升序或降序进行排序 2、数据范围 1<n<1000 0<val<100000 3、输入 第一行输入数组元素个数 第二行输入待排序的数组&#x…

安装JupyterLab的集成环境

Python集成环境安装 不要半途而废&#xff0c;不要作业太多就抛下你手中的笔&#xff0c;拿起你旁边的手机&#xff0c;你觉得这样很有意义吗&#xff1f;一个小时一道题都没做&#xff0c;盯着手机屏幕它能给你一个未来吗&#xff1f;少分心就能多做一道题&#xff0c;多学样本…

编程新手必看,Python开发环境工具揭秘:高效编程的必备工具(2)

1、Python主流的开发工具介绍&#xff1a; Python的主流开发工具主要包括PyCharm、Visual Studio Code&#xff08;VS Code&#xff09;、IDLE等。具体介绍如下&#xff1a; 1.1、PyCharm&#xff1a; PyCharm是由JetBrains开发的&#xff0c;专为Python设计的IDE&#xff0…

生成 SSH 公钥

Windows 用户建议使用 Windows PowerShell 或者 Git Bash&#xff0c;在 命令提示符 下无 cat 和 ls 命令。 1、通过命令 ssh-keygen 生成 SSH Key&#xff1a; ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型 -C 注释 输出&#xff0c;如&#xff1a; 中间…

【tensorflow框架神经网络实现鸢尾花分类_Keras】

文章目录 1、前言2、鸢尾花分类3、结果打印 1、前言 【tensorflow框架神经网络实现鸢尾花分类】一文中使用自定义的方式&#xff0c;实现了鸢尾花数据集的分类工作。在这里使用tensorflow中的keras模块快速、极简实现鸢尾花分类任务。 2、鸢尾花分类 import tensorflow as t…

python如何画奥运五环

绘制奥运五环主要涉及到Python中的turtle绘图库运用&#xff1a; 程序源代码为&#xff1a; import turtle turtle.width(10) turtle.color(black) turtle.circle(50) turtle.penup() turtle.goto(120,0) turtle.pendown() turtle.color(red) turtle.circle(50) turtle.penup()…

KT-0850——三箱社交箱

动物行为学是一门跨学科的科学&#xff0c;致力于研究动物的行为模式、决策过程以及它们如何在不同的环境中进行社交互动。在探索动物王国的奥秘时&#xff0c;科学家们发展出了多种实验方法&#xff0c;其中三箱社交实验是一种被广泛采用的技术&#xff0c;用于揭示动物在社交…

力扣热题100_链表_141_环形链表

文章目录 题目链接解题思路解题代码 题目链接 141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

从C到C++:深入理解基础语法差别

C基础语法讲解 前言1.输入输出2.命名空间2.1命名空间的理解&#xff1a;2.2命名空间的使用方式 3.缺省参数3.1概念&#xff1a;3.2分类&#xff1a;半缺省函数注意事项&#xff1a; 3.3使用案例&#xff1a;顺序表的初始化 4.函数重载4.1参数重载类型类型&#xff1a; 5.引用5.…

企业员工在线培训系统功能介绍

随着信息技术的飞速发展&#xff0c;企业员工培训方式正逐步从传统的面授转向灵活高效的在线培训。一个综合性的企业员工在线培训系统能够为员工提供多样化的学习资源、便捷的学习途径和有效的学习监督&#xff0c;以下是该系统的主要功能详细介绍&#xff1a; 1. 课程功能 线…

API接口对接全攻略:从入门到精通

在数字化时代&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为了不同软件系统间信息交互的桥梁。对于开发者而言&#xff0c;掌握API接口的对接技术&#xff0c;无疑是通往更高效、更智能的软件开发之路的钥匙。本文将为大家提供一份从入门到精通的API接口对接全攻…

C++语言·入门

现在我们讲完了数据结构初阶部分的内容&#xff0c;数据结构剩下的内容会在C语言讲解的差不多的时候加入。 1. 什么是C C语言是结构化模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度抽象和建模时&#xff0c…

CorePoolExecutor夺命连环问?看你可以接受几招?

一、前言 今天我在看why技术的时候&#xff0c;看到了这个。发现这个没有全部的八股回答&#xff1f;于是我就结合自己的经验&#xff0c;分享下八股 二、八股问答 2.1了解JDK Executors线程池吗? Executor就是一个线程池框架&#xff0c;在开发中如果需要创建线程可优先考…

期权的常见结构

期权收益图 期权的**收益&#xff08;payoff&#xff09;**是指期权到期日时的价值&#xff0c;**期权的损益&#xff08;profit&#xff09;**不但包含期权的收益&#xff0c;还包括期权交易开始时发生的期权费。 买入看涨期权 看涨期权买入方&#xff0c;当到期时标的资产…

【讲解下NLP学习路线的总结】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

嵌入式网络硬件方案

一. 简介 本文来了解一下嵌入式有些网络中&#xff0c;涉及的网络硬件方案。 注意&#xff1a;本文说明的是有些网络。 提起网络&#xff0c;我们一般想到的硬件就是“网卡”&#xff0c;“网卡”这个概念最早从电脑领域传出来&#xff0c;顾名思义就是能上网的卡。在电脑领…