案例分析:
如图所示,页面加载时有数据回填,同时实现select表单同步和图片上传,保存后上传至服务器等功能
HTML模板:
08.案例_个人信息修改 .form-select { width: 103px; display: inline-block; } .col-form-label { text-align: right; } .figure-img { width: 100px; height: 100px; cursor: pointer; } #upload { display: none; } 个人设置
--省-- --市-- --区-- 一.页面回填
通过获取内置个人信息进行页面回填
// 前缀基地址 axios.defaults.baseURL = 'http://ajax-api.itheima.net/' // 获取标签方法$ function $(id) { return document.querySelector('#' + id) } // 数据回填方法 async function getInfo() { const res = await axios.get('api/settings') const { nickname, province, city, area, avatar } = res.data.data // 昵称 $('nickname').value = nickname // 头像地址 $('avatar').src = avatar // 给头像框input进行赋值,方便后期拿取数据 $('avatarInp').value = avatar // 省数据 const provinceAll = await axios.get('api/province') $('province').innerHTML += provinceAll.data.data.map(item => `${item}`).join('') $('province').value = province // 市数据 const cityAll = await axios.get('api/city?pname=' + province) $('city').innerHTML += cityAll.data.data.map(item => `${item}`).join('') $('city').value = city // 区数据 const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`) $('area').innerHTML += areaAll.data.data.map(item => `${item}`).join('') $('area').value = area } // 调用回填方法 getInfo()
二.省市区下拉框的联动
// 省数据下拉框 $('province').addEventListener('change', async () => { // 获取省下市数据 const cityAll = await axios.get('api/city?pname=' + $('province').value) // 渲染市数据 $('city').innerHTML = cityAll.data.data.map(item => `${item}`).join('') // 获取市下区数据 const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`) // 渲染区数据 $('area').innerHTML = areaAll.data.data.map(item => `${item}`).join('') }) $('city').addEventListener('change', async () => { const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`) $('area').innerHTML = areaAll.data.data.map(item => `${item}`).join('') })
三.头像图片上传功能
// 图片上传功能 $('upload').addEventListener('change', (e) => { // 非空判断 if (e.target.files.length === 0) { return } // 创建FormData接收 const fd = new FormData() // 将图片数据添加到fd中 fd.append('avatar', e.target.files[0]) // 图片上传接口 axios.post('api/file', fd).then(res => { console.log(res); $('avatar').src = res.data.data.url // 给头像框input进行赋值,方便拿取数据 $('avatarInp').value = res.data.data.url }) }) // 图片点击事件 $('avatar').addEventListener('click', () => { // 优化图片上传功能 $('upload').click() })
四.将数据上传至服务器保存
// 上传点击事件 $('uploadAll').addEventListener('click', async (e) => { // 取消默认刷新操作 e.preventDefault() // 用serialize获取表单中所有内容(前面给头像框input赋值的应用) const userFormall = serialize($('userForm'), { hash: true }) try { // 执行成功,上传数据并弹出ok弹框 await axios.put('api/settings', userFormall) alert('ok') } catch (error) { alert('error') } })
五.个人经验①省市区下拉框联动时,操作省数据联动市数据时,仍需对区数据进行联动②给图片input框的value赋值,方便最后上传服务器时用serialize获取数据③附完整源码
08.案例_个人信息修改 .form-select { width: 103px; display: inline-block; } .col-form-label { text-align: right; } .figure-img { width: 100px; height: 100px; cursor: pointer; } #upload { display: none; } 个人设置
--省-- --市-- --区-- // 前缀基地址 axios.defaults.baseURL = 'http://ajax-api.itheima.net/' // 获取标签方法$ function $(id) { return document.querySelector('#' + id) } // 数据回填方法 async function getInfo() { const res = await axios.get('api/settings') const { nickname, province, city, area, avatar } = res.data.data // 昵称 $('nickname').value = nickname // 头像地址 $('avatar').src = avatar // 给头像框input进行赋值,方便后期拿取数据 $('avatarInp').value = avatar // 省数据 const provinceAll = await axios.get('api/province') $('province').innerHTML += provinceAll.data.data.map(item => `${item}`).join('') $('province').value = province // 市数据 const cityAll = await axios.get('api/city?pname=' + province) $('city').innerHTML += cityAll.data.data.map(item => `${item}`).join('') $('city').value = city // 区数据 const areaAll = await axios.get(`api/area?pname=${province}&cname=${city}`) $('area').innerHTML += areaAll.data.data.map(item => `${item}`).join('') $('area').value = area } // 调用回填方法 getInfo() // 省数据下拉框 $('province').addEventListener('change', async () => { // 获取省下市数据 const cityAll = await axios.get('api/city?pname=' + $('province').value) // 渲染市数据 $('city').innerHTML = cityAll.data.data.map(item => `${item}`).join('') // 获取市下区数据 const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`) // 渲染区数据 $('area').innerHTML = areaAll.data.data.map(item => `${item}`).join('') }) $('city').addEventListener('change', async () => { const areaAll = await axios.get(`api/area?pname=${$('province').value}&cname=${$('city').value}`) $('area').innerHTML = areaAll.data.data.map(item => `${item}`).join('') }) // 图片上传功能 $('upload').addEventListener('change',(e)=>{ // 非空判断 if(e.target.files.length===0){ return } // 创建FormData接收 const fd = new FormData() // 将图片数据添加到fd中 fd.append('avatar', e.target.files[0]) // 图片上传接口 axios.post('api/file',fd).then(res=>{ console.log(res); $('avatar').src = res.data.data.url // 给头像框input进行赋值,方便拿取数据 $('avatarInp').value = res.data.data.url }) }) // 图片点击事件 $('avatar').addEventListener('click',()=>{ // 优化图片上传功能 $('upload').click() }) // 上传点击事件 $('uploadAll').addEventListener('click', async (e)=>{ // 取消默认刷新操作 e.preventDefault() // 用serialize获取表单中所有内容(前面给头像框input赋值的应用) const userFormall = serialize($('userForm'),{hash:true}) try { // 执行成功,上传数据并弹出ok弹框 await axios.put('api/settings',userFormall) alert('ok') } catch (error) { alert('error') } }) 本文来自博客园,作者:三井绫子,转载请注明原文链接:https://www.cnblogs.com/Ayako/p/16900651.html