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

图书列表渲染功能描述

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

图书列表渲染实现步骤

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值