React06-简单实战案例

news2025/3/9 22:01:19

一、计时器

1. 案例场景

计时器在很多网站中都有使用,以时分秒的格式展示当前时间,每秒刷新一次。

2. 案例展示

展示的时间将随着系统时间,每秒刷新一次。 

3. 案例代码

import { useState, useEffect } from 'react';

export default function Clock() {
  const [time, setTime] = useState(new Date());
  useEffect(() => {
    // 在组件加载时调用
    const timer = setInterval(() => setTime(new Date()), 1000);
    return () => clearInterval(timer); // 在组件卸载时调用
  }, []);
  return (
      <div>
        <h3>{time.toLocaleTimeString()}</h3>
      </div>
  );
}

4. 案例总结

(1) 使用 useState 设置状态,状态更新会触发页面更新;

(2) 使用 useEffect 模拟组件生命周期,在组件加载时开启计时器,在组件卸载时清除计时器。

二、tab 切换

1. 案例场景

实现一个 tab 页组件,可以点击 tab 标签切换展示的内容。

2. 案例展示

3. 案例代码

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';

// const data = [
//   {id: '1', title: '首页', content: '这是首页内容'},
//   {id: '2', title: '军事', content: '这是军事内容'},
//   {id: '3', title: '新闻', content: '这是新闻内容'},
//   {id: '4', title: '电影', content: '这是电影内容'}
// ];

export default function Tab(props) {
  const styles = {
    li: css`
      list-style-type: none;
      margin: 0;
      padding: 0;
      flex: 1;
      text-align: center;
      line-height: 40px;
      background-color: black;
      color: white;
      font-size: 24px;

      &.active {
        background-color: red;
      }
    `,
    ul: css`
      width: 640px;
      margin: 100px auto 0;
      padding: 0;
      border: 1px solid red;
      display: flex;
    `,
    content: css`
      width: 640px;
      height: 400px;
      background-color: #cccccc;
      margin: 0 auto;
    `
  };
  const [data] = useState(props.data);
  const [selectedIndex, setSelectedIndex] = useState(0);
  return (
      <div>
        <ul css={css`${styles.ul}`}>
          {data.map((item, index) => <li className={index === selectedIndex ? 'active' : ''} onClick={() => setSelectedIndex(index)} key={item.id} css={css`${styles.li}`}>{item.title}</li>)}
        </ul>
        <div css={css`${styles.content}`}>
          {props.data[selectedIndex].content}
        </div>
      </div>
  );
}

4. 案例总结

(1) 组件布局:tab 页组件由标签区域和内容区域组成,标签区域使用 ul 列表,内容区域使用一个 div 标签。

(2) 使用 emotion 为组件添加样式。

(3) 组件状态:tab 页需要切换标签而切换显示内容,而 tab 页的数据存储在一个对象数组中,切换标签的同时要切换展示元素的下标,这个下标要为一个 state。

(4) 激活标签的样式,使用 emotion 进行样式定义,动态切换类名。

三、Todolist

1. 案例场景

以列表形式展示一个 Todolist,支持新增和删除功能,选中的记录添加删除线。

2. 案例展示

 

3. 案例代码

/** @jsxRuntime classic */
/** @jsx jsx */
import {jsx, css} from '@emotion/react';
import {useState} from 'react';
import {useImmer} from 'use-immer';

const componentStyles = {
  button: css`
      width: 80px;
      height: 30px;
      color: red;
      background-color: transparent;
      border-radius: 5px;
      margin-left: 20px;
      outline: none;
  `
};

const ListItem = function ({list, setList}) {
  const styles = {
    ul: css`
      margin: 0 auto;
      border: 1px solid gray;
      border-radius: 10px;
      width: 300px;
      padding: 20px;
      li {
        list-style-type: none;
        margin: 10px;
        display: flex;
        justify-content: space-between;
        span {
          flex: 1;
          &.delete {
            text-decoration-line: line-through;
          }
        }
      }
    `
  };
  return (
      <ul css={css`${styles.ul}`}>
        {list.map((item, index) => <li key={item.id}>
          <div>
            <input type="checkbox" checked={item.status === 1} onChange={() => setList(l => {
              l[index].status = l[index].status === 1 ? 0 : 1;
              return l;
            })} />
            <span className={item.status === 1 ? 'delete' : ''}>{item.name}</span>
          </div>
          <button css={componentStyles.button} onClick={() => setList(l => {
            l.splice(index, 1);
            return l;
          })}>删除</button>
        </li>)}
      </ul>
  );
};

export default function Todolist() {
  const styles = {
    header: css`
      width: 350px;
      background-color: #cccccc;
      margin: 0 auto;
      text-align: center;
      line-height: 40px;
    `,
    footer: css`
      position: relative;
      margin: 0 auto;
      line-height: 30px;
      height: 80px;
      width: 350px;
      box-sizing: border-box;
      padding: 20px 10px 20px 10px;
      background-color: rgba(223, 224 ,224, .3);
      input {
        height: 24px;
        width: 220px;
        border-radius: 4px;
        outline: none;
        border: 1px solid silver;
      }
    `,
    button: css`
      width: 80px;
      height: 30px;
      color: red;
      background-color: transparent;
      border-radius: 5px;
      margin-left: 20px;
      outline: none;
    `
  };
  const [list, setList] = useImmer([
    { id: '0', name: '张三', status: 0 },
    { id: '1', name: '李四', status: 0 },
    { id: '2', name: '王五', status: 0 },
    { id: '3', name: '赵六', status: 0 }
  ]);
  const [inputVal, setInputVal] = useState('');
  return (
      <div>
        <header css={css`${styles.header}`}>React Todolist</header>
        <div css={css`${styles.footer}`}>
          <input type="text" placeholder="add todo" value={inputVal} onChange={(e) => setInputVal(e.target.value)} />
          <button css={css`${componentStyles.button}`} onClick={() => setList(l => {
            inputVal && l.push({ id: l.length + '', name: inputVal, status: 0 });
            return l;
          })}>添加</button>
        </div>
        <ListItem list={list} setList={setList} />
      </div>
  );
}

4. 案例总结

(1) 组件布局:Todolist 组件分为 head 部分、输入框部分和 content 部分。

(2) 复选框选中和取消选中:使用 useImmer 设置 todolist 数据的状态,点击复选框时改变对应元素的 status 值。

(3) 选中元素添加删除线:使用动态 className 通过当前元素的状态来决定文字是否添加删除线。

(4) 删除元素:通过要删除元素的下标,改变 list 数组的状态。

(5) 新增元素,直接向 list 数组中添加元素。

注意:改变 list 数组时,要使用 setList 来设置 list 的状态。

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

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

相关文章

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言&#xff0c;具有很多特性和优点&#xff0c;其中之一就是其对数…

查看服务器GPU使用情况,以及使用GPU的用户

查看服务器GPU使用情况&#xff0c;以及使用GPU的用户 1.查看gpu使用情况 nvidia-smi2.查看是谁在占用gpu ps -f -p PID例如 ps -f -p 1986875就可以看到是谁在用了

谷歌发布ALBERT V2和中文模型

2019年9月推出时&#xff0c;谷歌的ALBERT语言模型在GLUE、RACE和SQuAD 2.0等流行的自然语言理解&#xff08;NLU&#xff09;基准上取得了SOTA结果。谷歌现在发布了一个主要的V2 ALBERT更新和开源的中国ALBERT模型。 正如全名“A Lite BERT”所示&#xff0c;ALBERT是该公司B…

组件的状态

组件的状态 react hook出来之前&#xff0c;函数式组件是没有自己状态的。 ​ jsx 就和原生js编写差不多&#xff0c;所有就当作在定义类&#xff0c;在类方法中使用变量&#xff0c;就要通过this来调用。 ​ 主义要写在state中&#xff0c;数据驱动视图&#xff0c;我们想要修…

Vite 3.0 核心盘点与分析

自2021 年2月&#xff0c;Vite 2.0版本发布以来&#xff0c;Vite项目在的用户量方面发生了非常迅速的增长&#xff0c;很快达到了每周 100 万的npm下载量&#xff0c;成为npm下载量最高的几个项目之一。同时&#xff0c;Vite 的社区也越来越活跃&#xff0c;目前已经形成非常庞…

如何用手机实现三维可视化

三维可视化是一种强大的工具&#xff0c;可以将复杂的数据、概念或场景以直观、具体的形式展现出来。它将数据或模型转化成三维图像&#xff0c;使人们能够更清晰地理解和分析其中的关系和特征。三维可视化不仅可以用于科学研究和工程设计&#xff0c;还广泛应用于教育、娱乐和…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见&#xff0c;网址如下&#xff1a; slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

在线考试系统源码搭建:springboot+mybatis+mysql+vue

下载源码 在线考试 刷题小程序 题库答题小程序 : 适用机构场景&#xff1a;在线考试系统适用于企业考核、员工职评测、培训机构考证刷题等场景&#xff1b;用户端功能&#xff1a;顺序练习&#xff0c;真题模拟&#xff0c;我的错题&#xff0c;我的收藏、错题重练(答对自动移…

【Atcoder】 [ARC156C] Tree and LCS

题目链接 Luogu方向 Atcoder方向 题目解法 手玩几个小数据之后可以猜测最小的最大相似度一定为1 考虑构造&#xff1a;每次找到2个叶子&#xff0c;交换权值&#xff0c;然后删掉&#xff08;最后如果剩下一个点权值不变&#xff09; 证明&#xff1a; 首先可以证明最大的相…

【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录Docker镜像提交本地镜像发布到阿里云阿里云镜像下载到本地使用本地镜像发布到私有库 Docker镜像提交 docker commit提交容器副本使之成为一个新的镜像docker commit -m“提交的描述信息” -a…

2023年网络安全需把握十大趋势

过去的2022年&#xff0c;网络安全继续成为全社会的关注焦点。网络战在俄乌冲突中风头尽出&#xff1b;勒索攻击给企业造成的损失触目惊心&#xff1b;数据泄露事件愈发频繁、甚至威胁社会安全&#xff1b;供应链攻击无处不在……网络安全已经成为发展的先决条件。 2023年是贯…

【大模型】AutoDL 快速使用

网站&#xff1a;https://www.autodl.com/ BUY 性价比之选&#xff1a;NVIDIA RTX A5000 / 24GB PS&#xff1a;CUDA版本 -12.0 PS&#xff1a;Pytorch/2.0.0/3.8(ubuntu20.04)/11.8 Use Tips git clone 慢 学术资源加速 source /etc/network_turbo切换pip 阿里源

TCP文件传输功能

实现代码 tcp.h #ifndef _TCP_H_ #define _TCP_H_#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <strings.h> #include <…

链表的简单示意

链表的实质就是指针。存放下一个元素的地址。 typedef struct spy {char * name ;struct spy * next; }spy ,*p_spy;spy A {A,NULL}; spy B {B,NULL}; spy C {C,NULL};int main() {p_spy &A;A.next&B;//A是一个结构体变量&#xff0c;A.next是对这个结构体变量的引用。…

MySQL八股学习记录4事务的实现from小林coding

MySQL八股学习记录4事务的实现from小林coding 事务的概念与特性并行事务引发的问题脏读不可重复读幻读 MySQL的应对策略InnoDB引擎可重复读详解ReadView在MVCC中的工作方式两种隔离级别通过MVCC实现幻读被完全解决了吗 事务的概念与特性 概念:一个操作要么执行成功,要么回滚到…

Matplotlib subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数&#xff0c;它的使用方法和 subplot() 函数类似。其不同之处在于&#xff0c;subplots() 既创建了一个包含子图区域的画布&#xff0c;又创建了一个 figure 图形对象&#xff0c;而 subplot() 只是创建一个包含子图区域的画布…

面试题揭秘:Spring Boot 自动配置原理是什么?

大家好&#xff0c;我是你们的小米。在过去的几年里&#xff0c;Spring Boot已经成为了Java开发领域中最受欢迎的框架之一。它以其简化的开发方式和强大的功能而闻名于世。今天&#xff0c;我们来揭秘一个常见的面试题&#xff1a;Spring Boot自动配置原理是什么&#xff1f;让…

针对汽配企业的生产难点,提出MES管理系统解决方案

随着汽车产业的快速发展&#xff0c;汽配企业面临着越来越多的生产难点&#xff0c;如生产过程不透明、效率低下、质量控制困难等。为了应对这些挑战&#xff0c;引入MES生产管理系统成为了一种有效的解决方案。本文将探讨MES生产管理系统在汽配企业中的应用&#xff0c;以及它…

【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码

【江西省研究生数学建模竞赛】题目之一 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MA…

如何顺势而为,让ChatGPT为教育所用?

恐惧和回避无法阻挡科技的浪潮&#xff0c;教育与AI的深度融合时代已经到来&#xff0c;如何把AI当做工具&#xff0c;把其成为教育的机会而非威胁&#xff0c;是教育体系未来不得不得面对的新变化。 接受ChatGPT作为一种教学辅助工具&#xff0c;成为教师的朋友或者帮手&…