我需要定义一个 Package TextInput的组件,因为我的应用程序中有很多文本输入,我希望它们有一个垃圾桶图标来清除文本和一个通用的样式。
我的组件是这样的:
import React from 'react';
import {
TextInput,
TouchableOpacity,
StyleSheet,
View,
ReturnKeyTypeOptions,
Platform,
} from 'react-native';
import Numerics from '../constants/Numerics';
import { Ionicons } from '@expo/vector-icons';
import Colors from '../constants/Colors';
interface Props {
placeholder?: string;
iconName?: string;
returnKeyType?: ReturnKeyTypeOptions;
backgroundColor?: string;
margin?: number;
marginBottom?: number;
onTextChanged?(text: string): void;
onFinishedEditing?(text: string): void;
onClearTextInput?(): void;
}
const defaultProps: Props = {
backgroundColor: Colors.textInputBackgroundColor,
placeholder: '',
iconName: '',
returnKeyType: 'none',
margin: 0,
onTextChanged: (text) => {},
onFinishedEditing: (text) => {},
marginBottom: 0,
};
const CustomTextInput: React.FC<Props> = (props) => {
const [inputText, setInputText] = React.useState('');
const onCancelSearchHandler = () => {
setInputText('');
if (props.onTextChanged) {
props.onTextChanged('');
}
if (props.onClearTextInput) props.onClearTextInput();
};
let clearTextComponent = <View></View>;
if (inputText) {
clearTextComponent = (
<TouchableOpacity onPress={onCancelSearchHandler}>
<Ionicons
name='trash-outline'
color={Colors.greyColor}
size={Numerics.iconsSize}
/>
</TouchableOpacity>
);
}
return (
<View
style={[
styles.searchBarContainer,
{
backgroundColor: props.backgroundColor,
margin: props.margin,
marginBottom: props.marginBottom,
},
]}>
<Ionicons
name={props.iconName}
color={Colors.greyColor}
size={Numerics.iconsSize}
/>
<TextInput
style={styles.textInput}
keyboardType='default'
returnKeyType={props.returnKeyType}
value={inputText}
onChangeText={(text) => {
setInputText(text);
if (props.onTextChanged) {
props.onTextChanged(text);
}
}}
onEndEditing={(event) => {
if (props.onFinishedEditing) {
props.onFinishedEditing(event.nativeEvent.text);
}
}}
placeholder={props.placeholder}
autoCorrect={false}
/>
{clearTextComponent}
</View>
);
};
CustomTextInput.defaultProps = defaultProps;
const styles = StyleSheet.create({
searchBarContainer: {
flexDirection: 'row',
backgroundColor: Colors.textInputBackgroundColor,
borderRadius: 10,
height: 50,
padding: 5,
alignItems: 'center',
},
textInput: {
flex: 1,
marginLeft: 10,
},
});
export default CustomTextInput;
主要特点是:
- 在TextInput的左侧有一个可自定义的图标
- 在TextInput的右边有一个“清除文本”按钮图标,如果没有文本,它就会消失
- 文本编辑结束时触发的处理程序
CustomTextInput
有自己的状态来使明文按钮工作
一切正常,但我真的不知道如何才能从外部清除文本 *!考虑到我在应用程序页面中使用CustomTextInput
,当应用程序导航到另一个页面时,我想清除我的CustomTextInput
。
你会怎么做?
3条答案
按热度按时间mqxuamgl1#
理想方案
inputText
将是一个prop,而不是本地状态,onTextChanged
prop将处理父组件中某个位置的inputText
的更改。备选方案:
useImperativeHandle钩子:
然后在父组件中:
q8l4jmvw2#
如果你想在应用程序导航到另一个页面时清除
CustomTextInput
控件,那么你可以使用useEffect
钩子return
块(类似于componentwillunmount)。mzaanser3#
您可以在
CustomTextInput
中使用useEffect
钩子,并在清除过程被卸载之前触发它(在您的情况下,当您导航到另一个页面时)。