react-问卷星项目(4)

news2024/11/21 2:38:18

项目实战

使用CSS

尽量不要使用内联CSS

  • 内联style代码多,性能差,扩展性差
  • 外链css文件可复用代码,可单独缓存文件

元素内联style

  • 和HTMl元素的style相似
  • 必须用JS写法,不能是字符串,里面必须是对象
<span style={{ color: "green" }}>已发布</span>
  • 驼峰写法

使用css文件

  • 引入css文件
  • JSX中使用className
 <div key={id} className="list-item">
  let itemClassName = "list-item";
  if (isPublished) itemClassName += " published";
  <div key={id} className={itemClassName}>

  • 可使用clsx或classnames做条件判断,两个功能相近,都是判断class条件的集合,比如当判断的条件多了,使用上面的if无法满足的时候就需要借用到工具。在这个项目中用classnames做例子,通过下列步骤使用
  • classnames仓库地址

下载指令

npm install classnames

import classnames from "classnames";

const itemClassName = classnames("list-item", { published: isPublished });
  // 上下两种含义一致,只是不同的写法
  const itemClassName = classnames({
    "list-item": true,
    published: isPublished,
  });

CSS Module

普通CSS的问题,React使用组件化开发,多个组件就需要多个CSS文件,多个CSS文件很容易造成className重复。在没有相应的工具前使用的是BEM,一种软性规范。主观性过强而不推荐。以下是CSS module的特点

  • 每个CSS文件都当作单独的模块,命令xxx.module.css
  • 为每个className增加后缀名,不重复
  • Create- React-App原生支持CSS Module

将文件名更改为xxx.module.css的格式,样式的格式不变

// QuestionCard.module.css 文件中
.list-item{
  border: 1px solid black;
  padding: 10px;
  margin-bottom: 16px;
}
.published{
  border: 1px solid greenyellow;
}

引入和使用,这一部分和原来的差别比较大

// import classnames from "classnames";
// 上面是原来的,下面是module的引入
import styles from "./QuestionCard.module.css";

// 使用格式,其中list-item因为有-符号,如果直接styles.list-item会报错,下面这个js写法就可以
 <div key={id} className={styles["list-item"]}>

Sass

CSS语法比较原始,不能嵌套。现代开发一般使用less sass等预处理语言。CRA原生支持Sass Module,后缀直接改为.scss即可

下载指令

npm install sass --save

接下来将想要使用的文件格式改为xxx.scss,记得后缀为scss。

import styles from "./QuestionCard.module.scss";

const itemClassName = classnames({
    [styles["list-item"]]: true,
    [styles["published"]]: isPublished,
  });

<div key={id} className={itemClassName}>

其中对于itemClassName的中括号的解释如下,在这段代码中,中括号([])用于在JavaScript对象字面量中动态地设置属性名。这种语法是ES6)中引入的计算属性名的一个特性,其键为变量y而不是固定字符比如a时,这个写法实际上是将这个变量的引用值传递进去

CSS-in-JS

  • 一种解决方案(而非工具名称),有好几个工具
  • 在JS中写CSS,带来极大的灵活性
  • 它和内联style完全不一样,也不会有内联style的问题和className的问题(会自行生成class)
Style-components

官网  可能是外网的链接,打开的时候速度有点慢

下载指令

npm install styled-components

引入代码如下,视频中老师的引入爆红线,需要额外下载东西,我这边没有,不过也顺便下载了。下面这个组件可以测试引入是否成功

下载指令

npm i --save-dev @types/styled-components

import React, { FC } from "react";
import styled, { css } from "styled-components";

const Button = styled.button<{ $primary?: boolean }>`
  background: transparent;
  border-radius: 3px;
  border: 2px solid #bf4f74;
  color: "#BF4F74";
  margin: 0 1em;
  padding: 0.25em 1em;

  ${(props) =>
    props.$primary &&
    css`
      background: blue;
      color: white;
    `};
`;

const Container = styled.div`
  text-align: center;
`;

const Demo: FC = () => {
  return (
    <div>
      <p>styled-components demo</p>
      <Container>
        <Button>normal button</Button>
        <Button $primary>primary 按钮</Button>
      </Container>
    </div>
  );
};
export default Demo;

大概解释一下上述代码中的逻辑,其中styled可以理解为一个类,而styled.button和styled.div小数点后的两个属性 都可以理解为方法,包括css后面加字符串,css也是个函数,反引号可以理解为传参如下图所示,多一层括号显得麻烦,所以不用括号的形式

styled-jsx

仓库地址

项目中不使用这个,因为ts环境中对标签的属性比较敏感,而这个工具插入了一些非标准的属性,导致需要额外扩展比较多的功能,用于js没问题,可以选择性的使用。

emotion

官网地址

使用起来的形式和前面的components比较类似,但是同样有个问题,就是这个工具在标签中添加了css属性,在ts中这么设置会报错,所以ts环境中同样不进行使用.

重构列表页,增加css样式

选择CSS-Module

  • 简单易用,学习成本较低
  • 性能更好,使用CSS-in-JS会增加编译时间
  • 不需要灵活变换样式

新建React项目,具体过程参考这一章,原来有很多个Demo的也进行保留,两个都会讲。以下几个文件直接复制粘贴可以用

App.tsx

import React from "react";
import logo from "./logo.svg";
import "./App.css";
import List from "./pages/list";

function App() {
  return (
    <div>
      <h1>问卷F1</h1>
      <List />
    </div>
  );
}

export default App;

list.tsx

import React, { FC, useState } from "react";
import QuestionCard from "../components/QuestionCard";
import styled from "./list.module.scss";

const rawQuestionList = [
  {
    _id: "q1",
    title: "问卷1",
    isPublished: true,
    isStar: false,
    answerCount: 5,
    createAt: "3月10日 13:23",
  },
  {
    _id: "q2",
    title: "问卷2",
    isPublished: false,
    isStar: true,
    answerCount: 15,
    createAt: "3月22日 13:23",
  },
  {
    _id: "q3",
    title: "问卷3",
    isPublished: true,
    isStar: true,
    answerCount: 100,
    createAt: "4月10日 13:23",
  },
  {
    _id: "q4",
    title: "问卷4",
    isPublished: false,
    isStar: false,
    answerCount: 98,
    createAt: "3月23日 13:23",
  },
];

const List: FC = () => {
  const [questionList, setQuestionList] = useState(rawQuestionList);
  return (
    <>
      <div className={styled.header}>
        <div className={styled.left}>
          <h3>我的问卷</h3>
        </div>
        <div className={styled.right}>搜索</div>
      </div>
      <div className={styled.content}>
        {questionList.map((q) => {
          const { _id } = q;
          return <QuestionCard key={_id} {...q} />;
        })}
      </div>
      <div className={styled.footer}>footer</div>
    </>
  );
};

export default List;

list.module.scss

.header{
  display: flex;
  .left{
    flex: 1;
  }
  .right{
    flex: 1;
    text-align: right;
  }
}

.content{
  margin-bottom: 20px;
}

.footer{
  text-align: center;
}

body{
  background-color: #f1f1f1;
}

QuestionCard.module,scss

.container{
  margin-bottom: 20px;
  padding: 12px;
  border-radius: 3px;
  background-color: white;

  &:hover{
    box-shadow: 0 4px 10px lightgray;
  }
}

.title{
  display: flex;
  .left{
    flex: 1;
  }
  .right{
    flex: 1;
    text-align: right;
  }
}

.button-container{
  display: flex;
  .left{
    flex: 1;
  }
  .right{
    flex: 1;
    text-align: right;
    button{
      color: #999;
    }
  }
}

QuestionCard.tsx

import React, { FC, useEffect } from "react";
// import "./QuestionCard.css";
import styled from "./QuestionCard.module.scss";
import classnames from "classnames";
type PropsType = {
  _id: string;
  title: string;
  isPublished: boolean;
  isStar: boolean;
  answerCount: number;
  createAt: string;
  // 问号是可写可不写,跟flutter语法相似
  deletQuestion?: (id: string) => void;
  pubQuestion?: (id: string) => void;
};

const QuestionCard: FC<PropsType> = (props: PropsType) => {
  const { _id, title, createAt, answerCount, isPublished } = props;

  return (
    <div className={styled.container}>
      <div className={styled.title}>
        <div className={styled.left}>
          <a href="#">{title}</a>
        </div>
        <div className={styled.right}>
          {isPublished ? (
            <span style={{ color: "green" }}>已发布</span>
          ) : (
            <span>未发布</span>
          )}
          &nbsp;
          <span>答卷:{answerCount}</span>
          &nbsp;
          <span>{createAt}</span>
        </div>
      </div>
      <div className={styled["button-container"]}>
        <div className={styled.left}>
          <button>编辑问卷</button>
          <button>数据统计</button>
        </div>
        <div className={styled.right}>
          <button>标星</button>
          <button>复制</button>
          <button>删除</button>
        </div>
      </div>
    </div>
  );
};

export default QuestionCard;

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

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

相关文章

# VirtualBox中安装的CentOS 6.5网络设置为NAT模式时,怎么使用SecureCRT连接CentOS6.5系统?

VirtualBox中安装的CentOS 6.5网络设置为NAT模式时&#xff0c;怎么使用SecureCRT连接CentOS6.5系统&#xff1f; 一、查询 【VirtualBox Host-Only Network】虚拟网卡的网络配置 IP。 1、按键盘上WIN R 组合键&#xff0c;打开【运行】&#xff0c;输入【 ncpa.cpl 】&…

C0012.Clion改用VS编译器开发Qt界面

1.VS编译器添加 2.配置MSVC2019环境变量 3.各种问题报错与解决 问题描述 warning C4819&#xff1a;该文件包含不能在当前代码页(936)中表示的字符。解决办法 在CMakeLists.txt中添加如下代码 # 如下代码只在使用VS编译器时需要&#xff0c;使用mingw32编译器时需要注释掉 #…

利用Numpy实现全连接神经网络实验分析

一、实验要求 用 python 的 numpy 模块实现全连接神经网络。网络结构为一个输入层、一个隐藏层、一个输出层。隐藏层的激活函数为 Relu 函数&#xff0c;输出层的激活函数为 softmax 函数&#xff0c;损失函数为交叉熵。 二、实验目的 学会构建一个简单的全连接神经网络模型学…

鸿蒙网络管理模块01——HTTP与WebSocket请求数据

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、概述 鸿蒙的网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1…

影刀RPA实战:网页爬虫之电影数据

1.实战目标 电影自媒体是指个人或团队通过互联网平台&#xff0c;如微博、微信公众号、抖音、B站等&#xff0c;发布与电影相关的内容&#xff0c;包括但不限于电影评论、推荐、幕后制作揭秘、明星访谈等。这些内容旨在吸引电影爱好者&#xff0c;并与之互动&#xff0c;构建起…

十六字心传

中国文化传统中著名的“十六字心传”&#xff1a;“人心惟危&#xff0c;道心惟微&#xff1b;惟精惟一&#xff0c;允执厥中。 ”语出于《虞书大禹谟》。 人心与道心&#xff1a;人的人欲与天理的区别&#xff1b;所谓“人心惟危”&#xff0c;即是说人们的那种物欲情欲&…

【FPGA开发】Xilinx FPGA差分输入时钟的使用方法

正文 以前在使用ZYNQ的领航者ZYNQ7020进行FPGA学习时&#xff0c;它们使用的单端50M的输入时钟&#xff0c;在verlog代码编写上比较简单&#xff0c;而现在使用Alinx的AXU3EG开发板时&#xff0c;发现它使用的是200M的差分输入时钟&#xff0c;哪这个时候&#xff0c;输入时钟要…

pyecharts-快速入门

pyecharts文档&#xff1a;渲染图表 - pyecharts - A Python Echarts Plotting Library built with love. pyecharts-gallery文档&#xff1a;中文简介 - Document (pyecharts.org) 一、快速入门案例 from pyecharts.charts import Barbar Bar() bar.add_xaxis(["衬衫…

7-3 集合的运算-并、交、对称差

顺序表&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int n;cin>>n;int *pnew int[n];for(int i0;i<n;i)cin>>p[i];int m;cin>>m;int *qnew int [m];for(int j0;j<m;j)cin>>q[j];int *bingnew int[nm];int *jia…

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…

Elasticsearch基础_5.ES聚合功能

文章目录 一、数据聚合1.1、桶聚合1.1.1、单维度桶聚合1.1.2、聚合结果排序1.1.3、限定聚合范围 本文只记录ES聚合基本用法&#xff0c;后续有更复杂的需求可以查看相关书籍&#xff0c;如《Elasticsearch搜索引擎构建入门与实战》 一、数据聚合 聚合可以让我们极其方便的实现…

进程和线程之间的通用方式

进程之间的通信方式有哪些 进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指不同进程之间传递信息和数据的机制。由于进程之间的内存空间是相互独立的&#xff0c;因此必须使用特定的通信方式来实现数据共享。 以下是常见的进程间通信方式&#xff1…

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…

【韩顺平Java笔记】第6章:数组、排序和查找

文章目录 153. 回顾上节课内容154. 听懂和会做155. 数组的必要性156. 数组快速入门157. 数组使用1158. 数组使用2160. 数组使用3161. 数组注意事项161. 数组练习1162. 数组练习2163. 数组赋值机制1164. 数组赋值机制2165. 数组拷贝166. 数组翻转1168. 169. 数组扩容1,2170. 数组…

解决银河麒麟服务器操作系统中`/etc/bashrc`环境变量不生效的问题

解决银河麒麟服务器操作系统中/etc/bashrc环境变量不生效的问题 1、问题描述2、问题原因3、解决方法 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 在银河麒麟服务器操作系统中&#xff0c;有时你可能会遇到在/etc/bashrc文件中配置的环境…

VMware 设置静态IP

环境 os: centos 7vmware: 16.2.0 build-18760230 设置静态IP 不知道桥接模式和nat模式抽什么疯&#xff0c;忽然用不了了&#xff0c;虚拟机开机之后&#xff0c;本地ssh连接不上&#xff0c;ping 了一下&#xff0c;本机ping不通虚拟机。干脆参考网上的方法&#xff0c;直…

【网络安全 | Java代码审计】某Blog系统

未经许可,不得转载。 文章目录 公告处XSS评论处XSS添加友链处XSS文件上传处XSS公告处XSS 编辑公告处后端代码: 跟进updateNotice()方法: 继续跟进: 公告内容直接插入数据库,看看前端从数据库获取数据时有没有对数据做处理: noticeService 是一个服务层组件,负责业务逻辑…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL74

异步复位同步释放 描述 题目描述&#xff1a; 请使用异步复位同步释放来将输入数据a存储到寄存器中&#xff0c;并画图说明异步复位同步释放的机制原理 信号示意图&#xff1a; clk为时钟 rst_n为低电平复位 d信号输入 dout信号输出 波形示意图&#xff1a; 输入描…

在线翻译界的4大宝藏,一站式解决语言难题!

现在全球化越来越厉害&#xff0c;语言根本就不是啥沟通的阻碍了。不管是搞学术研究、商务交流&#xff0c;还是平常学习&#xff0c;翻译工具都成了咱少不了的帮手。今天呢&#xff0c;我给大家推荐四款在 2024 年特别受推崇的邮件翻译神器&#xff0c;像百度在线翻译啥的。这…

Suricata:开源网络分析和威胁检测

Suricata 是一款高性能、开源网络分析和威胁检测软件&#xff0c;被大多数私人和公共组织使用&#xff0c;并被主要供应商嵌入以保护他们的资产。 Suricata 功能 Suricata 提供全面的网络安全监控 (NSM) 功能&#xff0c;包括记录 HTTP 请求、捕获和存储 TLS 证书以及从网络流…