AJAX 2——Bootstrap弹框使用、图书管理案例、图片上传方法

AJAX 2------Bootstrap弹框使用、图书管理案例、图片上传方法

1.Bootstrap弹框使用-Modal

  • 通过自定义属性控制

    js 复制代码
    <button  data-bs-toggle="modal" data-bs-target="CSS选择器">点击该按钮显示弹框</button>
     <button data-bs-dismiss="modal" >Close关闭弹框</button>
  • 通过JS控制

    js 复制代码
     //  1. 创建弹框对象
      // 2. 调用弹框对象内置方法
      //   .show() 显示
      //   .hide() 隐藏
      const modalDom = document.querySelector('.name-box')
      const modal = new bootstrap.Modal(modalDom)
      document.querySelector('.edit-btn').addEventListener
          ('click', () => {
            document.querySelector('.username').value = '小小怪'
            modal.show()
        })
     document.querySelector('.save-btn').addEventListener
          ('click', () => {
            const username =  document.querySelector('.username').value
            console.log(username)
            modal.hide()
          })

2.案例:图书管理(增删查改)

  • :注意获取数据渲染列表的时候把图书序号获取过来加到删除编辑模块,是为了后续进行删除编辑可以获取该序号并传给服务器进行操作
js 复制代码
/**
 * 目标1:渲染图书列表
 *  1.1 获取数据
 *  1.2 渲染数据
 */
function getBookList() {
  axios({
    url: 'http://hmajax.itheima.net/api/books',
    params: {
      creator: '老张'
    }
  }).then(result => {
    console.log(result)
    const bookList = result.data.data
    console.log(bookList)
    const htmlStr = bookList.map((item, id) => {
      const { bookname, author, publisher } = item
      return `
      <tr>
          <td>${id + 1}</td>
          <td>${bookname}</td>
          <td>${author}</td>
          <td>${publisher}</td>
          <td data-id=${item.id}>
            <span class="del">删除</span>
            <span class="edit">编辑</span>
          </td>
        </tr>
      `
    }).join('')
    const list = document.querySelector('.list')
    list.innerHTML = htmlStr
  })
}
getBookList()
  • :注意新增完之后要先重置表单,下一次点击新增按钮后表单是空的
js 复制代码
// 目标2:新增图书
const creator = '老张'
const addModalDom = document.querySelector('.add-modal')
const addModal = new bootstrap.Modal(addModalDom)
document.querySelector('.add-btn').addEventListener
  ('click', () => {
    const addForm = document.querySelector('.add-form')
    const bookObj = serialize(addForm, { hash: true, empty: true })
    console.log(bookObj);
    axios({
      url: 'http://hmajax.itheima.net/api/books',
      method: 'post',
      data: {
        ...bookObj,
        creator
      }
    }).then(result => {
      console.log(result)
      getBookList()
      //重置表单
      addForm.reset()
      addModal.hide()
    })
  })
  • :注意使用的请求方法为删除数据,传递参数的方法为地址传参(由接口文档决定的)
js 复制代码
//3.删除列表项
document.querySelector('.list').addEventListener('click', function (e) {
  if (e.target.classList.contains('del')) {
    const delId = e.target.parentNode.dataset.id
    axios({
      url: `http://hmajax.itheima.net/api/books/${delId}`,
      method: 'DELETE',
    }).then(result => {
      console.log(result)
      getBookList()
    })
  }
})
  • :注意编辑的逻辑是:点击编辑按钮获取该图书的唯一序号发送给服务器------>服务器返回图书信息------>将图书信息赋给编辑图书页面的输入框并显示编辑框------>点击保存按钮将修改的信息包括该图书的id传递给服务器,请求方法为修改数据PUT------>渲染页面
js 复制代码
//4.编辑图书
const editModalDom = document.querySelector('.edit-modal')
const editModal = new bootstrap.Modal(editModalDom)
document.querySelector('.list').addEventListener('click', function (e) {
  if (e.target.classList.contains('edit')) {
    const editId = e.target.parentNode.dataset.id
    axios({
      url: `http://hmajax.itheima.net/api/books/${editId}`,
    }).then(result => {
      console.log(result.data.data)
      const bookObj = result.data.data
      //数据对象属性和标签类名一致  防止表单元素过多要一一赋值
      const keys = Object.keys(bookObj)
      keys.forEach(key => {
        document.querySelector(`.edit-form .${key}`).value = bookObj[key]
      })
    })
    editModal.show()
  }
  //4.1编辑 点击保存
})
document.querySelector('.edit-btn').addEventListener('click', function () {
  const editForm = document.querySelector('.edit-form')
  //注意这里的id是从哪里来的呢 这里的hidden隐藏了 前面点击编辑的时候以及从服务器获取火来并赋值到value了
  // <input type="hidden" class="id" name="id" value="509570">
  const { id, bookname, author, publisher } = serialize(editForm, { hash: true, empty: true })
  axios({
    url: `http://hmajax.itheima.net/api/books/${id}`,
    method: 'PUT',
    data: {
      bookname,
      author,
      publisher,
      creator
    }
  }).then(result => {
    console.log(result)
    getBookList()
    editModal.hide()
  })
})

3.案例:图片上传

  • 注意当接口文档标明需要FormData格式上传图片时使用该方法
html 复制代码
<body>
  <!-- 文件选择元素 -->
  <input type="file" class="upload">
  <img src="" alt="" class="my-img">

  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /**
     * 目标:图片上传,显示到网页上
     *  1. 获取图片文件
     *  2. 使用 FormData 携带图片文件
     *  3. 提交到服务器,获取图片url网址使用
    */
    document.querySelector('.upload').addEventListener('change', e => {
      //获取图片文件
      console.log(e.target.files[0])
      //使用FormData携带图片文件
      const fd = new FormData()
      fd.append('img', e.target.files[0])
      console.log(fd);

      //提交到服务器
      axios({
        url: 'http://hmajax.itheima.net/api/uploadimg',
        method: 'POST',
        data: fd
      }).then(result => {
        console.log(result)
        const imgURL = result.data.data.url
        document.querySelector('.my-img').src = imgURL
      })

    })
  </script>
</body>
相关推荐
日升12 小时前
AbortController:让异步操作随时说停就停
前端·javascript·ajax
2401_8242568614 小时前
Spark-SQL(三)
sql·ajax·spark
来自星星的坤1 天前
SpringBoot 与 Vue3 实现前后端互联全解析
后端·ajax·前端框架·vue·springboot
每次的天空3 天前
Android学习总结之OKHttp拦截器和缓存
android·学习·okhttp
东方芷兰4 天前
JavaWeb 课堂笔记 —— 04 Ajax
笔记·ajax·okhttp
桃子不吃李子5 天前
前端学习10—Ajax
前端·学习·ajax
隔壁小查5 天前
【后端开发】初识Spring IoC与SpringDI、图书管理系统
java·spring·okhttp
張萠飛5 天前
Redis哨兵模式下执行sentinel failover mymaster命令可能导致什么风险,如何避免
redis·bootstrap·sentinel
quo-te5 天前
AJAX简介
前端·ajax·okhttp
#岩王爷5 天前
Ajax------免刷新地前后端交互
前端·javascript·ajax·php