学习记录-Ajax-图书列表渲染

devtools/2025/4/1 5:35:37/

目录

  • 图书列表渲染功能描述
  • 图书列表渲染实现步骤
      • 1.准备工作
      • 2.数据渲染
      • 3.数据添加
      • 4.数据删除
      • 5.数据编辑
  • 完整实例代码

图书列表渲染功能描述

  1. 页面刷新时,列表自动渲染图书列表数据
  2. 已渲染的图书列表数据可以进行编辑和删除功能
  3. 点击添加按钮,可以添加图书信息,并将其渲染到页面上

图书列表渲染实现步骤

1.准备工作

了解axios函数的基本使用
引入

	<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.0/axios.min.js"></script>

使用

	axios({url:'请求网址',method:'请求方式',		//默认为getparams:{}				//get请求参数data:{}					//post请求参数})

了解bootstrap表单和formserialize的基本使用
引入

	<script src="./lib/form-serialize.js"></script>				//本地form-serialize引入<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/js/bootstrap.min.js">

使用

	const {结构的变量名称}=form-serialize('表单名',{hash:true,empty:true})			//hash为true将数据转换为哈希值,推荐使用。empty为true可以接受空值

准备合适的接口
自行准备

2.数据渲染

先从后台请求数据,将请求的数据映射到对应列表的位置上

    const list = document.querySelector('.list')			//渲染位置function addData() {						//封装渲染函数,要复用axios({url: 'http://hmajax.itheima.net/api/books',params: {					//保证数据请求格式正确creator: 'Tom'}}).then(res => {const arr = res.data.dataconst str = arr.map(item => {					//使用map映射return `<tr><td>${item.id}</td><td>${item.bookname}</td><td>${item.author}</td><td>${item.publisher}</td><td><span class="del">删除</span><span class="edit">编辑</span></td></tr>`})document.querySelector('.list').innerHTML = str					//将所得数据写入到指定位置})}addData()

实现效果
在这里插入图片描述

3.数据添加

给添加按钮绑定点击事件,当点击时,打开添加弹窗,自动收集弹窗中表单的数据,将其发送到服务器中,关闭添加弹窗,再渲染一遍数据

	const plusBtn = document.querySelector('.plus-btn')// 添加弹窗const addModal = document.querySelector('.add-modal')const aModal = new bootstrap.Modal(addModal)const addForm = document.querySelector('.add-form')plusBtn.addEventListener('click', () => {aModal.show()// 保存添加const addBtn = document.querySelector('.add-btn')addBtn.addEventListener('click', () => {const { bookname, author, publisher } = serialize(addForm, { hash: true, empty: true })const data = {bookname,author,publisher,creator: 'Tom'}axios({url: 'http://hmajax.itheima.net/api/books',method: 'post',data}).then(res => {aModal.hide()addForm.reset()					//添加结束后重置表单addData()})})})

实现效果
在这里插入图片描述

4.数据删除

利用事件委托给图书列表添加点击事件,当点击到删除按钮时,利用元素节点找到该列表的id值,拼接到url网址上

list.addEventListener('click', (e) => {						//使用事件委托绑定点击事件if (e.target.classList.contains('del')) {const id = e.target.parentNode.parentNode.children[0].innerHTMLaxios({url: `http://hmajax.itheima.net/api/books/${id}`,method: 'delete'}).then(res => {addData()})}...}

实现效果
在这里插入图片描述

5.数据编辑

利用事件委托,当点击到编辑按钮时,打开编辑弹窗,收集渲染列表的数据,并自动收集弹窗中表单的数据,将其发送到服务器中,关闭编辑弹窗,再渲染一遍数据

	  if (e.target.classList.contains('edit')) {const id = e.target.parentNode.parentNode.children[0].innerHTMLconst children = e.target.parentNode.parentNode.childrenconst bookname = children[1].innerHTML				//遍历列表,保证编辑框打开后存在数据const author = children[2].innerHTMLconst publisher = children[3].innerHTMLeModal.show()editForm.querySelector('input[name="bookname"]').value = booknameeditForm.querySelector('input[name="author"]').value = authoreditForm.querySelector('input[name="publisher"]').value = publishereditBtn.addEventListener('click', () => {const { bookname, author, publisher } = serialize(editForm, { hash: true, empty: true })const data = {bookname,author,publisher,creator: 'Tom'}axios({url: `http://hmajax.itheima.net/api/books/${id}`,method: 'put',data}).then(res => {eModal.hide()addData()editForm.reset()					//编辑结束后重置表单})})}

实现效果
在这里插入图片描述

完整实例代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>案例-图书管理</title><!-- 字体图标 --><link rel="stylesheet" href="https://at.alicdn.com/t/c/font_3736758_vxpb728fcyh.css"><!-- 引入bootstrap.css --><link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/css/bootstrap.min.css" rel="stylesheet"><!-- 核心样式 --><link rel="stylesheet" href="./css/index.css">
</head><body><!-- 主体区域 --><div class="container"><!-- 头部标题和添加按钮 --><div class="top"><h3>图书管理</h3><button type="button" class="btn btn-primary plus-btn" data-bs-toggle="modal" data-bs-target=".add-modal"> + 添加</button></div><!-- 数据列表 --><table class="table"><thead class="table-light"><tr><th style="width: 150px;">序号</th><th>书名</th><th>作者</th><th>出版社</th><th style="width: 180px;">操作</th></tr></thead><tbody class="list"></tbody></table></div><!-- 新增-弹出框 --><div class="modal fade add-modal"><!-- 中间白色区域 --><div class="modal-dialog"><div class="modal-content"><div class="modal-header top"><span>添加图书</span><button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button></div><div class="modal-body form-wrap"><!-- 新增表单 --><form class="add-form"><div class="mb-3"><label for="bookname" class="form-label">书名</label><input type="text" class="form-control bookname" placeholder="请输入书籍名称" name="bookname"></div><div class="mb-3"><label for="author" class="form-label">作者</label><input type="text" class="form-control author" placeholder="请输入作者名称" name="author"></div><div class="mb-3"><label for="publisher" class="form-label">出版社</label><input type="text" class="form-control publisher" placeholder="请输入出版社名称" name="publisher"></div></form></div><div class="modal-footer btn-group"><button type="button" class="btn btn-primary" data-bs-dismiss="modal"> 取消 </button><button type="button" class="btn btn-primary add-btn"> 保存 </button></div></div></div></div><!-- 编辑-弹出框 --><div class="modal fade edit-modal"><!-- 中间白色区域 --><div class="modal-dialog"><div class="modal-content"><div class="modal-header top"><span>编辑图书</span><button type="button" class="btn-close" aria-label="Close" data-bs-dismiss="modal"></button></div><div class="modal-body form-wrap"><!-- 编辑表单 --><form class="edit-form"><input type="hidden" class="id" name="id"><div class="mb-3"><label for="bookname" class="form-label">书名</label><input type="text" class="form-control bookname" placeholder="请输入书籍名称" name="bookname"></div><div class="mb-3"><label for="author" class="form-label">作者</label><input type="text" class="form-control author" placeholder="请输入作者名称" name="author"></div><div class="mb-3"><label for="publisher" class="form-label">出版社</label><input type="text" class="form-control publisher" placeholder="请输入出版社名称" name="publisher"></div></form></div><div class="modal-footer btn-group"><button type="button" class="btn btn-primary" data-bs-dismiss="modal"> 取消 </button><button type="button" class="btn btn-primary edit-btn"> 修改 </button></div></div></div></div><script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.0/axios.min.js"></script><script src="./lib/form-serialize.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/js/bootstrap.min.js"></script><!-- 核心逻辑 --><script>// 数据渲染
const list = document.querySelector('.list')
function addData() {axios({url: 'http://hmajax.itheima.net/api/books',params: {creator: 'Tom'}}).then(res => {const arr = res.data.dataconst str = arr.map(item => {return `<tr><td>${item.id}</td><td>${item.bookname}</td><td>${item.author}</td><td>${item.publisher}</td><td><span class="del">删除</span><span class="edit">编辑</span></td></tr>`})document.querySelector('.list').innerHTML = str})
}
addData()
// 数据添加
// 添加按钮
const plusBtn = document.querySelector('.plus-btn')
// 添加弹窗
const addModal = document.querySelector('.add-modal')
const aModal = new bootstrap.Modal(addModal)
const addForm = document.querySelector('.add-form')
plusBtn.addEventListener('click', () => {aModal.show()// 保存添加const addBtn = document.querySelector('.add-btn')addBtn.addEventListener('click', () => {const { bookname, author, publisher } = serialize(addForm, { hash: true, empty: true })const data = {bookname,author,publisher,creator: 'Tom'}axios({url: 'http://hmajax.itheima.net/api/books',method: 'post',data}).then(res => {aModal.hide()addForm.reset()addData()})})
})
// 删除数据
const editModal = document.querySelector('.edit-modal')
const eModal = new bootstrap.Modal(editModal)
const editBtn = document.querySelector('.edit-btn')
const editForm = document.querySelector('.edit-form')
list.addEventListener('click', (e) => {if (e.target.classList.contains('del')) {const id = e.target.parentNode.parentNode.children[0].innerHTMLaxios({url: `http://hmajax.itheima.net/api/books/${id}`,method: 'delete'}).then(res => {addData()})}//编辑数据if (e.target.classList.contains('edit')) {const id = e.target.parentNode.parentNode.children[0].innerHTMLconst children = e.target.parentNode.parentNode.childrenconsole.log(children)const bookname = children[1].innerHTMLconst author = children[2].innerHTMLconst publisher = children[3].innerHTMLeModal.show()editForm.querySelector('input[name="bookname"]').value = booknameeditForm.querySelector('input[name="author"]').value = authoreditForm.querySelector('input[name="publisher"]').value = publishereditBtn.addEventListener('click', () => {const { bookname, author, publisher } = serialize(editForm, { hash: true, empty: true })const data = {bookname,author,publisher,creator: 'Tom'}axios({url: `http://hmajax.itheima.net/api/books/${id}`,method: 'put',data}).then(res => {eModal.hide()addData()editForm.reset()})})}
})</script>
</body></html>

http://www.ppmy.cn/devtools/171207.html

相关文章

什么是数据密集型,什么是计算密集型,以及这两者有什么关联和区别

数据密集型和计算密集型是两种不同的计算任务类型&#xff0c;它们在资源需求、应用场景和优化方向上存在显著差异&#xff0c;但也存在一定的关联。 1. 数据密集型&#xff08;Data-Intensive&#xff09; 定义&#xff1a; 数据密集型任务的核心挑战是管理和处理大规模数据&…

Java基础关键_027_IO流(五)

目 录 一、装饰器设计模式 1.说明 2.实例 3.实例类图 二、压缩流 1.GZipOutputStream 2.GZipInputStream 三、字节数组流 1.说明 2.实例 3.对象流装饰字节数组 四、对象克隆 1.clone() 的克隆 2.序列化和反序列化的克隆 3.字节数组流的深克隆 一、装饰器设计模式…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

嵌入式硬件篇---蓝牙模块

文章目录 前言一、核心技术原理蓝牙工作流程设备发现阶段配对连接阶段数据传输阶段 二、协议栈架构&#xff08;以BLE为例&#xff09;1.物理层2.链路层3.HCI层4.GATT 三、典型应用场景扩展1. 室内定位系统&#xff08;蓝牙5.1&#xff09;2. 运动健康监测3. 工业控制 四、ESP3…

VBA-Excel

VBA 一、数据类型与变量 常用数据类型&#xff1a; Byte&#xff1a;字节型&#xff0c;0~255。Integer&#xff1a;整数型&#xff0c;用于存储整数值&#xff0c;范围 -32768 到 32767。Long&#xff1a;长整型&#xff0c;可存储更大范围的整数&#xff0c;范围 -214748364…

军事级加密通信系统——基于QML的战术地图加密传输

目录 基于QML的战术地图加密传输一、引言二、理论背景与安全需求2.1 战术地图数据的敏感性与安全性要求2.2 QML与PyQt5集成优势2.3 加密算法与数据传输模型三、系统架构与数据流图四、QML前端界面设计与交互功能4.1 QML界面优势与设计理念4.2 功能要求4.3 QML文件示例五、加密传…

mysql 磐维(opengauss)tidb误删数据之高级恢复

Mysql参考&#xff1a; Mysql 8.0 XtraBackupMysqlbinlog 完全恢复 - 墨天轮 Mysql 8.0 XtraBackupMysqlbinlog 完全恢复[TOC]# 一、安装mysql 8.0.19## 1.1https://www.modb.pro/db/509223MySQL 的全量备份、增量备份与 Binlog 时间点恢复_mysqlbinlog自动备份吗-CSDN博客文章…

【python】11. 输入输出

11. 输入输出 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用 sys.stdout 引用。 如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。 如果你希望将输出…