Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

React + TypeScriptで入力値チェック

$
0
0

入力値チェックしたかったら、こんな感じのを用意するのかなというのを作ってみました。 業務で使うなら、もうちょっと汎用性減らして数字用とか○○コード用とかっていう風に作ってもいいのかもね。

interface InputTextBoxProps extends React.Props<{}> {
    label: string;
    required?: boolean;
    regex?: RegExp;
    validationMessage?: string,
    initialValue?: string;
    onChange?: (value: string, valid: boolean) => void;
    errorStyle?: React.CSSProperties;
}interface InputTextBoxState {
    value: string;
    valid: boolean;
}class InputTextBox extends React.Component<InputTextBoxProps, InputTextBoxState> {static defaultProps = {
        required: false,
        initialValue: '',
        validationMessage: ''};

    constructor(props: InputTextBoxProps) {super(props);

        this.state = {
            value: this.props.initialValue,
            valid: this.validate(this.props.initialValue)
        } as InputTextBoxState;
    }private handleChange(e: React.FormEvent) {var value = (e.target as HTMLInputElement).value;
        var validate = this.validate(value);
        this.setState({ 
            value: value,
            valid: validate
        });
        if (this.props.onChange) {this.props.onChange(value, validate);
        }}private validate(value: string) {if (this.props.required && !value) {returnfalse;
        }if (this.props.regex) {returnthis.props.regex.test(value);
        }returntrue;
    }

    render() {var validationMessage = this.state.valid ? null : <span>{this.props.validationMessage}</span>;
        return (
            <div>
                <label>{this.props.label}</label>
                <input type='text' value={this.state.value} onChange={this.handleChange.bind(this) } style={this.state.valid ? null : this.props.errorStyle} />
                {validationMessage}</div>
        );
    }}

単純に変更通知のonChangeで値のチェックしてるだけです。必須入力と正規表現での入力チェックに対応しています。 因みに実行してみるとこんな雰囲気になります。

class App extends React.Component<{}, {}> {
    render() {return (
            <InputTextBox label='test' required={true} errorStyle={{ border: '1px solid red'}} regex={/^[0-9]+$/} validationMessage='Error!'/>
        );
    }}

ReactDOM.render(
    <App />,
    document.getElementById('content'));

f:id:okazuki:20160103213856p:plain

f:id:okazuki:20160103213903p:plain


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>