RN封装的组件库

62 阅读3分钟

弹出层提示组件

import {ToastAndroid} from 'react-native';

ToastAndroid.show('暂未输入服务器地址', 2000);  //参数二代表持续时间

提示框确认组件

安装 "@ui-kitten/components": "^5.1.2",

import {StyleSheet, TouchableOpacity, View, Text} from 'react-native';
import {Modal} from '@ui-kitten/components';

function AlertAction(props) {
  return (
    <Modal
      animationType="none" 
      visible={props.visible}
      backdropStyle={{backgroundColor: 'rgba(0, 0, 0, 0.5)'}}>
      <View style={styles.container}>
        <View style={styles.upper}>
          <Text style={styles.title}>提醒</Text>
          <View style={styles.content}>
            <Text style={styles.desc}>{props.mode}</Text>
          </View>
        </View>
        <View style={styles.bottom}>
          <View style={styles.horiLine} />
          <TouchableOpacity
            style={styles.actionBtn}
            onPress={() => props.optionClick(false)}>
            <Text style={{fontSize: 15, color: '#999999'}}>取消</Text>
          </TouchableOpacity>
          <TouchableOpacity
            style={styles.actionBtn}
            onPress={() => props.optionClick(true)}>
            <Text style={{fontSize: 15, color: '#007AFF'}}>确定</Text>
          </TouchableOpacity>
          <View style={styles.vertLine} />
        </View>
      </View>
    </Modal>
  );
}

export default AlertAction;

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#FFF',
    width: 300,
    height: 160,
    borderRadius: 5,
  },
  upper: {
    alignItems: 'center',
    marginTop: 15,
  },
  title: {
    fontSize: 16,
    color: '#333333',
    fontWeight: 'bold',
  },
  content: {
    width: 300,
    height: 70,
    justifyContent: 'center',
    alignItems: 'center',
  },
  desc: {
    fontSize: 15,
    textAlign: 'center',
    color: '#000',
    marginHorizontal: 15,
  },
  bottom: {
    flexDirection: 'row',
    justifyContent: 'center',
    marginTop: 25,
    borderRadius: 5,
    position: 'absolute',
    bottom: 0,
  },
  actionBtn: {
    justifyContent: 'center',
    alignItems: 'center',
    width: 150,
    height: 50,
  },
  horiLine: {
    backgroundColor: 'rgba(0,0,80,0.05)',
    height: 1,
    width: 300,
    position: 'absolute',
    bottom: 50,
  },
  vertLine: {
    backgroundColor: 'rgba(0,0,80,0.05)',
    height: 50,
    width: 1,
    position: 'absolute',
  },
});

使用
import AlertAction from './AlertAction.js'
<AlertAction
  visible={true}  //提示框的显示和隐藏
  mode={'同步数据将删除现有的班组、\n训练记录和设备信息且无法恢复,\n确认同步请点击开始。'} //提示框提示的内容
  optionClick={(a)=>{console.log(a)})}  //点击开始和取消,默认有个参数布尔型代表点击开始或者点击取消
 />

获取屏幕宽高组件

import {Dimensions} from 'react-native';

const {width, height} = Dimensions.get('window');

下拉框组件

yarn add @react-native-picker/picker

import React, { Component } from 'react'
import { Text, StyleSheet, View } from 'react-native'
import { Picker } from '@react-native-picker/picker'
export default class picker extends Component {
  constructor() {
    super()
    this.state = {
      color: "white"
    }
  }
  render () {
    return (
      <View style={[styles.container, { backgroundColor: this.state.color }]}>
        <Picker
          selectedValue={this.state.color}
          // 如果默认显示或者选中后显示结果为"...",就给style加一下宽高,可能的原因就是没有空间显示出来
          style={{ height: 100, width: 200 }}
          onValueChange={(itemValue, itemIndex) => {
            console.log('itemValue', itemValue)
            this.setState({
              color: itemValue
            })
          }}
        >
          <Picker.Item label="白色" value="white" />
          <Picker.Item label="红色" value="red" />
        </Picker>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: "center"
  }
})

带输入框的确认组件(带蒙层,水平垂直居中)

输入框输入东西然后点击取消或者确认

import {
  StyleSheet,
  TextInput,
  Pressable,
  View,
  ToastAndroid, 
} from 'react-native';
import {Modal, Text} from '@ui-kitten/components';
import {useState} from 'react';
import {useKeyboard} from '@react-native-community/hooks';

export default function AddClassName({visible, title, optionClick}) {
  const [inputText, setInputText] = useState('');
  const keyboard = useKeyboard();
  function addClick() {
    if (inputText === '') {
      ToastAndroid.show('请输入机构名称', 2000);
      return;
    }
    if (inputText.trim() === '') {
      ToastAndroid.show('输入不能为空', 2000);
      return;
    }
    optionClick(inputText);
    setInputText('');
  }

  return (
    <Modal
      animationType="none"
      visible={visible}
      backdropStyle={{backgroundColor: 'rgba(0, 0, 0, 0.5)'}}>
      <View
        style={[
          styles.container,
          {marginBottom: keyboard.keyboardShown ? 250 : 0},
        ]}>
        <View style={styles.upper}>
          <Pressable
            style={styles.confirm}
            onPress={() => {
              setInputText('');
              optionClick(-1);
            }}>
            <Text style={{fontSize: 14, color: '#999'}}>取消</Text>
          </Pressable>
          <Text style={styles.title}>{title}</Text>
          <Pressable style={styles.confirm} onPress={addClick}>
            <Text style={{fontSize: 14, color: '#007AFF'}}>确定</Text>
          </Pressable>
        </View>
        <View style={styles.bottom}>
          <Text style={styles.actionText}>机构名称:</Text>
          <TextInput
            style={styles.textField}
            value={inputText}
            placeholder="请输入"
            onChangeText={text => {
              setInputText(text);
            }}
          />
        </View>
      </View>
    </Modal>
  );
}

const styles = StyleSheet.create({
  container: {
    backgroundColor: '#FFF',
    width: 350,
    height: 180,
    justifyContent: 'center',
    borderRadius: 5,
  },
  upper: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
    height: 50,
  },
  title: {
    fontSize: 14,
    color: '#333',
    fontWeight: '700',
  },
  bottom: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    borderRadius: 5,
    marginBottom: 20,
  },
  actionText: {
    fontSize: 12,
    color: '#333',
    fontWeight: 'bold',
  },
  textField: {
    width: 150,
    height: 40,
    fontSize: 10,
    textAlign: 'center',
    color: '#333',
    borderRadius: 2,
    borderWidth: 0.5,
    borderColor: '#EEE',
  },
  confirm: {
    padding: 15,
  },
});

使用组件

import {
  StyleSheet,
  View,
  Text,
  Image,
  ToastAndroid,
  TouchableOpacity,
} from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import APP from '../config/app.json';
import {useState} from 'react';
import App from '../config/app.json';
const res = [
  require('../assets/images/home/team.png'),
  require('../assets/images/home/team1.png'),
];
import AddClassName from './home/AddClassName2';
export default function TopLogo() {
  const [title, setTitle] = useState('');
  const [flag, setFlag] = useState(false);
  async function xj() {
    console.log('App.images', App.images);
    console.log('AsyncStorage', await AsyncStorage.getItem('name'));
    let a = (await AsyncStorage.getItem('name')) || APP.title;
    setTitle(a);
  }
  xj();
  function updatetitle() {
    setFlag(true);
  }
  function addClassHandle(prop) {
  // 组件返回的prop为-1代表点击了取消,不是-1的话就是我们输入框输入的值
    setFlag(false);
    if (prop == -1) {
      ToastAndroid.show('取消更改机构名称', 2000);
    } else {
      AsyncStorage.setItem('name', prop);
      ToastAndroid.show('机构名称更改成功', 2000);
    }
  }
  return (
    <View style={styles.container}>
      <TouchableOpacity onPress={updatetitle}>
        <Text style={styles.school}>{title}</Text>
      </TouchableOpacity>
      <AddClassName
        visible={flag}
        title={'修改机构名称'}
        optionClick={addClassHandle}
      />
    </View>
  );
}
const styles = StyleSheet.create({
  container: {
    flexDirection: 'row',
    justifyContent: 'space-between',
    alignItems: 'center',
  },
  school: {
    fontSize: 22,
    fontWeight: 'bold',
    color: '#333333',
  },
});

效果图 在这里插入图片描述