import React, { JSXElementConstructor, ReactElement, useEffect, useRef, useState, } from 'react'; import { ScrollView, StyleProp, StyleSheet, Text, TextStyle, TouchableOpacity, View, ViewStyle, } from 'react-native'; export interface CounterProps { style?: StyleProp; renderMinusButton?: ReactElement>; renderAddButton?: ReactElement>; value: number; valueContentStyle?: StyleProp; valueFontStyle?: StyleProp; onMinusPress?: () => void; onAddPress?: () => void; range?: {max: number; min: number}; } const Counter: React.FC = props => { const counter = useRef(); const [index, setIndex] = useState(0); /** 默认自定义按钮 */ const renderButton = (t: string, opacity: number) => { return ( {t} ); }; const { style, renderAddButton = renderButton('+', index >= 999 ? 0.28 : 1), renderMinusButton = renderButton('-', index <= 1 ? 0.28 : 1), value = 1, valueContentStyle = {}, valueFontStyle = {}, onAddPress, onMinusPress, range = {max: 99, min: 1}, } = props; // @ts-ignore const {height = 32, width = 32} = valueContentStyle; useEffect(() => { setIndex(value); counter.current?.scrollTo({y: (value - 1) * height, animated: true}); return function () {}; }, [value]); const zoomOutPress = { top: 16, bottom: 16, left: 16, right: 16, }; return ( {renderMinusButton} (counter.current = ref)} showsVerticalScrollIndicator={false} scrollEnabled={false} bounces={false}> {Array.from({length: range.max - range.min + 1}, (_, i) => ( {range.min + i} ))} {renderAddButton} ); }; const styles = StyleSheet.create({ view: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', }, viewButton: {}, textValue: { fontSize: 20, color: '#333', }, viewValueContent: { height: 32, justifyContent: 'center', alignItems: 'center', }, }); export default Counter;