【React】react 初学增删改查购物车案例

news2024/11/27 18:24:29

界面

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>react-购物车案例</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.24.4/babel.min.js"></script>
    <style>
      #root {
        height: 100vh;
        display: flex;
        align-items: center;
        justify-content: center;
      }
      table {
        border-collapse: collapse;
        text-align: center;
      }

      thead {
        background-color: #f2f2f2;
      }

      td,
      th {
        padding: 10px 16px;
        border: 1px solid #aaa;
      }
      .search {
        margin-bottom: 10px;
      }
      .count {
        display: inline-block;
        width: 50px;
      }
    </style>
  </head>
  <body>
    <div id="root"></div>

    <script type="text/babel">
      const data = [
        {
          id: 1,
          name: '《算法导论》',
          date: '2006-9',
          price: 85.0,
          count: 1,
        },
        {
          id: 2,
          name: '《UNIX编程艺术》',
          date: '2006-2',
          price: 59.0,
          count: 1,
        },
        {
          id: 3,
          name: '《编程珠玑》',
          date: '2008-10',
          price: 39.0,
          count: 1,
        },
        {
          id: 4,
          name: '《代码大全》',
          date: '2006-3',
          price: 128.0,
          count: 1,
        },
      ];
      class App extends React.Component {
        constructor() {
          super();
          this.state = {
            tableHead: [
              '编号',
              '书籍名称',
              '出版日期',
              '价格',
              '购买数量',
              '操作',
            ],
            booksList: data,
            searchName: '',
          };
        }

        delBook(index) {
          const booksList = [...this.state.booksList];
          booksList.splice(index, 1);
          this.setState({
            booksList,
          });
        }
        changeBookCount(index, step) {
          const booksList = [...this.state.booksList];
          booksList[index].count += step;
          this.setState({
            booksList,
          });
        }
        getTotalPrice() {
          const totalPrice = this.state.booksList.reduce((pre, item) => {
            return pre + item.price * item.count;
          }, 0);
          return totalPrice;
        }

        searchBook(name) {
          if (name === '') {
            alert('请输入书籍名称');
            return;
          }

          const booksList = [...this.state.booksList];
          const searchList = booksList.filter((item) => {
            return item.name.includes(name);
          });
          this.setState({
            booksList: searchList,
          });
        }
        clearSearch() {
          this.setState({
            searchName: '',
            booksList: data,
          });
        }

        addBook() {
          const name = prompt('请输入新增的书籍名字');
          const book = {
            id: this.state.booksList.length + 1,
            name: name,
            date: new Date().toLocaleDateString(),
            price: Math.floor(Math.random() * 100),
            count: 1,
          };

          data.push(book);
          this.setState({
            booksList: data,
          });
        }

        render() {
          const { tableHead, booksList, searchName } = this.state;
          return (
            <div>
              <div className="search">
                <span>书籍搜索:</span>
                <input
                  type="text"
                  placeholder="请输入书籍名称"
                  value={searchName}
                  onChange={(event) => {
                    this.setState({
                      searchName: event.target.value,
                    });
                  }}
                  onKeyUp={(event) => {
                    if (event.keyCode === 13) {
                      this.searchBook(searchName);
                    }
                  }}
                />
                <button onClick={() => this.searchBook(searchName)}>
                  搜索
                </button>
                <button onClick={() => this.clearSearch()}>清空</button>
                <button onClick={() => this.addBook()}>新增书籍</button>
              </div>
              <table>
                <thead>
                  <tr>
                    {tableHead.map((item, index) => {
                      return <th key={index}>{item}</th>;
                    })}
                  </tr>
                </thead>
                <tbody>
                  {booksList.map((item, index) => {
                    return (
                      <tr>
                        <td>{item.id}</td>
                        <td>{item.name}</td>
                        <td>{item.date}</td>
                        <td>{item.price}</td>
                        <td>
                          <button
                            disabled={item.count <= 1}
                            onClick={() => this.changeBookCount(index, -1)}
                          >
                            -
                          </button>
                          <span className="count">{item.count}</span>
                          <button
                            onClick={() => this.changeBookCount(index, 1)}
                          >
                            +
                          </button>
                        </td>
                        <td>
                          <button onClick={() => this.delBook(index)}>
                            删除
                          </button>
                        </td>
                      </tr>
                    );
                  })}
                </tbody>
                {booksList.length === 0 && (
                  <h2>{searchName ? '没有找到相关书籍~' : '没有书籍了~'}</h2>
                )}
              </table>
              <h2>总价格:{this.getTotalPrice()}</h2>
            </div>
          );
        }
      }

      const root = ReactDOM.createRoot(document.getElementById('root'));
      root.render(<App />);
    </script>
  </body>
</html>


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

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

相关文章

华为OD机试 - 机器人搬砖 - 二分查找(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

centos 7.9 nginx本地化安装,把镜像改成阿里云

1.把centos7.9系统切换到阿里云的镜像源 1.1.先备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2.下载新的CentOS-Base.repo配置文件 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo特别…

css面试题--定位与浮动

1、为什么需要清除浮动&#xff1f; 在非IE浏览器下&#xff0c;容器不设高度且子元素浮动时&#xff0c;容器高度不能被内容撑开&#xff0c;内容会溢出到容器外面而影响布局。这种现象被称为浮动。 浮动的原理&#xff1a;浮动元素脱离文档流&#xff0c;不占用空间&#xff…

39-性能分析(下):APIServer性能测试和调优实战

在API上线之前&#xff0c;我们需要知道API的性能&#xff0c;以便知道API服务器所能承载的最大请求量、性能瓶颈&#xff0c;再根据业务对性能的要求&#xff0c;来对API进行性能调优或者扩缩容。通过这些&#xff0c;可以使API稳定地对外提供服务&#xff0c;并且让请求在合理…

java算法day49 | 动态规划part10 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) {//1、定义dp数组&#xff0c;表示第i天持股票的状态dp[i][0]表示持有股票dp[i][1]表示不持有股票int[][] dpnew int[prices.length][2];//3、初始化数组dp[0][1]0;dp[0][0]-prices[0];//4、遍历顺…

Linux--进程的概念(二)

目录 一、进程的优先级1.1 基本概念1.2 查看进程优先级1.3 PRI&NI1.4 如何更改进程的优先级1.4.1 用top命令更改进程的nice1.4.2 用renice命令更改进程的nice 1.5 其他概念 二、环境变量2.1 基本概念2.2 常见的环境变量2.3 查看环境变量2.3.1 测试PATH2.3.2 测试HOME2.3.3 …

Android14之智能指针的弱引用、强引用、弱指针、强指针用法区别及代码实例(二百零五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

LTC4054 充电指示灯转灯电路

由于这个芯片只有CHRG# 引脚&#xff0c;不像4056 那样两个引脚能分别接一个LED&#xff0c;要实现充电指示就必须自己整整外围电路。先说明一下&#xff0c;网上常见的这种接法&#xff1a; 一个LED 直连CHRG# 引脚&#xff0c;我试了是不行的&#xff0c;即使充满电&#xff…

【国际会议火热征稿】2024年应用经济学、管理科学与社会国际学术会议(ICAEMSS 2024)

会议简介 2024年应用经济学、管理科学与社会国际学术会议将聚焦应用经济学和管理科学的前沿问题&#xff0c;深入探讨社会变革中的经济管理与科学应用。参会者将分享最新研究成果&#xff0c;交流学术观点&#xff0c;共同探索经济、管理与社会的融合发展之路。本次会议旨在推…

Zotero + Markdown论文工作流

文章目录 关键步骤Zotero Better BibTeXObsidian Citekey Plugin & WrittingPandoc Export 关键步骤 在Zotero中&#xff0c;使用Better BibTex生成.bib文件&#xff0c;用于提取索引信息。由于后续需要使用pandoc将markdown转换为word或者LaTeX&#xff0c;所以Better Bi…

记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time

记Kubernetes&#xff08;k8s&#xff09;&#xff1a;访问 Prometheus UI界面:Warning: Error fetching server time 1、报错详情2、解决3、再次访问 PrometheusUI界面 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、报错详情 Warning:…

Linux启动过程、启动脚本目录介绍及检测思路分析

一、Linux系统启动过程 1、启动流程&#xff1a; Linux系统的启动过程可以分为5个阶段&#xff1a;内核的引导、运行init、系统初始化、建立终端、用户登录系统。 2、init程序的类型&#xff1a; 1&#xff09;SysV&#xff1a;init&#xff0c;CentOS 5之前&#xff0c;配置文…

socuretree远程分支没有同步问题

1、选择命令行模式 2、输入git remote update origin --prune 并回车 git remote update origin --prune 是 Git 命令&#xff0c;用于从远程仓库更新本地分支&#xff0c;并删除本地已经不存在于远程仓库的远程跟踪分支

ADP-2-20+ 信号调节 20MHz-2GHzRF功分器 合路器

ADP-2-20 是一款由Mini-Circuits公司出产的功分器&#xff08;power divider&#xff09;。这款功分器的工作温度规模为-40C至85C&#xff0c;贮存温度规模为-55C至100C。作为分路器&#xff0c;它的电源输入最高可达1W&#xff0c;内部功耗最大为0.125W。假如超越这些限制&…

【Cesium学习笔记】一、加载Cesium并更换天地图底图

【Cesium学习笔记】一、加载Cesium 一、加载Cesium二、用Viewer显示地球三、更换天地图底图 Ps:本教程所有代码于同一个工程中&#xff0c;运行npm run dev默认首页为App.vue&#xff0c;只需替换App.vue的内容即可切换不同页面。 一、加载Cesium 本项目使用nvm管理node版本&…

李沐23_LeNet——自学笔记

手写的数字识别 知名度最高的数据集&#xff1a;MNIST 1.训练数据&#xff1a;50000 2.测试数据&#xff1a;50000 3.图像大小&#xff1a;28✖28 4.10类 总结 1.LeNet是早期成功的神经网络 2.先使用卷积层来学习图片空间信息 3.使用全连接层来转换到类别空间 代码实现…

Al+医学,用这个中文多模态医学大模型帮你看胸片

随着人工智能技术的飞速发展&#xff0c;AI 在医学领域的应用已经成为现实。特别是在医学影像诊断方面&#xff0c;AI 大模型技术展现出了巨大的潜力和价值&#xff0c;但目前针对中文领域医学大多模态大模型还较少。 今天为大家介绍的这款 XrayGLM&#xff0c;就是由澳门理工…

HackTheBox-Machines--Soccer

文章目录 1 信息收集2 CVE-2021-45010 漏洞利用3 横向移动4 权限提升 Soccer 测试过程 1 信息收集 a.端口扫描&#xff1a;发现22、80、9091端口    b.目录扫描&#xff1a;http://soccer.htb/tiny/    c.子域爆破    d.信息泄漏 nmap -sC -sV 10.129.87.151端口扫描结…

【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

JVM—jps、jstat、jinfo、jmap、jstack的使用

JVM—jps、jstat、jinfo、jmap、jstack的使用 jps jps全称&#xff1a;Java Virtual Machine Process Status Tool 可以查看Java进程&#xff0c;相当于Linux下的ps命令&#xff0c;只不过它只列出Java进程。 jps:列出Jav程序ID和Main函数名称 jps -q:只输出进程ID jps -m …