今天主要就是练,巩固 axios 的使用
做完这个案例我们将会有什么收获呢?
答案什么是 Bootstrap 弹框?
如何使用 Bootstrap 弹框呢?
去代码区实现一下
用哪个属性绑定来控制弹框显示呢?
答案用哪个属性来控制隐藏弹框呢?
答案为什么需要 JS 方式控制呢?
如何使用 JS 方式 控制 Bootstrap 弹框显示和隐藏呢?
语法如下:
去代码区实现一下
什么时候用属性控制,什么时候用 JS 控制 Bootstrap 弹框的显示/隐藏?
答案为什么需要给自己起一个外号呢?
完成渲染列表的思路步骤?
渲染数据列表的2个步骤是什么?
答案完成新增图书的思路步骤?
新增数据的3个步骤是什么?
答案完成删除图书的思路步骤?
删除数据的步骤是什么?
答案因为编辑图书要做回显等,比较复杂,所以分了3个视频来讲解
编辑数据的核心思路:
编辑数据的步骤是什么?
答案完整js
/*
一 渲染图书列表
*/
// 3.3 抽取creator为变量
const creator = 'itheima1011'
// 2.4 抽取渲染图书列表的逻辑为函数
function getBooks() {
axios({
url: 'http://hmajax.itheima.net/api/books',
// 3.4 替换为变量
params: {
creator
}
}).then(res => {
console.log(res)
const htmlArr = res.data.data.map((item, index) => {
const { author, bookname, publisher, id } = item
// 2.2 在删除按钮上保存id
return `
${index + 1}
${bookname}
${author}
${publisher}
${id}" class="del">删除
${id}" class="edit">编辑
`
})
const htmlStr = htmlArr.join('')
document.querySelector('.list').innerHTML = htmlStr
})
}
// 2.5 默认调用一次
getBooks()
/*
二 删除图书
*/
// 2.1 事件委托绑定事件
document.querySelector('.list').addEventListener('click', (e) => {
if (e.target.classList.contains('del')) {
// 2.3 获取保存在删除按钮上的id
const { id } = e.target.dataset
axios({
url: `http://hmajax.itheima.net/api/books/${id}`,
method: 'delete'
}).then(res => {
// console.log(res)
// 2.6 删除成功之后 重新获取数据并渲染
getBooks()
})
}
})
/*
三 新增图书
*/
const addModal = new bootstrap.Modal(document.querySelector('.add-modal'))
document.querySelector('.add-btn').addEventListener('click', () => {
// 3.2 收集表单数据
const addForm = document.querySelector('.add-form')
const data = serialize(addForm, { hash: true, empty: true })
console.log('data:', data)
// 3.3 提交到服务器
axios({
url: 'http://hmajax.itheima.net/api/books',
method: 'POST',
data: { ...data, creator }
}).then(res => {
// console.log(res)
// 关闭弹窗
addModal.hide()
// 重置表单
addForm.reset()
// 重新获取数据
getBooks()
})
})
/*
四 编辑图书
*/
const editModal = new bootstrap.Modal(document.querySelector('.edit-modal'))
document.querySelector('.list').addEventListener('click', (e) => {
if (e.target.classList.contains('edit')) {
const { id } = e.target.dataset
axios({
url: `http://hmajax.itheima.net/api/books/${id}`,
}).then(res => {
console.log(res)
// 保存图书数据
// document.querySelector('.edit-modal .bookname').value = res.data.data.bookname
// document.querySelector('.edit-modal .author').value = res.data.data.author
// document.querySelector('.edit-modal .publisher').value = res.data.data.publisher
for (const key in res.data.data) {
document.querySelector(`.edit-modal .${key}`).value = res.data.data[key]
}
editModal.show()
})
}
})
document.querySelector('.edit-btn').addEventListener('click', () => {
const data = serialize(document.querySelector('.edit-form'), { hash: true, empty: true })
axios({
url: `http://hmajax.itheima.net/api/books/${data.id}`,
method: 'PUT',
data: data
}).then(res => {
console.log(res)
editModal.hide()
getBooks()
})
})
学完图书管理案例,我们收货了什么?
答案图片上传的思路是什么?
答案/**
* 二 壁纸上传
* 1. 选择壁纸
* 2. FormData
* 3. 上传壁纸
* */
document.querySelector('.skin-ipt').addEventListener('change', function () {
// 1,2 选择壁纸 通过append方法添加到FormData对象中
const data = new FormData()
data.append('img', this.files[0])
// 3 上传壁纸
axios({
url: 'http://hmajax.itheima.net/api/uploadimg',
method: 'post',
data
}).then(res => {
const { url } = res.data.data
document.body.style.backgroundImage = `url(${url})`
// 缓存URL
localStorage.setItem('skin', url)
})
})
// 读取URL
const imgUrl = localStorage.getItem('skin')
// 非空判断
if (imgUrl) {
document.body.style.backgroundImage = `url(${imgUrl})`
}
localStorage 取值和赋值的语法分别是什么?
答案暂无
渲染数据和图书列表的渲染思路是否一样呢,是什么?
答案为什么这次上传头像,需要携带外号呢?
答案/**
* 一 信息渲染
* 1. 获取数据
* 2. 渲染数据
* */
// 1. 定义creator
const creator = '播仔'
// 2. 调用接口
axios({
url: 'http://hmajax.itheima.net/api/settings',
params: {
creator
},
method: 'get',
}).then(res => {
// 3. 渲染数据
const data = res.data.data
console.log('data:', data)
Object.keys(data).forEach(key => {
console.log('key:', key)
// 3.1 头像 src属性
if (key === 'avatar') {
document.querySelector(`.${key}`).src = data[key]
}
// 3.2 性别 checked属性
else if (key === 'gender') {
// 0 男 1 女
const { gender } = data
// 获取所有性别标签 [男radio,女radio]
const genderRadios = document.querySelectorAll(`.${key}`)
// 性别作为 索引 获取对应的标签
genderRadios[gender].checked = true
}
// 3.3 邮箱 昵称 个人简介 value属性
else {
document.querySelector(`.${key}`).value = data[key]
}
})
})
/**
* 二 头像上传
* 1. 获取头像
* 2. 调用接口
* 3. 更新头像URL
* */
document.querySelector('#upload').addEventListener('change', function () {
// 1. 获取头像
// this.files[0]
// FormData
const data = new FormData()
data.append('avatar', this.files[0])
data.append('creator', creator)
// 2.调用接口
axios({
url: 'http://hmajax.itheima.net/api/avatar',
method: 'put',
data
}).then(res => {
// 3. 更新头像URL
// 获取url
const { avatar } = res.data.data
// 渲染图片
document.querySelector('.avatar').src = avatar
})
})
/**
* 三 信息修改
* 1. 收集表单数据
* 2. 调用接口
* 3. 提示用户
* */
const toastDom = document.querySelector('.toast')
const toast = new bootstrap.Toast(toastDom)
document.querySelector('.submit').addEventListener('click', () => {
// 收集数据
const data = serialize(document.querySelector('.user-form'), { hash: true, empty: true })
data.gender = +data.gender
// 提交数据
axios({
url: 'http://hmajax.itheima.net/api/settings',
method: 'put',
data: {
...data,
creator
}
}).then(res => {
// console.log('')
toast.show()
})
})
信息修改数据和以前增删改查哪个实现的思路比较接近呢?
答案bootstrap 弹框什么时候用 JS 方式控制显示呢?
答案