返回顶部
首页 > 资讯 > 精选 >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://lsjlt.com/news/348701.html(转载时请注明来源链接)

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

猜你喜欢
  • react如何实现图片选择
    这篇文章主要讲解了“react如何实现图片选择”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react如何实现图片选择”吧!react实现图片选择的方法:1、使用import引入“react...
    99+
    2023-07-05
  • react如何实现图片验证
    这篇文章主要介绍“react如何实现图片验证”,在日常操作中,相信很多人在react如何实现图片验证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”react如何实现图片验证”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-04
  • 基于Flutter实现图片选择和图片上传
    目录内容简介图片选择插件权限申请UI 改造图片上传内容简介 本篇将介绍 Flutter 中如何完成图片上传,以及上传成功后的表单提交。涉及的知识点如下: 图片选择插件wechat_a...
    99+
    2024-04-02
  • Android实现底部图片选择Dialog
    业务需要选择弹出对话框,然后点击选择图片。网上已经有了很多,不过感觉写的有点乱。自己这里总结一下,有需要开发者可以按照如下步骤直接使用即可。1.效果图如下点击选择照相后,弹出如下选择对话框: 2. Dialog实现布局<LinearL...
    99+
    2023-05-30
    android 图片选择 dialog
  • 如何利用React实现图片识别App
    先把效果图给大家放上来 个人觉得效果还行。识别不太准确是因为这个 app学习图片的时间太短(电脑太卡)。 (笔者是 window10) 安装运行环境: npm install ...
    99+
    2024-04-02
  • Android实现拍照、选择图片并裁剪图片功能
    一、 实现拍照、选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果。      二、 uCrop项目应用 想起之前看到的Yalant...
    99+
    2022-06-06
    选择 图片 Android
  • 微信小程序如何实现选择图片和放大预览图片功能
    这篇文章给大家分享的是有关微信小程序如何实现选择图片和放大预览图片功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。视频中,老师也是看着官方文档,为学生们讲解,微信提供了系统的方...
    99+
    2024-04-02
  • Android实现QQ图片说说照片选择效果
    本文实例为大家分享了Android实现QQ图片说说照片选择的具体代码,供大家参考,具体内容如下效果展示布局文件布局是很简单的,一个GridView,直接上布局:layout/activity_add_photo.xml<?xm...
    99+
    2023-05-30
    android 照片选择
  • react实现动态选择框
    本文实例为大家分享了react实现动态选择框的具体代码,供大家参考,具体内容如下 小需求 在工作中,我们也会碰到这种需求: 为了提高用户的体验,在搜索的时候,采用灵活查询。用户可以自...
    99+
    2024-04-02
  • 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+
    2024-04-02
  • 【Flutter】Flutter 图片选择器入门:如何使用 image_picker 插件从图库选择图片、拍摄新照片
    文章目录 一、 前言二、 Flutter 和 image_picker 插件简介三、 安装和配置 image_picker 插件四、 使用 image_picker 从图库选择图片五、 使用 ...
    99+
    2023-09-16
    flutter android ios 原力计划
  • css如何实现图片选中效果
    这篇文章主要介绍css如何实现图片选中效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!css实现图片选中效果.demo{width:114px;height:114px;position:relative;}&nb...
    99+
    2023-06-27
  • VUE如何实现选择上传图片并页面显示功能
    这篇文章给大家分享的是有关VUE如何实现选择上传图片并页面显示功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基于VUE选择上传图片并在页面显示,图片可删除,具体内容如下dem...
    99+
    2024-04-02
  • react怎么实现图片验证
    本教程操作环境:Windows10系统、react18版、Dell G3电脑。react怎么实现图片验证?react实现图片验证码效果如图所示:import React, { Component } from 'react'...
    99+
    2023-05-14
    React
  • Android中如何使用ImageEditContainer图片选择器
    Android中如何使用ImageEditContainer图片选择器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 简介ImageEditButton 和 Image...
    99+
    2023-05-30
    android
  • Android 选择图片、上传图片之PictureSelector
    集成方式 implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'     依赖...
    99+
    2022-06-06
    上传图片 选择 图片 Android
  • 微信小程序中如何实现chooseImage选择图片或者拍照
    这篇文章将为大家详细讲解有关微信小程序中如何实现chooseImage选择图片或者拍照,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信小程序 chooseImage选择...
    99+
    2024-04-02
  • 微信小程序如何实现图片选择区域裁剪功能
    这篇文章主要为大家展示了“微信小程序如何实现图片选择区域裁剪功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现图片选择区域裁剪功能”这篇文章吧...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作