次のようにredux-formフィールドでカスタムコンポーネントを使用しています。
<Field name="height" parse={value => Number(value)} component={NumberInput} />
カスタムコンポーネントはReact NativeのTextInputコンポーネントを使用し、次のようになります。
import React from 'react';
import PropTypes from 'prop-types';
import { View, Text, TextInput, StyleSheet } from 'react-native';
import { COLOR_PRIMARY } from '../constants';
const styles = StyleSheet.create({
inputStyle: {
height: 30,
width: 50,
marginBottom: 10,
borderColor: COLOR_PRIMARY,
borderWidth: 2,
textAlign: 'center',
},
errorStyle: {
color: COLOR_PRIMARY,
},
});
const NumberInput = (props) => {
const { input: { value, onChange }, meta: { touched, error } } = props;
return (
<View>
<TextInput
keyboardType="numeric"
returnKeyType="go"
maxLength={3}
style={styles.inputStyle}
value={value}
onChangeText={onChange}
/>
{touched &&
(error && (
<View>
<Text style={styles.errorStyle}>{error}</Text>
</View>
))}
</View>
);
};
NumberInput.propTypes = {
meta: PropTypes.shape({
touched: PropTypes.bool.isRequired,
error: PropTypes.string,
}).isRequired,
input: PropTypes.shape({
// value: PropTypes.any.isRequired,
onChange: PropTypes.func.isRequired,
}).isRequired,
};
export default NumberInput;
高さフィールドに入力した値を、文字列型ではなく数値として保存したい。したがって、フィールドで確認できるように、文字列を数値に変換するために解析を使用しています。
私はこれを行うことができますが、次のイエローボックスの警告が表示され続けます。
Invalid prop 'value' of type 'number' supplied to 'TextInput', expected 'string'
値PropTypeをany、string、number、またはoneOfTypeの文字列または数値に設定しようとしましたが、何も機能していないようです。また、type = "text"と同様に、FieldおよびTextInputでtype = "number"を設定しようとしました。
助けていただければ幸いです...
基本的に、小道具ではvalueの数値を渡します。文字列の形式で渡す必要があります。次のようにコードを編集できます。
<TextInput
keyboardType="numeric"
returnKeyType="go"
maxLength={3}
style={styles.inputStyle}
value={`${value}`} //here
onChangeText={onChange}
/>
この方法はよりきれいでなければなりません:
<TextInput
value={yourValue ? String(yourValue) : null}
...
/>
これはもっときれいになると思います。
<TextInput
value={yourValue && String(yourValue)}
...
/>