黑马头条vue2.0项目实战(九)——编辑用户资料
目录
1. 创建组件并配置路由
2. 页面布局
3. 展示用户信息
4. 修改昵称
5. 修改性别
6. 修改生日
7. 修改头像
7.1 图片上传预览
7.2 使用纯客户端的方式处理用户头像上传预览
7.3 头像裁切
7.4 纯客户端的图片裁切上传流程
7.5 Cropper.js 图片裁剪器的基本使用
7.6 裁剪头像上传
1. 创建组件并配置路由
① 创建 views/user-profile/index.vue
② 将该页面配置到根路由
2. 页面布局
- 头部导航栏
-
nav-bar组件
-
- 头像
- van-cell
-
is-link 是否展示右侧箭头并开启点击反馈
-
-
van-image
- van-cell
-
昵称
-
van-cell
-
-
性别
-
van-cell
-
-
生日
-
van-cell
-
3. 展示用户信息
- 思路:
- 找到数据接口
- 封装请求方法
- 请求获取数据
- 模板绑定
① 在 api/user.js 中添加封装数据接口
② 在 views/user-profile/index.vue 组件中请求获取数据
③ 模板绑定
4. 修改昵称
① 准备弹出层
-
弹出层是懒渲染,就是相当于元素的显示与隐藏,所以使用 v-if 条件渲染的方式绑定,使得弹出层组件实现条件渲染。
② 封装组件
③ 页面布局
④ 基本功能处理
- 封装更改用户个人资料接口
⑤ 更新完成
5. 修改性别
① 准备弹出层
② 封装组件
③ 页面布局
- Vant 2 - Mobile UI Components built on VuePicker 选择器:Vant 2 - Mobile UI Components built on Vue
- Picker 组件通过 columns 属性配置选项数据,columns 是一个包含字符串或对象的数组。
-
设置 show-toolbar 属性后会展示顶部操作栏,顶部栏包含标题、确认按钮和取消按钮,点击确认按钮触发 confirm 事件,点击取消按钮触发 cancel 事件。
-
单列选择时,可以通过 default-index 属性设置初始选中项的索引。
-
change 选项改变时触发
-
单列:Picker 实例,选中值,选中值对应的索引。
-
多列:所有列选中值,所有列选中值对应的索引
-
④ 基本功能处理
⑤ 更新完成
6. 修改生日
① 准备弹出层
② 封装组件
③ 页面布局
-
DatetimePicker 通过 type 属性来定义需要选择的时间类型, type 为 date 表示选择年月日。
-
通过 min-date 和 max-date 属性可以确定可选的时间范围。
④ 基本功能处理
⑤ 更新完成
-
dayjs的使用与配置参考黑马头条vue2.0项目实战(四)——首页—文章列表——4.5 处理相对时间
7. 修改头像
7.1 图片上传预览
- 方式一:结合服务器的图片上传预览
- 方式二:纯客户端实现上传图片预览
-
const file = fileInput.files[0] // 获取文文件对象
-
img.src = window.URL.createObjectURL(file) // 设置图片的 src
-
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>客户端图片上传预览示例</title><style>.img-wrap {width: 200px;height: 200px;border: 1px solid #ccc;}img {max-width: 100%;}</style>
</head>
<body><h1>客户端图片上传预览示例</h1><div class="img-wrap"><img src="" alt="" id="img"></div><br><input type="file" id="file" onchange="onFileChange()"><script>const img = document.querySelector('#img')const file = document.querySelector('#file')function onFileChange() {// 得到 file-input 的文件对象const fileObj = file.files[0]const data = window.URL.createObjectURL(fileObj)img.src = data}</script>
</body>
</html>
接下来就是在项目中使用纯客户端的方式处理用户头像上传预览。
7.2 使用纯客户端的方式处理用户头像上传预览
在组件中:views/user-profile/index.vue
① 增加图片上传输入框,input 输入框自带的隐藏元素的方式,hidden 类似于 display: none。
② 点击头像单元格时,触发文件提交输入框。
-
给头像单元格注册点击事件,点击头像单元格的时候,相当于点击了文件输入框。
-
具体做法在单元格点击事件里拿到文件输入框的 dom,并且注册点击事件。($refs.file.click())
③ 给文件输入框注册 change 事件,拿到输入框输入的文件。
-
this.$refs.file:通过 Vue.js 的 $refs 获取到页面上定义的 <input type="file"> 元素。
-
this.$refs.file.files:返回一个 FileList 对象,包含了用户在文件输入框中选择的所有文件。
-
即使只选择一个文件,它也是一个数组形式的对象。
-
file 变量就是这个文件对象,它包含了文件的各种属性和信息,如文件名、类型、大小等。
④ 为选中的文件创建一个临时的、本地的 URL,以便在页面上可以直接预览或访问这个文件,而不需要立即上传到服务器。
-
window.URL.createObjectURL(file):使用浏览器的 URL.createObjectURL() 方法,为传入的 file 对象(即用户选择的文件)生成一个本地的临时 URL。
-
这个 URL 是一个字符串,指向本地的文件资源。
-
例如:blob:http://localhost:8080/4e97a5f3-8a16-4a13-8d08-7e0c5571f1d8。
-
blob: URL 可以直接用作 HTML 标签(如 <img>、<video>、<audio> 等)的 src 属性,无需进一步处理。
-
blob: URL 是由 window.URL.createObjectURL() 生成的本地 URL,它能够指向内存中的文件或二进制数据,因此可以直接用于展示文件内容。
⑤ file-input 如果两次同时选了同一个文件,那么就不会触发 change 事件。
-
解决方法: 每次输入完毕之后,把文件输入框的 value 值清空
参考文档:
- <input type="file">
- 在 web 应用程序中使用文件
7.3 头像裁切
- 方案一:结合服务端的图片裁切上传流程
- 方案二:纯客户端的图片裁切上传流程
接下来就是在项目中使用纯客户端的方式裁剪上传头像。
7.4 纯客户端的图片裁切上传流程
① 准备修改用户头像弹出层
② 封装组件
③ 页面布局
7.5 Cropper.js 图片裁剪器的基本使用
① Cropper.js——JavaScript 图像裁剪器的使用
- 如果是基于服务端的裁切,则使用:getData 方法,该方法得到裁切的区域参数。
-
如果是纯客户端的图片裁切,则使用:getCroppedCanvas 方法,该方法得到裁切之后的图片对象(类似于URL.createObjectURL 方法得到的文件对象)。
官方文档
-
安装: npm install cropperjs
-
用法:
-
用块元素(容器)包裹图像或画布元素
-
确保图像的大小完全适合容器
-
导入
import 'cropperjs/dist/cropper.css'; import Cropper from 'cropperjs';
- 获取图片对象
- 在 mounted 生命周期里
- 实例化裁剪器
- 配置参数
-
③ 将裁剪后的图像上传到服务器
7.6 裁剪头像上传
- 步骤:
- 封装接口
- 请求提交
- 更新视图
① 在 api/user.js
中添加封装数据接口
② 请求头参数问题
-
如果接口要求的请求头 Header 为 Content-Type: multipart/form-data 则必须传递一个 FormData 对象
-
如果接口要求的请求头 Header 为 Content-Type: application/json 则传递的是一个普通 js 对象(默认方式)
③ 裁剪头像配置
- 下载安装 croppe.js:npm install cropperjs
- 导入
- 用块元素(容器)包裹图像或画布元素,确保图像的大小完全适合容器
- 在 mounted 生命周期里获取图片对象,实例化裁剪器并自行配置截图区域参数
④ 提交裁剪之后的用户头像
-
getData方法得到了裁剪之后图片的对象参数,让后将这个对象传递给服务端,让服务端对原图进行裁切
-
客户端进行对图片进行裁切,使用 getCroppedCanvas 方法,该方法得到裁切之后的图片对象(类似于URL.createObjectURL 方法得到的文件对象)