LoginSignup
17
18

More than 5 years have passed since last update.

ReactでinputのvalueをonBlurでsetStateすると値が変更できない

Last updated at Posted at 2016-05-21

Reactでフォーム作っていた時にハマったところの比較

onChangeのみ

value変更可 [state無 value無 setState無]

var Input = React.createClass({
    onChange: function (e) {
        console.log("できらぁ!")
    },
    render: function () {
        return <input type="text" onChange={this.onChange} />
    }
});

value変更不可 [state無 value有 setState無]

var Input = React.createClass({
    onChange: function (e) {
        console.log("できねえ!")
    },
    render: function () {
        return <input type="text" onChange={this.onChange} value="初期値" />
    }
});

value変更不可 [state有 value有 setState無]

var Input = React.createClass({
    getInitialState() {
        return {
            textValue: "initial value"
        };
    },
    onChange: function (e) {
        console.log("できねえ!")
    },
    render: function () {
        return <input type="text" onChange={this.onChange} value={this.state.textValue}/>
    }
});

value変更可 [state有 value有 setState有]

var Input = React.createClass({
    getInitialState() {
        return {
            textValue: "initial value"
        };
    },
    onChange: function (e) {
        console.log("できらぁ!")
        this.setState({textValue: e.target.value});
    },
    render: function () {
        return <input type="text" onChange={this.onChange} value={this.state.textValue}/>
    }
});

onChangeとonBlur

value変更可 [onChangeでsetState]


var Input = React.createClass({
    getInitialState() {
        return {
            textValue: "initial value"
        };
    },
    onChange: function (e) {
        console.log("できらぁ!")
        this.setState({textValue: e.target.value});
    },
    onBlur: function (e) {

    },
    render: function () {
        return <input type="text" onChange={this.onChange} onBlur={this.onBlur} value={this.state.textValue}/>
    }
});

value変更不可 [onBlurでsetState]

var Input = React.createClass({
    getInitialState() {
        return {
            textValue: "initial value"
        };
    },
    onChange: function (e) {

    },
    onBlur: function (e) {
        console.log("できねえ!")
        this.setState({textValue: e.target.value});
    },
    render: function () {
        return <input type="text" onChange={this.onChange} onBlur={this.onBlur} value={this.state.textValue}/>
    }
});

value変更可 [onChangeとonBlurでsetState]

var Input = React.createClass({
    getInitialState() {
        return {
            textValue: "initial value"
        };
    },
    onChange: function (e) {
        console.log("できらぁ!")
        this.setState({textValue: e.target.value});
    },
    onBlur: function (e) {
        console.log("できらぁ!")
        this.setState({textValue: e.target.value});
    },
    render: function () {
        return <input type="text" onChange={this.onChange}  value={this.state.textValue} onBlur={this.onBlur}/>

    }
});

結論

下記の参考記事の通り、inputのvalueはonChangeイベントでしか管理できなかった。
onBlurなどで値の更新を通知したい時は、onChangeで更新されたstateを他のイベントで通知する必要がある。

value値をStateで管理しつつ、onChangeで明示的にsetStateして更新してあげる必要があります。
引用元:React.jsでFormを扱う

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18