Taro -- 上传图片公用组件
Taro上传图片公用组件
子组件chooseImage
//component/chooseImage/index.js
import Taro, { Component } from '@tarojs/taro'
import { View } from '@tarojs/components'
import { AtImagePicker, AtButton } from "taro-ui" class ChooseImage extends Component { constructor() {
super(...arguments);
this.state = ({
files: [],
showUploadBtn:false,
upLoadImg:[]
})
} componentWillMount() {
console.log(this.props.chooseImg)
this.setState({
files: this.props.chooseImg.files,
showUploadBtn:this.props.chooseImgshowUploadBtn,
upLoadImg:this.props.chooseImg.upLoadImg
})
} componentDidShow() { } componentDidHide() { } onChange (v,doType,index) { // doType代表操作类型,移除图片和添加图片,index为移除图片时返回的图片下标
if(doType==='remove'){
this.setState((prevState)=>{
let oldSendImg = prevState.upLoadImg
oldSendImg.splice(oldSendImg[index],) // 删除已上传的图片地址
return ({
files:v,
upLoadImg:oldSendImg
})
},()=>{
const {files} = this.state
//this.setFatherUploadSrc()// 设置删除数据图片地址
if(files.length===){ // 最多三张图片 隐藏添加图片按钮
this.setState({
showUploadBtn:false
})
}else if(files.length===){
this.setState({
upLoadImg:[]
})
}else{
this.setState({
showUploadBtn:true
})
}
})
}else{
v.map((item, index)=>{
if (item.url.indexOf(".pdf") > - || item.url.indexOf(".PDF") > -) {
v[index].url = require("../../assets/images/PDF.png")
}
})
this.setState(()=>{
return ({
files:v
})
},()=>{
const {files} = this.state
if(files.length===){ // 最多三张图片 隐藏添加图片按钮
this.setState({
showUploadBtn:false
})
}else{
this.setState({
showUploadBtn:true
})
}
})
}
}
// 选择失败回调
onFail (mes) {
console.log(mes)
}
// 点击图片回调
onImageClick (index, file) {
let imgs = []
this.state.files.map((item, index) => {
imgs.push(item.file.path)
})
if (imgs[index].indexOf(".pdf") > - || imgs[index].indexOf(".PDF") > -) {
Taro.downloadFile({
url: imgs[index],
success: function (res) {
let filePath = res.tempFilePath
Taro.openDocument({
filePath: filePath,
success: function (res) {
console.log('打开文档成功')
}
})
}
})
}else{
Taro.previewImage({
//当前显示图片
current: imgs[index],
//所有图片
urls: imgs
})
}
}
toUpload = () => {
const { files } = this.state
if(files.length>){
this.props.onFilesValue(files)
const rootUrl = get('rootUrl') // 服务器地址
const cookieData = Taro.getStorageSync('token') // 图片上传需要单独写入token
this.uploadLoader({rootUrl,cookieData,path:files})
}else{
Taro.showToast({
title: '请先点击+号选择图片',
icon: 'none',
duration:
})
}
}
// 上传组件
uploadLoader = (data)=>{
let that = this
let i = data.i ? data.i : // 当前所上传的图片位置
let success=data.success?data.success://上传成功的个数
let fail=data.fail?data.fail:;//上传失败的个数
Taro.showLoading({
title: `正在上传第${i+}张`
})
//发起上传
Taro.uploadFile({
url:data.rootUrl+'/app/index/uploadFile',
header:{
'content-type': 'multipart/form-data',
'cookie':'token='+data.cookieData // 上传需要单独处理cookie
},
name:'file',
filePath:data.path[i].url,
success: (resp) => {
//图片上传成功,图片上传成功的变量+1
let resultData= JSON.parse(resp.data)
if(resultData.code === ""){
success++;
this.setState((prevState)=>{
let oldUpload = prevState.upLoadImg
oldUpload.push(resultData.data)
return({
upLoadImg:oldUpload
})
},()=>{
// setSate会合并所有的setState操作,所以在这里等待图片传完之后再调用设置url方法
/*
* 该处十分重要
**/
//this.setFatherUploadSrc()// 设置数据图片地址字段
})
}else{
fail++;
}
},
fail: () => {
fail++;//图片上传失败,图片上传失败的变量+1
},
complete: () => {
Taro.hideLoading()
i++;//这个图片执行完上传后,开始上传下一张
if(i==data.path.length){ //当图片传完时,停止调用
Taro.showToast({
title: '上传成功',
icon: 'success',
duration:
})
console.log('成功:'+success+" 失败:"+fail);
}else{//若图片还没有传完,则继续调用函数
data.i=i;
data.success=success;
data.fail=fail;
that.uploadLoader(data);
}
}
})
} render() {
const { showUploadBtn } =this.state
return (
<View>
<AtImagePicker
multiple={false}
length={} //单行的图片数量
files={this.state.files}
onChange={this.onChange.bind(this)}
onFail={this.onFail.bind(this)}
onImageClick={this.onImageClick.bind(this)}
showAddBtn={showUploadBtn} //是否显示添加图片按钮
/>
<AtButton type='primary' className='poof_submit_btn' onClick={this.toUpload}>上传图片</AtButton>
</View>
)
}
} export default ChooseImage
父组件home
//pages/home/index.js
import ChooseImage from '../../component/chooseImage'
class Home extends Component {
constructor() {
super(...arguments);
this.state = ({
chooseImg: {
files: [],
showUploadBtn:true,
upLoadImg:[]
},
files:[],
})
}
config = {
navigationBarTitleText: '首页'
}
componentWillMount() {
}
// 拿到子组件上传图片的路径数组
getOnFilesValue = (value) => {
console.log(value);
this.setState({
files: value
},() => {
console.log(this.state.files)
})
}
render() {
return (
<View className="home">
<ChooseImage chooseImg = {this.state.chooseImg} onFilesValue={this.getOnFilesValue.bind(this)}/>
</View>
)
}
}
export default Home
如图:

Taro -- 上传图片公用组件的更多相关文章
- 微信小程序(14)--上传图片公用组件(父子传参)
这周整理了一下做微信小程序页面时遇到的一些问题,先说说常见的上传图片吧. 上传图片公用组件 首先要了解的是父子传参. 1.A组件为父组件,B组件为子组件,以下是A组件向B组件传参: 在A组件的json ...
- 微信小程序(15)--上传图片公用组件(2)
接下来开始写写上传图片的公用组件,可以自定义上传几张图片. chooseImage文件夹里面的index.wxml和index.js,涉及图片上传,删除,预览. <view class=&quo ...
- React jQuery公用组件开发模式及实现
目前较为流行的react确实有很多优点,例如虚拟dom,单向数据流状态机的思想.还有可复用组件化的思想等等.加上搭配jsx语法和es6,适应之后开发确实快捷很多,值得大家去一试.其实组件化的思想一直在 ...
- vue项目中编写一个图片预览的公用组件
今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...
- salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)
此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...
- salesforce lightning零基础学习(十六) 公用组件之 获取字段label信息
我们做的项目好多都是多语言的项目,针对不同国家需要展示不同的语言的标题.我们在classic中的VF page可谓是得心应手,因为系统中已经封装好了我们可以直接在VF获取label/api name等 ...
- 把iview中的table组件写成了一个公用组件,在另一个组件里去引用它的时候rander函数里的this指向不正确
在vue项目里使用iview制作后台管理系统时,由于有多个页面都需要用到table组件,所以就把table写到了一个公共组件里,在其他页面去引用它,但是这时会发现一个问题,就是render函数里的th ...
- Taro音频createVideoContext组件无法调用方法
用createVideoContext的时候,是在一个组件中 声明后这个实例的方法全部都不能使用了 Taro.createVideoContext('myVideo', this) 需要加上第二个参数 ...
- vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题
1.创建组件components > uploadImg > index.vue <template> <input type="file" name ...
随机推荐
- 进阶1:Linux 环境准备_ 设置网络IP_安装火狐浏览器
VM 已安装 centos6.5 Final 已安装 配置好了Linux IP ,并能ping 通 ,例如 : ping www.baidu.com 设置LINUX 网络IP: https://j ...
- [design pattern](2) Observer
前言 在上一个博客中我们介绍了Strategy模式,它是行为型模式麾下的一员大将.那么本博客我们来学习一下行为型模式麾下的另一员大将Observer模式. 思考题 老套路,先来思考下面的问题: 问题: ...
- vsphere client 虚拟机随主机自动启动
- 鸡肋工具-Oracle建表工具
为什么叫鸡肋工具呢,因为我们完全可以在pl/sql上直接建立表.索引.同义词.授权.触发器等. 写这个工具目的是因为公司的本地.测试环境开发无权创建表,每次成员建表语句千奇百怪不规范,所以写了这么个工 ...
- VMware 虚拟化编程(2) — 虚拟磁盘文件类型详解
目录 目录 前文列表 虚拟磁盘文件 VMDK 用户可以创建的虚拟磁盘类型 VixDiskLib 中支持的虚拟磁盘类型 虚拟机文件类型 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/ ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_2_BufferedOutputStream_字节缓冲
子类 继承父类,这些方法都可以使用 必须写上flush,刷新数据数据才能写入到文件内
- 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第5节 StringBuilder类_1_StringBuilder的原理
字符串不可变.字符串的缓冲区是可以变的 字符串Sting的底层,被final修饰的不可变的数组 a+b+c最终会产生5个字符串
- delphi 遍历窗口
http://blog.163.com/t_form/blog/static/12348523220115132155814/ function EnumWindowsProc_2(hwnd: HWN ...
- Node.js实战14:一个简单的TCP服务器。
本文,将会展示如何用Nodejs内置的net模块开发一个TCP服务器,同时模拟一个客户端,并实现客户端和服务端交互. net模块是nodejs内置的基础网络模块,通过使用net,可以创建一个简单的tc ...
- Sentinel之熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积.Sentinel 熔断降级会在调用链路 ...