列表的增删改查
经典业务逻辑之列表的增删改查,常见的业务逻辑,记录一下 。
查询
网页加载,或对数据进行了修改(添加删除更改),此时发送网络请求,得到最新数据再将数据渲染至列表。
具体操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function getBookList(){ axios({ url: 'http://hmajax.itheima.net/api/books', params:{ creator } }).then(result=>{ const bookList = result.data.data const htmlStr = bookList.map((item,index)=>{ return ` <tr> <td>${index+1}</td> <td>${item.bookname}</td> <td>${item.author}</td> <td>${item.publisher}</td> <td data-id=${item.id}> <span class="del">删除</span> <span class="edit">编辑</span> </td> </tr> ` }).join('') document.querySelector('.list').innerHTML = htmlStr
}) } getBookList()
|
这里定义了getBookList
方法,用来向服务器请求数据,根据返回的数据通过map
和模版字符串的使用,进行遍历渲染,再插入到DOM
中。
tips:Array.prototype.map()
,该方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。点击查看具体用法
新增
新增数据实现逻辑:当用户点击添加按钮,弹出输入框,用户在输入框中点击输入信息,再点击保存即可实现新增一条数据列表。
思路:
1.点击添加按钮,实现新增输入框的弹出。
获取到新增弹框元素对象
1 2 3
| const addModalDom = document.querySelector('.add-modal') const addModal = new bootstrap.Modal(addModalDom)
|
bootstrap弹框对象,点击按钮data-bs-target=".add-modal"
带有add-modal
类的弹框自动弹出。
2.弹出弹框,用户输入新增的数据,点击保存,给“保存”按钮添加点击事件,收集数据并提交到服务器,点击后完成数据的保存,再次调用getBookList
方法重新获取数据进行渲染,关闭弹框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| document.querySelector(".add-btn").addEventListener('click',()=>{ const addForm = document.querySelector('.add-form') const bookObj = serialize(addForm,{hash:true,empty:true}) axios({ url: 'http://hmajax.itheima.net/api/books', method:'post', data:{ ...bookObj, creator } }).then(result=>{ getBookList() addForm.reset() addModal.hide() }) })
|
这里用到了form-serialize
插件快速收集表单元素的值。点击查看具体用法
删除
实现删除功能,需要给删除按钮绑定点击事件,删除按钮是动态创建的,需要给父级委托点击事件再获取删除按钮。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const list = document.querySelector(".list")
list.addEventListener('click',(e)=>{ if(e.target.classList.contains('del')){ const theId = e.target.parentNode.dataset.id axios({ url:`http://hmajax.itheima.net/api/books/${theId}`, method:'delete' }).then(res=>{ getBookList() }) } })
|
修改
基本逻辑:点击编辑按钮,弹出编辑输入框,弹出输入框需要带上原本数据,点击修改,发送请求更改服务器数据,再次请求数据进行渲染。
点击编辑数据回填:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const editForm = document.querySelector('.edit-modal') const editModal = new bootstrap.Modal(editForm)
document.querySelector('.list').addEventListener('click',e=>{ if(e.target.classList.contains('edit')){ editModal.show() const id = e.target.parentNode.dataset.id axios({ url:`http://hmajax.itheima.net/api/books/${id}`, }).then(res=>{ const bookObj = res.data.data const keys = Object.keys(bookObj) keys.forEach(item=>{ document.querySelector(`.edit-form .${item}`).value=bookObj[item] }) }) } })
|
点击修改,保存数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| document.querySelector(".edit-btn").addEventListener('click',()=>{ const editForm = document.querySelector('.edit-form') 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(res=>{ getBookList() }) editModal.hide() })
|