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 ...
随机推荐
- sh_04_qq号码
sh_04_qq号码 # 1. 定义一个变量记录 QQ 号码 qq_number = " # 2. 定义一个变量记录 QQ 密码 qq_password = " # 注意:在使用解 ...
- PHP获取数组最大值下标的方法
<?php $hots = array('8213'=> 0,'8212'=> 100,'8172'=> 10008); $key = array_search(max($ho ...
- 进阶2:Hadoop 环境搭建: hadoop3.1.1 jdk1.8 在centos6.5上的伪分布式安装
参考文章: https://blog.csdn.net/qq_38038143/article/details/82779016 https://blog.csdn.net/m0_37461645/a ...
- release,debug库互调用,32位,64位程序与库互调用
以下是基于visual studio 2015和cmake的实验 1,debug或release的应用程序都可以调用release的库2,win32和x64的应用和库无法互调用,在VS中链接时会有一堆 ...
- GMM demo
# GMM model # // library(mvtnorm) ) n1 = n2 = mu1 = c(,) mu2 = c(-,-) sigma1 = matrix(c(,.,.,),nrow= ...
- python写一个查询接口
知识点: 1.flask_sqlalchemy查询: Flask-SQLAlchemy 在您的 Model 类上提供了 query 属性.当您访问它时,您会得到一个新的所有记录的查询对象.在使用 al ...
- 初窥AST
一个简单的AST示例: AST结构: 里面有program.name.loc.type.comments.tokens 先看program: 重点关注program里面的body这个数组: JS引擎中 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第2节 Date类_5_练习_计算出一个人已经出生了多少天
Alt+回车
- AWK之随心所欲-基础篇
一.简介 awk 是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件.数据排序.计算以及 生成报表等等. 在 Linux 系统下默认 awk 是 gawk,它是 awk 的 GNU 版本. ...
- C 语言跟 C++ 的差异比较
C++ 完整的 CHM 版离线手册,可以 从这里下载. C++头文件不必是 .h 结尾 C语言中的标准库头文件,例如 math.h 和 stdio.h,在C++中被命名为 cmath 和 cstdio ...