广告
返回顶部
首页 > 资讯 > 精选 >react如何实现图片选择
  • 484
分享到

react如何实现图片选择

2023-07-05 00:07:36 484人浏览 独家记忆
摘要

这篇文章主要讲解了“React如何实现图片选择”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现图片选择”吧!react实现图片选择的方法:1、使用import引入“react

这篇文章主要讲解了“React如何实现图片选择”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现图片选择”吧!

react实现图片选择的方法:1、使用import引入“react-native-image-picker”插件;2、使用“{this.setState({uploadImgs: urls})}}src={uploadImgs}/>”调用实现图片选择上传即可。

React Native七牛上传+本地图片选择

参考:

react-native-image-crop-picker图片选择并裁减 //这个看需求使用https://GitHub.com/ivpusic/react-native-image-crop-pickerreact-native-image-picker图片选择Https://github.com/react-native-image-picker/react-native-image-pickerreact-native-qiniuhttps://github.com/buhe/react-native-qiniu

我只要一个多图片上传功能,所以就写简单一点

效果

react如何实现图片选择

已上传状态

react如何实现图片选择

上传中状态

步骤

手机图片、视频选择功能

用react-native-image-picker插件

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

import {launchCamera, launchImageLibrary, ImageLibraryOptions, PhotoQuality} from 'react-native-image-picker';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)  })}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)  })}

七牛上传文件功能

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;    }  },...

多图上传组件封装

(这里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[]}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)    }  }}

最后调用

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

感谢各位的阅读,以上就是“react如何实现图片选择”的内容了,经过本文的学习后,相信大家对react如何实现图片选择这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: react如何实现图片选择

本文链接: https://www.lsjlt.com/news/348701.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react如何实现图片选择
    这篇文章主要讲解了“react如何实现图片选择”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现图片选择”吧!react实现图片选择的方法:1、使用import引入“react...
    99+
    2023-07-05
  • 基于Flutter实现图片选择和图片上传
    目录内容简介图片选择插件权限申请UI 改造图片上传内容简介 本篇将介绍 Flutter 中如何完成图片上传,以及上传成功后的表单提交。涉及的知识点如下: 图片选择插件wechat_a...
    99+
    2022-11-13
  • Android实现底部图片选择Dialog
    业务需要选择弹出对话框,然后点击选择图片。网上已经有了很多,不过感觉写的有点乱。自己这里总结一下,有需要开发者可以按照如下步骤直接使用即可。1.效果图如下点击选择照相后,弹出如下选择对话框: 2. Dialog实现布局<LinearL...
    99+
    2023-05-30
    android 图片选择 dialog
  • react如何实现图片验证
    这篇文章主要介绍“react如何实现图片验证”,在日常操作中,相信很多人在react如何实现图片验证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react如何实现图片验证”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
  • Android实现拍照、选择图片并裁剪图片功能
    一、 实现拍照、选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果。      二、 uCrop项目应用 想起之前看到的Yalant...
    99+
    2022-06-06
    选择 图片 Android
  • Android实现QQ图片说说照片选择效果
    本文实例为大家分享了Android实现QQ图片说说照片选择的具体代码,供大家参考,具体内容如下效果展示布局文件布局是很简单的,一个GridView,直接上布局:layout/activity_add_photo.xml<?xm...
    99+
    2023-05-30
    android 照片选择
  • Android获取相册图片-实现选择相册图片功能
    初识MediaProvider 需求:发朋友圈进行图片的选择,或者扫描二维码从图库选取。。。那么我们如何实现?这就需要借助媒体库的内容提供者Me...
    99+
    2022-06-06
    选择 图片 Android
  • Andoroid实现底部图片选择Dialog效果
    1.效果图如下点击选择照相后,弹出如下选择对话框:2. Dialog实现布局<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi...
    99+
    2023-05-30
    android 底部图片 dialog
  • react实现动态选择框
    本文实例为大家分享了react实现动态选择框的具体代码,供大家参考,具体内容如下 小需求 在工作中,我们也会碰到这种需求: 为了提高用户的体验,在搜索的时候,采用灵活查询。用户可以自...
    99+
    2022-11-13
  • 微信小程序如何实现选择图片和放大预览图片功能
    这篇文章给大家分享的是有关微信小程序如何实现选择图片和放大预览图片功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。视频中,老师也是看着官方文档,为学生们讲解,微信提供了系统的方...
    99+
    2022-10-19
  • 【Flutter】Flutter 图片选择器入门:如何使用 image_picker 插件从图库选择图片、拍摄新照片
    文章目录 一、 前言二、 Flutter 和 image_picker 插件简介三、 安装和配置 image_picker 插件四、 使用 image_picker 从图库选择图片五、 使用 ...
    99+
    2023-09-16
    flutter android ios 原力计划
  • 如何利用React实现图片识别App
    先把效果图给大家放上来 个人觉得效果还行。识别不太准确是因为这个 app学习图片的时间太短(电脑太卡)。 (笔者是 window10) 安装运行环境: npm install ...
    99+
    2022-11-12
  • Jetpack Compose 实现一个图片选择框架功能
    目录获取图片拍照策略NothingCaptureStrategyFileProviderCaptureStrategyMediaStoreCaptureStrategy总结拍照权限取...
    99+
    2022-11-13
  • web前端怎么实现图片选择题特效
    这篇文章主要介绍“web前端怎么实现图片选择题特效”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“web前端怎么实现图片选择题特效”文章能帮助大家解决问题。架构和概念抽象整体的实现思路如下MediaP...
    99+
    2023-07-05
  • Android自定义View实现多图片选择控件
    前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件。 ...
    99+
    2022-06-06
    view 选择 图片 Android
  • 分享实现Android图片选择的两种方式
    Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static fi...
    99+
    2022-06-06
    选择 Android
  • android中怎么实现在相册中选择图片
    这期内容当中小编将会给大家带来有关android中怎么实现在相册中选择图片,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先在 activity_main.xml 文件中增加一个 Button,用来触发从...
    99+
    2023-05-30
  • vue+js实现微信上传图片选择功能
    本文实例为大家分享了vue+js实现微信上传图片选择的具体代码,供大家参考,具体内容如下 需求:实现微信发送图片或发朋友圈选择图片功能 可实现选后点击后 选择图片标记值自减或自增 最...
    99+
    2022-11-13
  • react怎么实现图片验证
    本教程操作环境:Windows10系统、react18版、Dell G3电脑。react怎么实现图片验证?react实现图片验证码效果如图所示:import React, { Component } from 'react'...
    99+
    2023-05-14
    React
  • VUE如何实现选择上传图片并页面显示功能
    这篇文章给大家分享的是有关VUE如何实现选择上传图片并页面显示功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基于VUE选择上传图片并在页面显示,图片可删除,具体内容如下dem...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作