图书列表渲染功能描述
- 页面刷新时,列表自动渲染图书列表数据
- 已渲染的图书列表数据可以进行编辑和删除功能
- 点击添加按钮,可以添加图书信息,并将其渲染到页面上
图书列表渲染实现步骤
1.准备工作
了解axios函数的基本使用
引入
<script src="https://cdn.bootcdn.net/ajax/libs/axios/1.2.0/axios.min.js"></script>
使用
axios({
url:'请求网址',
method:'请求方式', //默认为get
params:{} //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.data
const 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].innerHTML
axios({
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].innerHTML
const children = e.target.parentNode.parentNode.children
const bookname = children[1].innerHTML //遍历列表,保证编辑框打开后存在数据
const author = children[2].innerHTML
const publisher = children[3].innerHTML
eModal.show()
editForm.querySelector('input[name="bookname"]').value = bookname
editForm.querySelector('input[name="author"]').value = author
editForm.querySelector('input[name="publisher"]').value = publisher
editBtn.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.data
const 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].innerHTML
axios({
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].innerHTML
const children = e.target.parentNode.parentNode.children
console.log(children)
const bookname = children[1].innerHTML
const author = children[2].innerHTML
const publisher = children[3].innerHTML
eModal.show()
editForm.querySelector('input[name="bookname"]').value = bookname
editForm.querySelector('input[name="author"]').value = author
editForm.querySelector('input[name="publisher"]').value = publisher
editBtn.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>
2442

被折叠的 条评论
为什么被折叠?



