LoginSignup
0
0

More than 3 years have passed since last update.

React - 2つのテキストボックスの入力を相互に反映する

Last updated at Posted at 2020-11-23

概要

公式サイトにすでに解説がありますが、そこ扱われているサンプルソースがやや煩雑に感じました。なので、キーとなるポイントを抽出、分かりやすく短いソースで書いてみました。

この記事のサンプルソース概要

  • テキストボックスが2つあり、税抜きと税込みの価格を表示します。
  • いずれのテキストボックスも入力可能で、数字をタイプすると即時反映します。 (税抜きのテキストボックスに入力すると税込みのテキストボックスに即反映される。逆も同様。)
  • 同じコンポーネント(MyForm)を2つ配置してあり、入力値が他のテキストボックスに干渉しないことを確認できる。

作動イメージ
0001.gif

ソースコード

index.html
<!DOCTYPE html>
<html><head>
  <meta charset="UTF-8" />
</head>
<body>
  <div id="root"></div>
  <!-- Load React. -->
  <!-- Note: when deploying, replace "development.js" with "production.min.js". -->
  <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
  <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
  <script src="script.js"></script>
</body>
</html>
script.js
// 軽減税率(8%)
const taxrate = 0.08;

// テキストボックス
class MyInput extends React.Component {
    constructor(props) {
        super(props);
    }

    onChange(e) {
        // MyInputコンポーネントを配置したときの onValChange={...} に指定したメソッドがここで呼ばれる。
        this.props.onValChange(e.target.value);
    }
    render() {
        const value = this.props.value;
        return (
            <input
                type="text"
                value={value}
                onChange={(e) => this.onChange(e)}
            />);
    }
}

// 価格比較フォーム
class MyForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            value1: 0,
            value2: 0
        };
    }

    handleChange1(val) {
        this.setState({
            value1: val,
            value2: val * (1 + taxrate)
        });
    }

    handleChange2(val) {
        this.setState({
            value1: val / (1 + taxrate),
            value2: val
        });
    }

    render() {
        return (
            <div>
                税抜き
                <MyInput
                    name="taxout"
                    value={this.state.value1}
                    onValChange={(e) => this.handleChange1(e)} /><br />
                税込み
                <MyInput
                    name="taxin"
                    value={this.state.value2}
                    onValChange={(e) => this.handleChange2(e)} />(軽減税率)
            </div>
        );
    }
}

// 画面に表示
ReactDOM.render(
    <div>
        フォーム1
        <MyForm name="form1" /><br />
        フォーム2
        <MyForm name="form2" /><br />
    </div>,
    document.getElementById('root')
);
0
0
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
0
0