22个React-Native(RN)项目常用第三方组件使用方法和BUG汇总

组件名

  1. "react-native-actionsheet": "^2.4.2"
    平台适应性: 跨平台
    作用: 一个自定义ActionSheet,默认从手机底部弹出一个选择列表供选择
    安装使用: npm install react-native-actionsheet --save
    参考的全部配置
    参考的全部说明文件
import ActionSheet from 'react-native-actionsheet'
class Demo extends React.Component {
  showActionSheet = () => {
    this.ActionSheet.show()
  }
  render() {
    return (
      <View>
        <Text onPress={this.showActionSheet}>点我打开弹出该组件</Text>
        <ActionSheet
          ref={o => this.ActionSheet = o}
          title={'选择喜欢的食物?'}
          options={['苹果', '梨子', '取消']}
          cancelButtonIndex={2}
          destructiveButtonIndex={1}
          onPress={(index) => { 
            /* 如果点击了 列表options 里面的某一个元素(比如苹果), 那么下面的代码就会执行写在此处 */
            console.log(`点击了${index}`)
            }}
        />
      </View>
    )
  }
}
  1. "react-native-amap3d": "^1.0.2",
    平台适应性: Android + iOS, (说明:RN v0.53+ 存在一些 bug(主要影响 iOS 自定义 View))
    作用:

地图模式切换(常规、卫星、导航、夜间)
3D 建筑、路况、室内地图
内置地图控件的显示隐藏(指南针、比例尺、定位按钮、缩放按钮)
手势交互控制(平移、缩放、旋转、倾斜)
中心坐标、缩放级别、倾斜度的设置,支持动画过渡
地图事件(onPress、onLongPress、onLocation、onStatusChange)
地图标记(Marker)

自定义信息窗体
自定义图标
折线绘制(Polyline)
多边形绘制(Polygon)
圆形绘制(Circle)
热力图(HeatMap)
海量点(MultiPoint)
离线地图
安装使用: npm i react-native-amap3d --save
安装配置
相关推荐:

import { MapView } from 'react-native-amap3d'
class Demo extends React.Component {
  render() {
    return (
      <View>
       <MapView
          coordinate={{
            latitude: 39.91095,
            longitude: 116.37296,
          }}
        />
      </View>
    )
  }
}
  1. "react-native-image-crop-picker": "^0.21.2",
    平台适应性: iOS / Android
    作用: 图像选择器,支持相机,可配置压缩,多个图像和裁剪, 不带Actionsheet弹出层,需要自己结合组件进行使用
    安装使用: npm i react-native-image-crop-picker --save
    安装配置
    参考的使用配置
import ImagePicker from 'react-native-image-crop-picker'
class Demo extends React.Component {
  open = () => {
    ImagePicker.openPicker({
      width: 300,
      height: 400,
      cropping: true
    }).then(image => {
      if (response.uri && Platform.OS !== 'android') {
          // 从uri截取fileName
          const temp = response.uri.split('/');
          response.fileName = temp[temp.length - 1];
          // 去掉 file://
          response.uri = response.uri.substring(7);
      }
    });
  }
  render() {
    return (
      <View>
       <Text onPress={()=>{
         this.open()
       }}>点我打开图片选择器</Text>
      </View>
    )
  }
}
  1. "react-native-image-picker": "^0.26.10",
    平台适应性: iOS / Android
    作用: 图像选择器,支持相机, 自带Actionsheet弹出层
    安装使用: npm i react-native-image-picker --save
    安装配置
    参考的使用配置
import ImagePicker from 'react-native-image-picker';
class Demo extends React.Component {
  const options = {
      title: '选择图片',
      customButtons: [{ name: '自定义按钮', title: '自定义按钮的文字' }],
      storageOptions: {
        skipBackup: true,
        path: 'images',
      },
  };  
  open = () => {
   ImagePicker.showImagePicker(options, (response) => {
        console.log('Response = ', response);
        // 以下是触发的事件后,对应的结果参数的值,可以进行各种定制操作
      if (response.didCancel) {
        console.log('取消了按钮');
      } else if (response.error) {
        console.log('打开出错 ', response.error);
      } else if (response.customButton) {
        console.log(点击了自定的按钮 ', response.customButton);
      } else {
        const source = { uri: response.uri } 
      }
    });
  }
  render() {
    return (
      <View>
       <Text onPress={()=>{
         this.open()
       }}>点我打开选择器</Text>
      </View>
    )
  }
}
  1. "react-native-modal": "^6.5.0",
    平台适应性: iOS / Android
    作用: 封装了一个弹出模态窗,具有动画
    安装使用: npm i react-native-modal --save
    参考的使用配置
import Modal from "react-native-modal";
class Demo extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
          isModalVisible: false
      }
    }
    _toggleModal = () => {
      this.setState({ isModalVisible: !this.state.isModalVisible });
    }
  render() {
    return (
      <View>
       <Text onPress={()=>{
             this._toggleModal()
          }}>点我打开Modal</Text>

          <Modal isVisible={this.state.isModalVisible}>
            <View>
                <Text>打开了Modal!</Text>
                <TouchableOpacity onPress={this._toggleModal}>
                    <Text>点击我隐藏Modal</Text>
                </TouchableOpacity>
          </View>
        </Modal>
      </View>
    )
  }
}
  1. "react-native-modal-datetime-picker": "^6.0.0",
    平台适应性: iOS / Android, 在Android和IOS上面的样式不太一样
    作用: 用于在模态中显示本机日期选择器和时间选择器,不用手动去调用原生的TimePicker和DatePicker
    说明: 支持全部的RN官方的组件datepickerios的全部配置项目
    安装使用: npm install react-native-modal-datetime-picker --save
    参考的使用配置
import DateTimePicker from 'react-native-modal-datetime-picker';
class Demo extends React.Component {
    constructor(props) {
      super(props)
      this.state = {
          isVisible: false
      }
    }
    _toggleModal = () => {
      this.setState({ isVisible: !this.state.isVisible });
    }
    //选择成功之后的回调函数
    selectResult = (date) =>{
        console.log(data);
        // 需要手动执行关闭日期
        this._toggleModal()
    }
    
  render() {
    return (
      <View>
       <Text onPress={()=>{
             this._toggleModal()
          }}>点我打开日期选择器</Text>

        <DateTimePicker
          isVisible={this.state.isVisible}
          onConfirm={this.selectResult}
          onCancel={this._toggleModal}
        />
      </View>
    )
  }
}
  1. "react-native-picker": "^4.3.7"

平台适应性: 跨平台
作用:
1.弹出选择选择列表:如时间选择器,
2.级联选择:如日期选择器,地址选择器等。当选择1级列表某一项的时候,次级列表自动切换
安装使用:

  1. npm install react-native-picker --save
  2. react-native link
  3. 如果出现了问题,那么直接去MainJava去自行导入和new分配
  4. IOS推荐用点我打开

参考的数据结构写法
React-Native-picker使用最详细

  1. "react-native-root-toast": "^3.0.1",

平台适应性: 跨平台
作用: 用于显示一个全局的弹窗提示,3.5秒后自动消失
说明: 全部用JS实现,无任何原生,可以看做一个全局组件
安装: npm install react-native-root-toast --save
全部配置
使用方式: 最好封装一个一个组件

  1. 函数方式
import Toast from 'react-native-root-toast';
let toast = Toast.show('This is a message', {
    duration: Toast.durations.LONG,
    position: Toast.positions.BOTTOM,
    shadow: true,
    animation: true,
    hideOnPress: true,
    delay: 0,
    onShow: () => {
        // 开始的那一刻 do anything code
    },
    onShown: () => {
        // 完成 do anything code
    },
    onHide: () => {
        // 隐藏的的那一刻  do anything code
    },
    onHidden: () => {
        // 隐藏 do anything code
    }
});
// 自动关闭
setTimeout(function () {
    Toast.hide(toast);
}, 500);
  1. 组件方式
import React from 'react-native';
import Toast from 'react-native-root-toast';

class Demo extends React.Component{
    constructor() {
        super(...arguments);
        this.state = {
            visible: false
        };
    }

    componentDidMount() {
        setTimeout(() => this.setState({
            visible: true
        }), 2000); // 2秒之后自动显示toast

        setTimeout(() => this.setState({
            visible: false
        }), 5000); //5秒之后自动隐藏toast
    };

    render() {
        return <Toast
            visible={this.state.visible}
            position={50}
            shadow={false}
            animation={false}
            hideOnPress={true}
        >hello RN</Toast>;
    }
}


  1. "react-native-scrollable-tab-view": "^0.8.0",
    平台适应性: IOS / Android
    安装: npm install react-native-scrollable-tab-view --save

推荐使用方式,(官方的是ES5的Demo)

import ScrollableTabView from "react-native-scrollable-tab-view"
class Demo extends React.Component{
    // 最基础的方法, 跳转到第几个Tab, this.tabView.goToPage(0)
    render = () => {
        return (<ScrollableTabView
                    ref={(tabView) => {
                        this.tabView = tabView;
                    }}>
             <Text tabLabel='Tab 1'>促销</Text>
             <Text tabLabel='Tab 2'>头条</Text>
             <Text tabLabel='Tab 3'>教育</Text>
             <Text tabLabel='Tab 4'>资讯</Text>
             <Text tabLabel='Tab 5'>智能</Text>
</ScrollableTabView>)
    }
}
  1. "react-native-storage": "^0.2.3",

平台适应性: 全部

作用:本地持久存储的封装
安装:npm install react-native-storage@beta
使用: 增删改查,远程同步更新
一定要先初始化,同时注意,key永远不要用下划线

// 首先初始化
import Storage from 'react-native-storage';
import { AsyncStorage } from 'react-native';

const storage = new Storage({
  // 最大容量,默认值1000条数据循环存储
  size: 1000,

  // 存储引擎:对于RN使用AsyncStorage,对于web使用window.localStorage
  // 如果不指定则数据只会保存在内存中,重启后即丢失
  storageBackend: AsyncStorage,

  // 数据过期时间,默认一整天(1000 * 3600 * 24 毫秒),设为null则永不过期
  defaultExpires: 1000 * 3600 * 24,

  // 读写时在内存中缓存数据。默认启用。
  enableCache: true, // 你可以在构造函数这里就写好sync的方法 // 或是在任何时候,直接对storage.sync进行赋值修改 // 或是写到另一个文件里,这里require引入

  // 如果storage中没有相应数据,或数据已过期,
  // 则会调用相应的sync方法,无缝返回最新数据。
  // sync方法的具体说明会在后文提到
  sync: require('你可以另外写一个文件专门处理sync')
});

// 最好在全局范围内创建一个(且只有一个)storage实例,方便直接调用

// 对于web
// window.storage = storage;

// 对于react native
// global.storage = storage;

// 这样,在此**之后**的任意位置即可以直接调用storage
// 注意:全局变量一定是先声明,后使用
// 如果你在某处调用storage报错未定义
// 请检查global.storage = storage语句是否确实已经执行过了
  1. "react-native-swiper": "^1.5.13",

平台适应性: android和iOS

使用方法
参看说明文档

该组件常见BUG,

  • 使用ScrollView,ListView,FlatList一类的组件嵌套该组件,造成滚动过后的图片消失,需要设置ScrollView,ListView,FlatList的removeClippedSubviews={false}
    参考链接
  • 使用该组件,嵌套两个同级组件出现的问题,不渲染
    参考链接
  • 其他一些问题
  1. "react-native-vector-icons": "^5.0.0",
    参考链接
    说明: 通常用阿里矢量图代替

  2. "react-navigation": "^2.6.2",
    参考官网说明

  3. "react-navigation-redux-helpers": "^2.0.2",
    参考官网说明

  4. "react-redux": "^5.0.7",
    参考官网说明

  5. "redux": "^4.0.0",
    参考官网说明

  6. "redux-actions": "^2.4.0",
    参考官网说明

  7. "redux-form": "^7.4.2",
    参考官网说明

  8. "redux-thunk": "^2.3.0",
    说明: 异步中间件
    参考官网说明

其他推荐redux-saga,难度比thunk要难点

  1. "babel-polyfill": "^6.26.0",
    说明: ES6 的boundle
    参考官网说明
    使用,在index入口,引入即可

  2. "url-search-params-polyfill": "^5.0.0"
    说明: 类(或者说构造函数)UrlSearchParams的垫片
    使用,在index入口,引入即可

  3. "react-native-splash-screen": "^3.1.1",
    平台适应性: 全平台
    作用: 启动屏
    安装:npm i react-native-splash-screen --save
    react-native link react-native-splash-screen
    参考Android/IOS配置
    使用:

import SplashScreen from 'react-native-splash-screen'
 
class Demo  extends React.Component {
 
    componentDidMount() {
        // 在需要的页面,关闭启动屏
        SplashScreen.hide();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容