상태 변수

상태변수란, 그 Text에 바인딩되는 변수 변수를 ‘’ 로 설정하면, 계속 빈값으로 됨.

useState를 쓴 값에 change이벤트를 걸어주어 연결시켜줘야 한다.

아래와 같음

변수 생성

const [email, setEmail] = useState('');
const [password, setPassword] = useState('');

value, onChageText 이벤트 연결

<Input
	value={email}
	onChangeText={text => setEmail(text.trim())}
	title={'email'}
	placeholder={'your@email.com'}
	keyboardType={KeyboardTypes.EMAIL}
	returnkeyType={ReturnkeyTypes.NEXT}
></Input>
<TextInput
	value={value}
	onChangeText={onChangeText}
	...
></TextInput>

위와 같이 작업해주면 연결됨.

isFocused, isValue

focus되었을 때와 값이 있을 때, 색상 설정

먼저 색상 설정 js 파일

export const WHITE = '#ffffff';
export const BLACK = '#000000';
export const PRIMARY = {
	DEFAULT: '#2563eb',
};

export const GRAY = {
	DEFAULT: '#a3a3a3',
};

input.js 에서 다음과 같이 사용한다.

import { TextInput, Text, View, StyleSheet } from 'react-native';
import PropTypes from 'prop-types';
import { BLACK, GRAY, PRIMARY } from '../colors';
import { useState } from 'react';

export const KeyboardTypes = {
	DEFAULT: 'default',
	EMAIL: 'email-address',
};

export const ReturnkeyTypes = {
	DONE: 'done',
	NEXT: 'next',
};

const Input = ({
	title,
	placeholder,
	value,
	onChangeText,
	keyboardType,
	returnkeyType,
	secureTextEntry,
}) => {
	const [isFocued, setIsFocused] = useState(false);
	return (
		<View style={styles.container}>
			<Text
				style={[
					styles.title,
					value && styles.hasValueTitle,
					isFocued && styles.focusedTitle,
				]}
			>
				{title}
			</Text>
			<TextInput
				value={value}
				onChangeText={onChangeText}
				style={[styles.input, isFocued && styles.focusedTitle]}
				placeholder={placeholder ?? title}
				placeholderTextColor={GRAY.DEFAULT}
				autoCapitalize="none"
				autoCorrect={false}
				keyboardType={keyboardType}
				returnKeyType={returnkeyType}
				textContentType="none"
				secureTextEntry={secureTextEntry}
				onBlur={() => setIsFocused(false)}
				onFocus={() => setIsFocused(true)}
			></TextInput>
		</View>
	);
};

Input.propTypes = {
	title: PropTypes.string,
	placeholder: PropTypes.string,
	value: PropTypes.string,
	keyboardType: PropTypes.oneOf(Object.values(KeyboardTypes)),
	returnKeyType: PropTypes.oneOf(Object.values(ReturnkeyTypes)),
	secureTextEntry: PropTypes.bool,
};

const styles = StyleSheet.create({
	container: {
		width: '100%',
		paddingHorizontal: 20,
		marginVertical: 10,
	},
	title: {
		color: GRAY.DEFAULT,
		marginBottom: 4,
	},
	focusedTitle: {
		color: PRIMARY.DEFAULT,
		borderColor: PRIMARY.DEFAULT,
		marginBottom: 4,
	},
	hasValueTitle: {
		color: BLACK,
		fontWeight: 600,
	},
	input: {
		borderWidth: 1,
		borderRadius: 8,
		borderColor: GRAY.DEFAULT,
		paddingHorizontal: 20,
		height: 42,
	},
	hasValueInput: {
		borderColor: BLACK,
		color: BLACK,
	},
});

export default Input;