react-问卷星项目(2)

流程

husky

一个git hook 工具,即在git commit之前执行自定义的命令,将规范流程化,如执行代码风格的检查,避免提交非规范的代码,在github搜索即可。

这两条是接着执行的,表示创建husky,在文档说明里也有,我按照视频里的指令执行会显示初始化失败,这两条我自己用的没问题。

npm install --save-dev husky
npx husky init

这个pre-commit就是表达在提交之前要执行什么操作,这个foramt是开始在package.json中写的规则之一,这里依次写上想要在commit之前执行的规则就行,最后还加一个git add .是因为format是有重写功能的,所以加上这一句可以在出错的时候更改后再次提交。

记得第二句的箭头是>>表示追加,要是两句都是>则后一句会覆盖前一句,可以在.husky/pre-commit文件中查看是不是有相应的提交指令,这控制台或者直接在这个文件中添加都是可以的。

echo "npm run format" > .husky/pre-commit
echo "git add ." >> .husky/pre-commit 

添加完毕后按照流程执行到commit,可以看控制台是不是有执行相关指令的提示。

commit lint

限制commit提交的规范(不是非必需)

还是直接复制粘贴执行就行,有问题的可以去github找一下看相关文档,前两句是创建,后一句同样是添加一个在.husky下面名叫commit-msg的文件,可以去看一下有没有这个文件

npm install --save-dev @commitlint/{cli,config-conventional}"export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js"npx --no -- commitlint --edit \$1" > .husky/commit-msg

在这里我碰到一个问题,就是前面创建的指令中是创建了一个名为./commitlint.config.js的文件,但是这个文件会报错,视频里教的是保存一下就行,我试了下,保存后确实不报错了,但是提交的时候还是会报错,我觉得这里可能和我前面用脚手架创建项目的时候选的一些配置有关,并不支持es6的格式,所以按着其他的文件改了下,还是有红,但是再次提交的时候就没报错了。

export default { extends: ['@commitlint/config-conventional'] };
// 改为
module.exports = { extends: ["@commitlint/config-conventional"] };

然后再说明下这个的作用,就是用来规范commit的写法的,比如下面这两句,第一句会报错,第二句就不会了,前面添加的chore是主题。

git commit -m"commit-lint"git commit -m"chore: commit-lint"

主题可以按照前面那个下载的路径去相应的文件夹下查看,node_modules/@commitlint/config-conventional/lib/index.js 我这个项目中的路径是这样的,反正就是找到index.js文件,找到类似下面这一部分

JSX语法和组件

JSX语法

JSX是JS的扩展,写在JS代码里面,组件的UI结构,类似HTML结构,只是HTML不能写在js中,JSX可以写在js中,已成为ES规范,不是React独有,其他框架中也能写,比如Vue3。

先看文件后缀名,用js语法的时候文件后缀为.js,用js写react的时候后缀要更换为.jsx。同理用ts语法的时候文件后缀为.ts,用ts写react文件的时候后缀要更换为.tsx。所以在tsx后缀文件中看到了类似HTML语法的内容实际上就是JSX语法。

JSX标签和HTML标签的不同

  • 小写是常见的html组件,大写是自定义组件
  • 非闭合组件在JSX是违法,所有标签必须是两个一起闭合或者自闭合,比如input
  • 每个JSX片段中只能有一个根节点,跟vue文件单节点相似。因为片段中可能相互嵌套,那很多作为根节点的div除了作为容器可能就没有意义,可以使用Fragment,即一个空的开始和结束,不能添加任何属性。

属性

  • class改为className,for要改为htmlFor。两个都是因为class和for是关键字所以要另外其名避免这个问题。
  • style要使用JS对象(不能使用字符串),并且其中的key要驼峰写法,即前面的属性,比如HTMl中写为background-color,在JSX中写为backgroundColor
style="color:red"
//更换为
style={{ color: "red" }}

事件

  • 使用onXxx的形式
  • 必须传入一个函数(是fn而非fn())
  • 注意Typesript类型
function App() {const fn = () => {console.log("click");};return (<div><button onClick={fn}></button>// 不要写onClick={fn()}</div>
}

TypeScript基础知识

在线转换网址

ts方便在开发环境下有类型及早识别错误,提高开发效率和代码稳定性。

// ts中引入了数据类型
const n: number = 100
const s :string = "s"function fn(a: number) {return a + 100;
}
fn(10)// js中相应的设置不需要设置类型
var n = 100;
var s = "s";

可定义泛型类T,T的类型根据传入的参数进行改变,如果传值不符合这个类型也会报错,ts中<>表示的就是泛型,比如下面这个。传进去T为string类型

function fn<T>(info: T) {console.log(T);
}
fn<String>("Hello")class foo{info: stringsetInfo(newInfo: string) {this.info = newInfo}
}
const F1:foo = new foo();
// 上面的类转换成js格式如下
// 这个写法是es6之前没有块级领域时的写法,即匿名立即执行函数表达式(匿名 IIFE)
var foo = /** @class */ (function () {function foo() {}foo.prototype.setInfo = function (newInfo) {this.info = newInfo;};return foo;
}());
var F1 = new foo();

如果有两个参数,比如下面这种情况,非标准格式,想要表达的意思就是前面第二点说过,要传入一个函数fn而不是fn(),这里如果有另一个参数,那只写成fn就会报错,有个解决方法如下,写成函数调用的形式就不会违反传入参数只能是函数这个规则了。

const fn = (event: MouseEvent<HTMLButtonElement>,name:string){console.log('clicked...',name)   
}
onclick = {event => {fn(event,'双越')
}}

插入JS变量

  • 使用{xxx}可以插入JS变量,函数,表达式,比如src或者是onClick等
  • 可插入普通文本,属性
  • 可用于注释,在大括号中可以插入注释
{/* JSX注释内容 */}
{/* <p></p> */}

条件判断

  • 使用&&
  • 使用三元表达式
  • 使用函数
const flag = true;
<div>/* flag为true展示p标签 */{flag && <p>Hello</p>}
</div>//  自定义标签大写,小写会报错function Hello() {if (flag) return <p>Hello</p>;return <p>你好</p>;}<div>{flag && <p>Hello</p>}{flag ? <p>Hello</p> : <p>你好</p>}<Hello></Hello>
</div>

循环

  • 使用map执行循环
  • 每个item元素需要key属性
  • key在同级别唯一(强烈不建议使用index作为key,而是使用可以保证唯一的属性)
  const list = [{ id: "1", name: "zs" },{ id: "2", name: "ls" },{ id: "3", name: "ww" },];<div>{list.map((user) => {const { id, name } = user;return <li key={id}>{name}</li>;})}</div>

实战开发

都比较基础,我对自己不理解的会另外补充,别的基本就是代码直接贴上去。

  • 循环出一个基础页面加导入样式
import React from "react";
import "./App.css";function App() {// 列表页const questionList = [{ id: "q1", title: "问卷1", isPublished: true },{ id: "q2", title: "问卷2", isPublished: false },{ id: "q2", title: "问卷3", isPublished: false },{ id: "q2", title: "问卷4", isPublished: false },];function edit(id: string) {console.log(id);}return (<div><h1>问卷列表页</h1><div>{questionList.map((list) => {const { id, title, isPublished } = list;return (<div key={id} className="list-item"><strong>{title}</strong><br />{/* {条件判断} */}{isPublished ? (<span style={{ color: "green" }}>已发布</span>) : (<span>未发布</span>)}<buttononClick={() => {edit(id);}}>编辑问卷</button></div>);})}</div></div>);
}export default App;

组件和props

组件式React的基础,props是组件的基础

  • 组件就是一个UI片段
  • 拥有独立的逻辑和显示,不仅仅是静态的,而是有创建销毁等“生命周期”
  • 组件可大可小,可嵌套
  • 组件的价值和意义
    • 组件嵌套来组织UI结构,和HTML一样无学习成本
    • 组件拆分,利于代码维护,和多人协作开发
    • 可封装公共组件(或第三方组件)服用代码,提高开发效率
  • React支持class组件,函数组件,但在React16之后,React推崇函数组件

组件抽离

App是项目根节点,所有内容集中在这个位置不太好,所以接下来将所有组件抽离出来。

新建List1.tsx,代码内容如下,即将需要抽离的部分放入到这个FC结构中,记得FC是数据类型,这里规定了房间去的内容为FC,所以里面一定要至少有一个标签。

import React, { FC } from "react";
// FC是一个TS类型,可以通过Import type获取
// import type { FC } from "react";const List1: FC = () => {const questionList = [{ id: "q1", title: "问卷1", isPublished: true },{ id: "q2", title: "问卷2", isPublished: false },{ id: "q2", title: "问卷3", isPublished: false },{ id: "q2", title: "问卷4", isPublished: false },];function edit(id: string) {console.log(id);}return (<div><h1>问卷列表页</h1><div>{questionList.map((list) => {const { id, title, isPublished } = list;return (<div key={id} className="list-item"><strong>{title}</strong><br />{/* {条件判断} */}{isPublished ? (<span style={{ color: "green" }}>已发布</span>) : (<span>未发布</span>)}<buttononClick={() => {edit(id);}}>编辑问卷</button></div>);})}</div></div>);
};
export default List1;

更改存放了List1的组件样式的文件名称,尽量保持和组件内容一致,然后在App中如下导入使用

import React from "react";
import "./List1.css";
import List1 from "./List1";function App() {// 列表页return (<><List1></List1></>);
}export default App;

React开发者工具

是一个Chrome插件,Vue也有一个类似的调试插件

官网搜索chrome react dev tool,因为是外网所以搜索不到,我这里本身有翻墙,所以直接在chrome搜索的,搜索到官网点击进去下载即可。

不知道是什么原因,没看到相关的插件,直接打开chrome的右上角三个点,选择管理扩展插件看看有没有刚刚下载的那个工具的名字,没有的话直接商店搜索然后下载应用就可以,成功的话点开开发界面右边那个箭头应该有相应的紫色图标,点击和图中一致的即可。但如图所示,我这边并没有展开,相应的原因不清楚,我选择直接看浏览器元素。

找到原因了……因为中间漏了一节课,老师在那节课中用一个组件封装包裹起来了,所以会显示四条用另一个组件封装的数据,这里就不多加了。总结一下意思就是,如上面那个图所示,只用List封装了一个列表,而里面的内容并没有展示出来,老师展示的效果是List里面的N条数据都用固定的组件模版返回,所以展示出来的是List下面还有N条数据,每个数据以封装他们的组件命名。

JSX和Vue模版区别

比较有代表性的而不是全部

  • 判断:Vue模版使用v-if指令
  • 循环:Vue模版使用v-for指令
  • 设计理念:React-能用JS就用JS(需要JS基础扎实),Vue自定义很多指令,方便初学者记忆和学习,不过现在vue3也能很好的支持JSX语法。

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

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

相关文章

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

fastadmin搜索刷新列表,怎么限制用户频繁点击?

文章目录 fastadmin搜索刷新列表&#xff0c;怎么限制用户频繁点击&#xff1f;解决方案fastadmin事件方法实现完结 fastadmin搜索刷新列表&#xff0c;怎么限制用户频繁点击&#xff1f; fastadmin目前有个很致命的问题&#xff0c;就是用户可以频繁的点击搜索等按钮&#xf…

Linux防火墙-nat表

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

android kotlin Extension扩展函数

1、新建一个kt文件&#xff1a; 2、代码&#xff1a; class User(var name:String)/**扩展函数**/ fun User.Print(){print("用户名 $name") }// 扩展函数 swap,调换不同位置的值 fun MutableList<Int>.swap(index1: Int, index2: Int) {val tmp this[index1…

组合逻辑元件与时序逻辑元件

组合逻辑元件和时序逻辑元件都是数字电路中的基本构建块&#xff0c;但它们在功能和结构上存在显著差异。 1. 组合逻辑元件: 内容: 组合逻辑元件的输出仅取决于当前的输入&#xff0c;而与之前的输入无关。 它们没有记忆功能。 常见的组合逻辑元件包括&#xff1a; 与门 (AND…

Java_TestNg

TestNg 前言支持特性 使用步骤1.引入库 常用注解Test注解BeforeSuite AfterSuiteAfterClass BeforeClassAfterTest BeforeTestAfterGroups BeforeGroupsBeforeMethod AfterMethodDataProviderFactoryListenersPatameters断言相等 不相等true/falsenull / !nullequals / !equals…

【C++篇】启航——初识C++(上篇)

目录 引言 一、C的起源和发展史 1.起源 2.C版本更新 二、C在⼯作领域中的应⽤ 三、C入门建议 1.参考文档 2.推荐书籍 四、C的第一个程序 1.C语言写法 2.C写法 五、命名空间 1.为什么要有命名空间 2.定义命名空间 3.主要特点 4.使用示例 六、C输⼊&输出 …

系统架构师-面向服务架构(SOA)全解

1、为什么需要SOA架构 1.1 系统集成问题 异构系统整合 例如&#xff0c;一个企业可能同时拥有用 Java 开发的企业资源规划&#xff08;ERP&#xff09;系统、用 C# 开发的客户关系管理&#xff08;CRM&#xff09;系统以及用 Python 开发的数据分析系统。通过 SOA&#xff0…

Transformers 中的 Softmax 可以并行加速么?

Transformers 中的 Softmax 可以并行加速么&#xff1f; 面试题 Softmax 如何并行&#xff1f; Softmax 计算公式 安全的 Softmax 运算 Softmax函数在深度学习中广泛应用于多分类问题的输出层&#xff0c;它通过指数化和归一化将一个实数向量转换为概率分布。然而&#xff…

基于springboot vue 大学生竞赛管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

YoloV10改进策略:BackBone改进|PoolFormer赋能YoloV10,视觉检测性能显著提升的创新尝试

摘要 在深度学习的广阔领域中,目标检测作为计算机视觉的基石任务之一,始终吸引着研究者的广泛关注。近期,我们大胆尝试将前沿的PoolFormer主干网络引入经典的目标检测框架YoloV10中,这一创新性融合不仅为YoloV10注入了新的活力,更在检测精度与效率上实现了双重飞跃,成为…

【Linux学习】【Ubuntu入门】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件&#xff0c;点击开启此虚拟机后&#xff0c;等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端&#xff0c;输入命令sudo apt-get install vim安装vim&#xff0c;输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性&#xff0c;让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者&#xff0c;携其革命性的Web端云剪辑解决方案&#xff0c;正重新定义视频创作的边界&#xff0c;让专业级视频剪辑触手可及&#xff…

【Linux】Docker下载与使用-nginx

目录 一、Docker介绍 二、Docker结构 三、下载Daocker 1. 在linux上下载docker&#xff0c;执行以下命令即可&#xff1a; 2. 开启docker 3. 执行以下操作并进行使用 四、在Docker上安装nginx 一、Docker介绍 Docker&#xff1a;是给予Go语言实现的开源项…

深入探讨 Docker:远程登录与镜像管理

深入探讨 Docker&#xff1a;远程登录与镜像管理 走一路&#xff0c;寻索一路。每有胡杨树&#xff0c;我必仔细浏览&#xff0c;驻足长久&#xff0c;如急于兑现一个久远的梦。而更多平常的日子如同荒原本身一样朴实无华&#xff0c;如同岁月一样不露形色&#xff0c;只守着一…

统信服务器操作系统【SSH登录常见问题】解决方案

方案适用于统信服务器操作系统D/E/A版。 文章目录 前言问题及解决方案问题一问题现象问题原因问题方案问题二问题现象问题原因问题方案问题三问题原因问题方案问题四问题现象问题原因问题方案问题五问题现象问题原因问题方案问题六问题现象问题原因问题方案前言 介绍日常使用s…

SPI驱动学习七(SPI_Slave_Mode驱动程序框架)

目录 一、SPI_Slave_Mode驱动程序框架1. Master和Slave模式差别1.1 主设备 (Master)1.2 从设备 (Slave)1.3 示例 2. SPI传输概述2.1 数据组织方式2.2 SPI控制器数据结构 3. SPI Slave Mode数据传输过程4. 如何编写程序4.1 设备树4.2 内核相关4.3 简单的示例代码4.3.1 master和s…

Jenkins本地安装配置与远程访问管理本地服务详细流程

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…

活动报名| 探索存内计算的未来,共话AGI时代

活动日期&#xff1a;2024年09月28日 下午1&#xff1a;00-6&#xff1a;00 活动地点&#xff1a;杭州技术转移中心 三楼路演厅 议程亮点&#xff1a; 存内计算技术架构以及最新趋势AGI开源项目交流存内计算实操上板体验 存内计算 ——突破物理极限的下一代算力技术 直接…

kubernetes存储入门(kubernetes)

实验环境依旧是三个节点拉取镜像&#xff0c;然后在master节点拉取资源清单&#xff1a; 然后同步会话&#xff0c;导入镜像&#xff1b; 存储入门 ConfigMap volume卷--》volumemount&#xff08;挂载卷&#xff09; Glusterfs NFS ISCSI HostPath ConfigMap Secret E…