質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

702閲覧

Reactでセレクトボックスの挿入方法がわかりません。

Chibichan

総合スコア72

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/05/16 17:34

編集2021/05/17 04:57

下記のコードにセレクトボックスを加え、1~3を選択できるようにして、選択した数字をSumの式に掛けたいです。セレクトボックスのコードは、見つけましたが、どうやってつなげればいいかわかりません。
よろしくお願いします。

import React from 'react'; class Calc extends React.Component{ box = { display: "flex", alignItems: "center", marginBottom: "50px" } input = { fontSize: "20px", width: "60px", margin: "0 10px 00" } label = { fontSize: "20px", margin: "0 10px 0 0" } constructor(props){ super(props); this.state = { val_left: "", val_right: "", val_sum:0 } this.doChangeLeft = this.doChangeLeft.bind(this); this.doChangeRight = this.doChangeRight.bind(this); } doChangeLeft(e){ let sum if(this.props.val == "Total"){ sum = Number(e.target.value) / Number(this.state.val_right); } this.setState({ val_left:e.target.value, val_sum:sum }) } doChangeRight(e){ let sum if(this.props.val =="Total"){ sum = Number(this.state.val_left) / Number(e.target.value); } this.setState({ val_right:e.target.value, val_sum:sum }) } render(){ return( <div style={this.box}> <p style={this.label}>Square meters</p> <input type="text" onChange={this.doChangeLeft} value={this.state.val_left} style={this.input} /> <p style={this.label}>Paint adequacy(m2/l)</p> <input type="text" onChange={this.doChangeRight} value={this.state.val_right} style={this.input} /> <p style={this.label}>{this.props.val}</p> <p style={this.label}>{this.state.val_sum}</p> <p style={this.label}>Cans</p> </div> ) } } export default Calc;
class Layer extends React.Component { constructor(props) { super(props); this.state = {value: 'coconut'}; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } handleSubmit(event) { alert('Your favorite flavor is: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> Choose how many times you want to paint: <select value={this.state.value} onChange={this.handleChange}> <option value="grapefruit">1</option> <option value="lime">2</option> <option value="coconut">3t</option> </select> </label> <input type="submit" value="Submit" /> </form> ); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coolwind0202

2021/05/16 23:06

見つけたセレクトボックスのコードも提示してください。
Chibichan

2021/05/17 04:58

見つけましたコードを追加しました。 よろしくお願いします。
FKM

2021/05/17 08:05

そのままコピペだけのようですね…。あちこちにテンプレートの分離の方法とデータのやりとりの方法が載っているので、参考にしたらどうでしょうか。 参考までに、Reactは子コンポーネントから親コンポーネントへの値の受け渡しはできません。
guest

回答1

0

ベストアンサー

Square metersPaint adequacy と同じように、フォームの value を Calc コンポーネントの State で管理し、変更があればその State を書き換えれば良いと思います:

React

1import React from 'react'; 2 3class Calc extends React.Component{ 4 box = { 5 display: "flex", 6 alignItems: "center", 7 marginBottom: "50px" 8 } 9 input = { 10 fontSize: "20px", 11 width: "60px", 12 margin: "0 10px 00" 13 } 14 label = { 15 fontSize: "20px", 16 margin: "0 10px 0 0" 17 } 18 constructor(props){ 19 super(props); 20 this.state = { 21 val_left: "", 22 val_right: "", 23 val_sum:0, 24 selectValue: 1 25 } 26 this.doChangeLeft = this.doChangeLeft.bind(this); 27 this.doChangeRight = this.doChangeRight.bind(this); 28 this.handleSelectChange = this.handleSelectChange.bind(this); 29 this.handleSubmit = this.handleSubmit.bind(this); 30 } 31 32 handleSelectChange(event) { 33 let valueNumber = Number(event.target.value); 34 35 if (!Number.isNaN(valueNumber)) { 36 let sum; 37 if(this.props.val == "Total"){ 38 sum = Number(this.state.val_left) / Number(this.state.val_right) * valueNumber; 39 } 40 this.setState({ 41 selectValue: valueNumber, 42 val_sum: sum 43 }); 44 } 45 } 46 47 48 doChangeLeft(e){ 49 let sum 50 if(this.props.val == "Total"){ 51 sum = Number(e.target.value) / Number(this.state.val_right) * this.state.selectValue; 52 } 53 this.setState({ 54 val_left:e.target.value, 55 val_sum:sum 56 }) 57 58 } 59 doChangeRight(e){ 60 let sum 61 if(this.props.val =="Total"){ 62 sum = Number(this.state.val_left) / Number(e.target.value) * this.state.selectValue; 63 } 64 this.setState({ 65 val_right:e.target.value, 66 val_sum:sum 67 }) 68 } 69 render(){ 70 return ( 71 <div style={this.box}> 72 <p style={this.label}>Square meters</p> 73 <input type="text" onChange={this.doChangeLeft} value={this.state.val_left} style={this.input} /> 74 <p style={this.label}>Paint adequacy(m2/l)</p> 75 <input type="text" onChange={this.doChangeRight} value={this.state.val_right} style={this.input} /> 76 <p style={this.label}>{this.props.val}</p> 77 <p style={this.label}>{this.state.val_sum}</p> 78 <p style={this.label}>Cans</p> 79 <label> 80 Choose how many times you want to paint: 81 <select value={this.state.selectValue} onChange={this.handleSelectChange}> 82 <option value="1">1</option> 83 <option value="2">2</option> 84 <option value="3">3t</option> 85 </select> 86 </label> 87 </div> 88 ) 89 } 90} 91 92export default Calc;

投稿2021/05/17 08:09

編集2021/05/17 09:15
coolwind0202

総合スコア708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chibichan

2021/05/17 09:03

ありがとうございます!習い始めたばかりなので、まだまだですが、ご提案を参考に勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問