react-native的输入框踩坑记录

<TextInput
     placeholder={'请输入'}
     placeholderTextColor={'#5E6266'}
     value={currentInputValue}
     onChangeText={handleTextChange}
     style={styles.input}
     multiline={true}//多行和单行的切换
     returnKeyType="done"//键盘上的完成按钮
     keyboardType="default"//键盘的类型
     autoCapitalize="none"// 自动切换大写键盘
     selectionColor={'#74FF52'}// 光标颜色
     maxLength={maxLength}// 最大长度
     blurOnSubmit={true}// 点击完成按钮失去焦点(加这个是因为点键盘的按钮会自动换行- -)
     onSubmitEditing={Keyboard.dismiss}// 点击完成按钮后收起键盘
     clearButtonMode="while-editing" // iOS清除按钮 
 />

键盘出来页面要向上弹起,具体实现思路:
监听键盘出现的时候给父级容器增加marginBotttom=键盘高度
安卓用了客户端返回的键盘高度
这里还遇到了安卓键盘输入一段话点文字的时候乱跑的问题(也是安卓这边单独出了一个bridge去限制)

获取键盘出现隐藏和获取键盘高度
import { useEffect, useState } from 'react';
import { Dimensions, Keyboard, NativeModules, Platform } from 'react-native';

interface KeyboardInfo {
    keyboardHeight: number;
    keyboardVisible: boolean;
    animationDuration: number;
}

export const useKeyboard = () => {
    const [keyboardInfo, setKeyboardInfo] = useState<KeyboardInfo>({
        keyboardHeight: 0,
        keyboardVisible: false,
        animationDuration: 250,
    });

    useEffect(() => {
        const handleKeyboardShow = (e: any) => {
            let height = 0;

            if (Platform.OS === 'ios') {
                height = e?.endCoordinates?.height || 0;
            } else {
                height =
                    NativeModules.KSRCTBridge.getKeyboardHeight() /
                    Dimensions.get('screen').scale;
            }
            setKeyboardInfo({
                keyboardHeight: height,
                keyboardVisible: true,
                animationDuration:
                    Platform.OS === 'ios' ? e?.duration || 250 : 250,
            });
        };

        const handleKeyboardHide = (e: any) => {
            setKeyboardInfo({
                keyboardHeight: 0,
                keyboardVisible: false,
                animationDuration:
                    Platform.OS === 'ios' ? e?.duration || 250 : 250,
            });
        };

        const showListener =
            Platform.OS === 'ios'
                ? Keyboard.addListener('keyboardWillShow', handleKeyboardShow)
                : Keyboard.addListener('keyboardDidShow', handleKeyboardShow);

        const hideListener =
            Platform.OS === 'ios'
                ? Keyboard.addListener('keyboardWillHide', handleKeyboardHide)
                : Keyboard.addListener('keyboardDidHide', handleKeyboardHide);

        return () => {
            showListener.remove();
            hideListener.remove();
        };
    }, []);

    return {
        ...keyboardInfo,
        dismissKeyboard: Keyboard.dismiss,
    };
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值