成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

react怎么實現圖片選擇

react實現圖片選擇的方法:1、使用import引入“react-native-image-picker”插件;2、使用“{this.setState({uploadImgs: urls})}}src={uploadImgs}/>”調用實現圖片選擇上傳即可。

react怎么實現圖片選擇

本教程操作環境:Windows10系統、react18.0.0版、Dell G3電腦。

react怎么實現圖片選擇?

React Native七牛上傳+本地圖片選擇

參考:

react-native-image-crop-picker圖片選擇并裁減 //這個看需求使用 https://github.com/ivpusic/react-native-image-crop-picker react-native-image-picker圖片選擇 https://github.com/react-native-image-picker/react-native-image-picker react-native-qiniu https://github.com/buhe/react-native-qiniu
登錄后復制

我只要一個多圖片上傳功能,所以就寫簡單一點

效果

react怎么實現圖片選擇

已上傳狀態

react怎么實現圖片選擇

上傳中狀態

步驟

1、手機圖片、視頻選擇功能

用react-native-image-picker插件

yarn add react-native-image-picker;ios需要pod install;

import {launchCamera, launchImageLibrary, ImageLibraryOptions, PhotoQuality} from 'react-native-image-picker'; /**  * 從相冊選擇圖片;  * sourceType: 'camera'  打開相機拍攝圖片 **/ export async function chooseImage(options: {   count?: number,   quality?: PhotoQuality   sourceType?: 'camera',  //默認'album' } = {}) {   return new Promise<any>(async(resolve, reject) => {     const Opts: ImageLibraryOptions = {       mediaType: 'photo',       quality: options.quality || 1,       selectionLimit: options.count || 1     };     const result = options.sourceType == 'camera'?        await launchCamera(Opts) :        await launchImageLibrary(Opts);     resolve(result)   }) } /**  * 從相冊選擇視頻;  * sourceType: 'camera'  打開相機拍攝視頻 **/ export async function chooseVideo(options: {   count?: number,   quality?: 'low' | 'high'   sourceType?: 'camera',  //默認'album' } = {}) {   return new Promise<any>(async(resolve, reject) => {     const Opts: ImageLibraryOptions = {       mediaType: 'video',       videoQuality: options.quality,       selectionLimit: options.count || 1     };     const result = options.sourceType == 'camera'?        await launchCamera(Opts) :        await launchImageLibrary(Opts);     resolve(result)   }) }
登錄后復制

2、七牛上傳文件功能

class qiniuUpload {   private UP_HOST = 'http://upload.qiniu.com';   // private RS_HOST = 'http://rs.qbox.me';   // private RSF_HOST = 'http://rsf.qbox.me';   // private API_HOST = 'http://api.qiniu.com';   public upload = async(uri:string, key:string, token:string) => {     return new Promise<any>((resolve, reject) => {       let formData = new FormData();       formData.append('file', {uri: uri, type: 'application/octet-stream', name: key});       formData.append('key', key);       formData.append('token', token);            let options:any = {         body: formData,         method: 'post',       };       fetch(this.UP_HOST, options).then((response) => {         resolve(response)       }).catch(error => {         console.error(error)         resolve(null)       });       })   }    //...后面再加別的功能 } const qiniu = new qiniuUpload(); export default qiniu; import qiniu from '@/modules/qiniu/index' ...   /**    * 上傳視頻圖片    */   uploadFile: async (filePath: string) => {     const res = await createBaseClient('GET', '/v1/file')();  //這是接口請求方法,用來拿后端的七牛token、key          if( !res ) {       return res;     }     const { key, token } = res;     const fileSegments = filePath.split('.');     const fileKey = key + '.' + fileSegments[fileSegments.length - 1];     try {       const result = await qiniu.upload(filePath, fileKey, token)       if(result && result.ok) {         return {           url: ASSET_HOST + '/' + fileKey,  //ASSET_HOST是資源服務器域名前綴         };       }else {         return null       }     } catch (error) {       return null;     }   }, ...
登錄后復制

3、多圖上傳組件封裝

(這里Base、Image、ActionSheet都是封裝過的,需看情況調整)

import React from 'react' import {   ViewStyle,   StyleProp,   ImageURISource,   ActivityIndicator } from 'react-native' import Base from '@/components/Base'; import { Image, View, Text } from '@/components';   //Image封裝過的,所以有些屬性不一樣 import ActionSheet from "@/components/Feedback/ActionSheet";  //自己封裝 import styles from './styleCss';  //樣式就不放上來了 interface Props {   type?: 'video'   src?: string[]   count?: number   btnPath?: ImageURISource   style?: StyleProp<ViewStyle>   itemStyle?: StyleProp<ViewStyle>   itemWidth?: number   itemHeight?: number  //默認正方形   onChange?: (e) => void } interface State {   imageUploading: boolean   images: string[] } /**  * 多圖上傳組件  * * type?: 'video'  * * src?: string[]   //圖片數據,可用于初始數據  * * count?: number    //數量  * * btnPath?: ImageURISource   //占位圖  * * itemStyle?: item樣式,width, height單獨設  * * itemWidth?: number  * * itemHeight?: number  //默認正方形  * * onChange?: (e:string[]) => void **/ export default class Uploader extends Base<Props, State> {   public state: State = {     imageUploading: false,     images: []   };   public didMount() {     this.initSrc(this.props.src)   }   public componentWillReceiveProps(nextProps){     if(nextProps.hasOwnProperty('src') && !!nextProps.src){       this.initSrc(nextProps.src)     }   }   /**    *初始化以及改動圖片   **/   private initSrc = (srcProp:any) => {     if(!this.isEqual(srcProp, this.state.images)) {       this.setState({         images: srcProp       })     }   }      public render() {     const { style, btnPath, count, itemStyle, itemWidth, itemHeight, type } = this.props;     const { imageUploading, images } = this.state;     let countNumber = count? count: 1     return (       <React.Fragment>         <View style={[styles.uploaderBox, style]}>           {images.length > 0 && images.map((res, ind) => (             <View style={[styles.item, itemStyle]} key={res}>               <View style={styles.imgItem}>                 <Image                   source={{uri: res}}                   width={this.itemW}                   height={this.itemH}                   onPress={() => {                     this.singleEditInd = ind;                     this.handleShowActionSheet()                   }}                 />                 <Text style={styles.del} onPress={this.handleDelete.bind(null, ind)}>刪除</Text>               </View>             </View>           ))}           {images.length < countNumber  &&             <View style={[styles.item, itemStyle]}>                {imageUploading? (                 <View style={[{                   width: this.itemW,                   height: this.itemH,                 }, styles.loading]}>                   <ActivityIndicator size={this.itemW*0.4}></Loading>                   <Text style={{                     fontSize: 14,                     color: '#888',                     marginTop: 5                   }}>                     上傳中...                   </Text>                 </View>               ): (                 <View style={styles.btn}>                   <Image                     source={btnPath || this.assets.uploadIcon}                     width={this.itemW}                     height={this.itemH}                     onPress={() => {                       this.singleEditInd = undefined;                       this.handleShowActionSheet()                     }}                   />                 </View>               )}                            </View>           }                    </View>         <ActionSheet           name="uploaderActionSheet"           options={[{             name: type == 'video'? '拍攝': '拍照',             onClick: () => {               if(type == 'video') {                 this.handleChooseVideo('camera')               }else if(this.singleEditInd !== undefined) {                 this.handleChooseSingle('camera')               }else {                 this.handleChooseImage('camera')               }             }           }, {             name: '相冊',             onClick: () => {               if(type == 'video') {                 this.handleChooseVideo()               }else if(this.singleEditInd !== undefined) {                 this.handleChooseSingle()               }else {                 this.handleChooseImage()               }             }           }]}         ></ActionSheet>       </React.Fragment>     );   }   private get itemW() {     return this.props.itemWidth || 92   }   private get itemH() {     return this.props.itemHeight || this.itemW;   }      private isEqual = (firstValue, secondValue) => {     /** 判斷兩個值(數組)是否相等 **/     if (Array.isArray(firstValue)) {       if (!Array.isArray(secondValue)) {         return false;       }       if(firstValue.length != secondValue.length) {         return false;       }       return firstValue.every((item, index) => {         return item === secondValue[index];       });     }     return firstValue === secondValue;   }   private handleShowActionSheet = () => {     this.feedback.showFeedback('uploaderActionSheet');  //這是顯示ActionSheet選擇彈窗。。。   }   private handleChooseImage = async (sourceType?: 'camera') => {     const { imageUploading, images } = this.state;     const { count } = this.props     if (imageUploading) {       return;     }     let countNumber = count? count: 1     const { assets } = await this.interface.chooseImage({  //上面封裝的選擇圖片方法       count: countNumber,       sourceType: sourceType || undefined,     });          if(!assets) {       return;     }     this.setState({       imageUploading: true,     });          let request:any = []     assets.map(res => {       let req = this.apiClient.uploadFile(res.uri)   //上面封裝的七牛上傳方法       request.push(req)     })     Promise.all(request).then(res => {       let imgs:any = []       res.map((e:any) => {         if(e && e.url){           imgs.push(e.url)         }       })       imgs = [...images, ...imgs];       this.setState({         images: imgs.splice(0,countNumber),         imageUploading: false,       },         this.handleChange       );     })        }   private singleEditInd?: number;  //修改單個時的索引值   private handleChooseSingle = async(sourceType?: 'camera') => {     let { imageUploading, images } = this.state;     if (imageUploading) {       return;     }          const { assets } = await this.interface.chooseImage({   //上面封裝的選擇圖片方法       count: 1,       sourceType: sourceType || undefined,     });     if(!assets) {       return;     }     this.setState({       imageUploading: true,     });     const res = await this.apiClient.uploadFile(assets[0].uri)   //上面封裝的七牛上傳方法     if(res && res.url && this.singleEditInd){       images[this.singleEditInd] = res.url     }     this.setState({       images: [...images],       imageUploading: false,     },       this.handleChange     );        }   private handleChooseVideo = async(sourceType?: 'camera') => {     const { onChange } = this.props     let { imageUploading } = this.state;     if (imageUploading) {       return;     }          const { assets } = await this.interface.chooseVideo({       sourceType: sourceType     });     if(!assets) {       return;     }     this.setState({       imageUploading: true,     });     const res = await this.apiClient.uploadFile(assets[0].uri)   //上面封裝的七牛上傳方法     if(res && res.url){       //視頻就不在組件中展示了,父組件處理       if(onChange) {         onChange(res.url)       }     }     this.setState({       imageUploading: false,     });        }   private handleDelete = (ind:number) => {     let { images } = this.state     images.splice(ind,1)     this.setState({       images: [...images]     },       this.handleChange     )   }   private handleChange = () => {     const { onChange } = this.props     const { images } = this.state     if(onChange) {       onChange(images)     }   } }
登錄后復制

4、最后調用

import Uploader from "@/components/Uploader"; ...           <Uploader             count={6}             onChange={urls => {               this.setState({                 uploadImgs: urls               })             }}             src={uploadImgs}           /> ...
登錄后復制

推薦學習:《react視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品久久久久精品三级| 99精产国品一二三产区区别网站| 护士猛少妇色ⅩⅩXXX猛叫| 奶头被几个流浪汉吃肿了| 激情偷乱人伦小说视频| 久青草无码视频在线观看| 道德沦丧一家3口小说| 亚洲午夜性春猛交ⅩXXX| 正在播放国产对白孕妇作爱| CHINESE 麻豆 HD X| 精品无码综合一区二区三区| 国产午夜激无码AV片在线观看| 精品国产你懂的在线观看| 免费A级毛片无码无遮挡内射| 欧美极品少妇XXXXⅩ高跟鞋| 日韩精品无码一区二区三区免费| 五十路○の豊満な肉体| 亚洲一线产区二线产区区| 999国内精品永久免费观看| 懂色av一区二区三区蜜臀| 韩国电影办公室的在线观看| 麻豆影视视频高清在线观看| 日韩人妻无码一区2区3区| 亚洲AV成人片无码网站网8X| 荫蒂添的好舒服小说短篇| АⅤ资源新版在线天堂| 国产人成无码视频在线观看| 萝卜视频高清免费视频日本| 色惰日本视频网站WWW| 亚洲成在人线AV品善网好看| 999国产精品999久久久久久| 国产精品爆乳奶水无码视频| 久久综合给合久久狠狠狠97色6| 日本黄漫动漫在线观看视频| 亚洲AV无码专区国产乱码软件| AV无码AV不卡一区二区| 亚洲欧美成人在线观看| 97精品依人久久久大香线蕉97| 丰满人妻一区二区三区无码AV| 激情无码白丝人妻又大又粗| 欧美日韩一区二区三区在线观看视| 无码免费一区二区三区| 岳故意装睡让我挺进去的电影| 丰满多毛的大隂户BEST| 久久精品女人天堂AV| 日本亚洲色大成网站www久久| 亚洲第一最快AV网站| YW尤物AV无码国产在线看 | 免费无码不卡视频在线观看| 天美传媒蜜桃传媒精东| 伊人久久大香线蕉AV五月天宝贝| 国产69精品久久久久99尤物| 旧里番肉欲に堕ちた牝たち| 天堂√最新版中文在线| 中文字幕在线播放| 国产熟女露脸大叫高潮| 欧美午夜成人片在线观看| 亚洲成A人V欧美综合天堂| 暗交拗一区二区三区| 久久精品国产99精品亚洲蜜桃| 日日噜噜夜夜狠狠视频| 在线精品一区二区三区| 国产欧美日韩第一章午夜在线 | 麻花传媒剧国产MV高清播放| 国产精品欧美一区二区三区 | 国产AV天堂无码一区二区三区| 久久夜色精品国产嚕嚕亚洲AV| 天堂А√中文在线官网| 最新国产免费AV片在线观看| 国精产品一二三区传媒公司| 人妻少妇精品无码专区| 亚洲熟妇丰满XXXXX黑| 国产成人无码一区二区三区 | 久久97精品久久久久久久不卡 | 野花日本中文版免费观看| 国产成人精品A视频一区| 欧美成人免费一区| 亚洲碰碰人人AV熟女天堂| 久久无码AV中文出轨人妻| 精品无码成人片一区二区| 久久996RE热这里有精品| 少妇又紧又深又湿又爽视频| 7777成年免费视频| 久久国产中文娱乐网| 午夜福利麻豆国产精品| 成人片在线观看地址KK4444| 免费无码毛片一区二区APP| 亚洲精品国产精品乱码视色| 国产成人无码AV在线播放无广告| 欧美日韩中文字幕视频不卡一二区| 亚洲日韩在线A视频在线观看| 国产精品毛片无码一区二区蜜桃| 日本乱码卡一卡新区入口| 中文字幕无码中文字幕有码A| 精品国产一区二区三区吸毒| 无码人妻精品一区二区| 错位关系C1V1一块五花肉| 欧美人成人精品视频在线观看| 又大又黄又粗又爽的免费视频| 花火と在线观看动漫免费| 无码人妻AⅤ一区二区三区水密桃| 成人免费A级毛片天天看| 欧美精产国品一二三产品| 在线播放国产精品三级网| 黑料不打烊吃瓜爆料| 无码人妻啪啪一区二区| 亚洲综合小说另类图片五月天| 国精产品自偷自偷综合下载 | 粉嫩Av网站在线观看| 日本高清中文字幕在线观穿线视频| 13小男生GAY自慰脱裤子| 久久夜色精品国产噜噜亚洲AV | 无码专区丰满人妻斩六十路| 国产成人艳妇AA视频在线| 少女たちよ观看动漫| 大伊香蕉精品一区视频在线| 日产无人区一线二线三线小说 | 在公交车上弄到高C了怎么办| 久久久久精品无码观看不卡| 亚洲情A成黄在线观看动漫尤物| 天天摸夜夜摸夜夜狠狠摸| 久久久久人妻一区精品果冻| 亚洲A∨国产AV综合AV麻豆丫| 国产精品免费久久久久久蜜桃| 丝袜AV在线丝袜AV天堂| 国99精品无码一区二区三区| 日韩久久无码免费毛片软件| 差差差软件大全APP推荐免费| 欧美高清熟妇啪啪内射不卡自拍| 236宅宅理论片免费| 欧美高清性色生活片免费观看| 37大但人文艺术A级都市天气| 蜜臀亚洲AV无码精品国产午夜| 中文在线中文资源| 免费人妻精品一区二区三区| 中文午夜人妻无码看片| 免费一对一真人视频APP| ASSPICS亚洲美女裸体CH| 人妻丰满熟妇AV无码区| 边做饭边被躁欧美三级| 乳揉みま痴汉电车中文字幕| 国产成人精品久久| 性色A∨亚洲一区二区三区| 后Λ式动态后Λ式动态图AV| 国产尤物AV尤物在线观看| 久久99国产精一区二区三区| 亚洲AV无码精品色午夜果冻不卡| 免费看无码自慰一区二区| 精品久久久久久久久午夜福利 | 亚洲AV秘 无码一区二黑人| 国产一区精选播放022| 亚洲国产精品久久久天堂麻豆宅男 | 2023年最新绝伦推理片推荐| 欧美内射AAAAAAXXXXX| 成人免费一区二区三区视频软件| 少妇仑乱A毛片无码| 国产亚洲精品第一综合另类| 亚洲日韩成人AV无码网站| 蜜臀av一区二区三区久久| GOGO全球高清大尺度视频| 日韩系列精品无码免费不卡| 国产毛片一二区三区四区| 亚洲乱码日产精品BD在| 免费看的WWW哔哩哔哩| 槽溜2021入口一二三四| 无码人妻精品一区二区在线视频| 经典精品毛片免费观看| 2018天天拍拍天天爽视频| 日韩精品无码一本二本三本色| 国产乱子伦精品无码码专区| 亚洲人成人一区二区在线观看| 男人扒开女人下部添高潮的视频| 大肉大捧一进一出好爽视频MBA| 亚洲AVAV电影AV天堂18禁| 浪货趴办公桌~H揉| 成人免费乱码大片A毛片| 性国产VIDEOFREE高清| 里番ACG★同人里番本子大全| 差差差很疼免费软件APP下载| 亚欧洲精品在线视频免费观看| 久久久久亚洲AV成人人电影| 锕锕锕锕锕锕锕好大污下载| 无套内谢孕妇毛片免费看看| 看国产黄大片在线观看| 第二书包网高H肉辣文| 亚洲女毛多水多21P| 欧美熟妇的性裸交| 国产亚洲精品无码专区| 18禁黄网站禁片免费观看国产| 四虎国产精品免费久久| 久久精品国产亚洲AV久| 成AV人电影在线观看| 亚洲精品国自产拍在线观看| 欧美综合天天夜夜久久| 国内精品久久久久久久影院 | 乱JAPANESE偷窥PISS| 成人精品视频一区二区| 国产精品不卡AⅤ在线播放| 裸体欣赏ⅤIDE0SPH0TO| 国产成人精品2021|