VUE哔哩哔哩移动端项目使用vant 实现发布功能(上传文件)

本文主要是介绍VUE哔哩哔哩移动端项目使用vant 实现发布功能(上传文件),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bilibili发布页面主要有:发布按钮、多行文本框、一个上传图片的按钮(此处使用了vant)

在这里插入图片描述

组件里面的头部有:左返回按钮(使用vant)、发布按钮

<div class="top"><van-icon name="arrow-left" class="top-lef" @click="go" /><!-- 给按钮绑定一个class 如果computed返回的是true 就调用rel-highlight 这个css样式--><divclass="rel":class="{ 'rel-highlight': isHighLight }"@click="regSave">发布</div></div>

需要实现功能:当文本框输入内容时 发布按钮就会高亮。

实现思路:使用computed监听文本框的变化,当文本框的内容长度>0时,就调用isHighLight函数,动态改变按钮的class名(rel-highlight),即改变了按钮的样式 。
<div class="text"><textareaclass="text"placeholder="分享我的哔哩哔哩动态"v-model.trim="msg"></textarea></div>

v-model.trim=“msg” 给文本框的内容进行双向绑定 同时删除前后空格 (当输入空格时 发布按钮的事件并不会触发 不会高亮)

computed: {isHighLight: function () {// 判断文本框是否输入内容 有内容是true 就调用高亮函数return this.msg.length > 0;},},
上传文件:此处使用了vant

在这里插入图片描述

在这里插入图片描述

想要实现的效果就是这样的 但是当时出现了一个问题,就是我向后端发送请求之后 图片预览不出来。 (vant官方图片之所以能预览出来,是因为它自动将图片发送到vant的服务器,所以能展示出来。)
解决方法:查找vant文件上传的官方函数有:before-read=“beforeRead” 是上传前置处理,类似于钩子函数,在图片上传到vant服务器之前,将图片/视频的地址发到后端的服务器,如果上传成功,后端把拿到图片的地址和文件类型返回过来,图片/视频就可以展示出来。
:after-read=“afterRead” : 文件上传完毕后会触发 after-read 回调函数,获取到对应的 file 对象,将图片展示出来。

  <!-- 上传的图片预览 --><div class="add"><div v-for="(i, idx) in fileMe" :key="idx" class="a-showImgVideo">//当上传的文件类型为0时 就显示图片;是1时就显示视频<img class="myImg" :src="i.Mysrc" v-if="i.type == '0'" /><videoclass="myImg"width="320"height="240"v-if="i.type == '1'"autoplaymuted><source :src="i.Mysrc" type="video/mp4" /></video></div><!-- vant 上传图片/视频 --><van-uploaderv-model="fileList"multiple:before-read="beforeRead"/></div>

调用 beforeRead函数,将文件的地址和类型传送到后端服务器 成功之后拿到返回值,显示出来:

methods: {beforeRead(file) {console.log("file", file);console.log("file.type", file.type);//判断文件的类型是否是图片let type = file.type.indexOf("image") == -1 ? 1 : 0;//使用FormData 的最大优点就是可以异步上传二进制文件const forms = new FormData();forms.append("filename", file); // 增加文件的参数forms.append("type", type); // 增加类型参数//获取返回过来的图片/视频 进行展示axios({url: "/bili/dynamic/uploadPicture",method: "post",data: forms, //URLSearchParams对象用于处理URL中查询字符串,即?之后的部分。headers: {"Content-Type": "multipart/form-data",}, //php 默认要求传递请求头}).then((res) => {console.log("返回res.data", res.data);// if (res.data.data.code == "0") {// if(res.data.code == 0){console.log("上传成功", res.data.msg);let imgInfo = {Mysrc: res.data.url,type: res.data.type,};this.fileMe.push(imgInfo);//fileMe是在data里定义的 是个空的数组 存的是上传图片的地址和类型console.log("this.imgUrl", this.imgUrl);}).catch((e) => {console.log("服务器出错", e);});},
点击发布按钮之后 将文本和图片/视频上传到后端服务器
// 点击发布按钮regSave() {console.log("this.fileMe", this.fileMe);// 通过FormData将文件转成二进制数据const forms = new FormData();forms.append("uid", sessionStorage.getItem("uid")); //  uidforms.append("urlList", [this.fileMe[0].Mysrc]); // 添加 键和值forms.append("descr", this.msg); // 获取上传图片描述// forms.append("date", this.fileDate); // 获取上传图片上传时间forms.append("type", this.fileMe[0].type); // 获取上传图片类型axios({url: "/bili/dynamic/addDynamic",method: "post",data: forms, //URLSearchParams类型headers: {"Content-Type": "multipart/form-data",}, //php 默认要求传递请求头}).then((res) => {// if (res.data.status === 200) {console.log(res.data);}).catch((e) => {console.log("服务器出错了", e);});setTimeout(() => {// 发布成功 跳转到动态页面this.$router.push('/Move/Space/SpaceMy');}, 2000);},

全部代码:

<template><div class="box"><div class="top"><van-icon name="arrow-left" class="top-lef" @click="go" /><!-- 给按钮绑定一个class 如果computed返回的是true 就调用rel-highlight 这个css样式--><divclass="rel":class="{ 'rel-highlight': isHighLight }"@click="regSave">发布</div></div><van-notice-bar mode="link">新人福利,分享视频领限定头像框、个性装扮</van-notice-bar><div class="content"><div class="text"><textareaclass="text"placeholder="分享我的哔哩哔哩动态"v-model.trim="msg"></textarea></div><!-- 上传的图片预览 --><div class="add"><div v-for="(i, idx) in fileMe" :key="idx" class="a-showImgVideo"><img class="myImg" :src="i.Mysrc" v-if="i.type == '0'" /><videoclass="myImg"width="320"height="240"v-if="i.type == '1'"autoplaymuted><source :src="i.Mysrc" type="video/mp4" /></video></div><!-- 上传图片/视频 --><van-uploaderv-model="fileList"multiple:before-read="beforeRead"/></div><div class="address" v-show="isShow"><div class="address-lef"><span class="iconfont-zm icon-lujing"></span>西安市</div><div class="address-rig"><span class="iconfont-zm icon-X" @click="isShow = false"></span></div></div></div></div>
</template><script>
import axios from "axios";export default {name: "RelCenter",data() {return {// 用户输入  msgmsg: "",url: "",fileMe: [],isShow: true,fileList: [// { url: "https://img01.yzcdn.cn/vant/leaf.jpg" },// Uploader 根据文件后缀来判断是否为图片文件// 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明],};},methods: {beforeRead(file) {console.log("file", file);console.log("file.type", file.type);//判断文件类型是不是图片let type = file.type.indexOf("image") == -1 ? 1 : 0;const forms = new FormData();forms.append("filename", file); // 获取上传图片信息forms.append("type", type); // 获取上传图片信息console.log("type shiping", type);axios({url: "/bili/dynamic/uploadPicture",method: "post",data: forms, //URLSearchParams类型headers: {"Content-Type": "multipart/form-data",}, //php 默认要求传递请求头}).then((res) => {console.log("返回res.data", res.data);// if (res.data.data.code == "0") {// if(res.data.code == 0){console.log("上传成功", res.data.msg);let imgInfo = {Mysrc: res.data.url,type: res.data.type,};this.fileMe.push(imgInfo);console.log("this.imgUrl", this.imgUrl);}).catch((e) => {console.log("服务器出错", e);});},go() {this.$router.go(-1);},// 点击发布按钮regSave() {console.log("this.fileMe", this.fileMe);// 通过FormData将文件转成二进制数据const forms = new FormData();forms.append("uid", sessionStorage.getItem("uid")); //  uidforms.append("urlList", [this.fileMe[0].Mysrc]); // 添加 键和值forms.append("descr", this.msg); // 获取上传图片描述// forms.append("date", this.fileDate); // 获取上传图片上传时间forms.append("type", this.fileMe[0].type); // 获取上传图片类型axios({url: "/bili/dynamic/addDynamic",method: "post",data: forms, //URLSearchParams类型headers: {"Content-Type": "multipart/form-data",}, //php 默认要求传递请求头}).then((res) => {// if (res.data.status === 200) {console.log(res.data);}).catch((e) => {console.log("服务器出错了", e);});setTimeout(() => {// 跳转到动态页面this.$router.push('/Move/Space/SpaceMy');}, 2000);},},computed: {isHighLight: function () {// 判断文本框是否输入内容 有内容是true 就调用高亮函数return this.msg.length > 0;},},
};
</script><style scoped>
@import url(../../assets/IconFont/Moves/font3/iconfont.css);
.box {width: 100%;
}.top {width: 100%;height: 0.44rem;line-height: 0.44rem;display: flex;justify-content: space-between;align-items: center;padding: 0 0.16rem;box-sizing: border-box;
}
.top-lef {font-size: 0.16rem;color: #000;
}
.rel {width: 0.5rem;height: 0.28rem;background-color: #e7e7e7;border-radius: 0.14rem;font-size: 0.14rem;text-align: center;line-height: 0.28rem;color: #919191;
}.content {width: 100%;
}
.text {width: 100%;height: 1.3rem;box-sizing: border-box;padding: 0.2rem 0.16rem 0;
}
textarea {width: 100%;height: 1.3rem;color: #000;font-size: 0.16rem;border: 0;outline: none;
}
.add {width: 1.14rem;height: 1.14rem;padding: 0 0.16rem;
}.van-uploader__upload {width: 1.14rem;height: 1.14rem;border: 0.01rem solid dashed;
}
.address {width: 1.05rem;height: 0.26rem;line-height: 0.26rem;margin-left: 0.12rem;color: #277ac3;border-radius: 0.13rem;margin-top: 0.7rem;position: fixed;bottom: 0.6rem;
}
.address-lef {float: left;width: 0.77rem;height: 0.26rem;text-align: center;color: #277ac3;background-color: #f4f4f4;border-top-left-radius: 0.14rem;border-bottom-left-radius: 0.14rem;box-sizing: border-box;
}
.address-rig {float: left;width: 0.26rem;height: 0.26rem;line-height: 0.26rem;text-align: center;color: #277ac3;margin-left: 0.02rem;background-color: #f4f4f4;border-top-right-radius: 0.14rem;border-bottom-right-radius: 0.14rem;
}
.icon-lujing {font-size: 0.14rem;margin-right: 0.04rem;
}
.icon-X {font-size: 0.08rem;
}
//上传成功之后图片和视频的大盒子样式
.a-showImgVideo {margin-top: 0.2rem;width: 1.2rem;height: 1.2rem;
}
.a-showImgVideo .myImg {width: 100%;height: 100%;
}
</style>
<style>
.preview-cover {position: absolute;bottom: 0;box-sizing: border-box;width: 100%;padding: 0.04rem;color: #fff;font-size: 0.12rem;text-align: center;background: rgba(0, 0, 0, 0.3);
}
.van-uploader .van-uploader__wrapper {flex-wrap: nowrap;
}/* 动态样式 */
.top .rel-highlight {background-color: #ea7a99;color: #fff;
}
</style>

这篇关于VUE哔哩哔哩移动端项目使用vant 实现发布功能(上传文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834897

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码