私はプログラミングに不慣れで、Reactを学びたいと思っています。現在、状態の概念は私には非常に混乱しています。以下のコードでは、ユーザーに1番を入力し、その番号を保存してから2番を入力し、その番号も保存して、最後に合計を表示するように求めるこの単純なアプリを作成しようとしています。入力フィールドに入力できる数字は1つだけです。入力フィールドに値として何を入力すればよいかわかりません。
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
class Random extends Component {
state = {
numberOne: '',
numberTwo: '',
message: 'Enter number One',
showTotal: ''
};
AddNumbersInTheTextField_one = event => {
this.setState({
numberOne: parseInt(event.target.value)
});
};
AddNumbersInTheTextField_two = event => {
this.setState({
numberTwo: parseInt(event.target.value)
});
};
HandleSaveButton = () => {
this.setState(
{
numberOne: this.state.numberOne,
numberTwo: this.state.numberTwo
},
function() {
this.setState({
numberOne: '',
message: 'Enter number two'
});
}
);
};
HandleShowTotalButton = () => {
this.setState({
showTotal: this.state.numberOne + this.state.numberTwo,
message: this.state.showTotal
});
};
render() {
return (
<div>
<h1>{this.state.message}</h1>
<div>
<input
value={this.state.numberOne}
onChange={this.AddNumbersInTheTextField_one}
/>
</div>
<div>
<button onClick={this.HandleSaveButton}>Save Number</button>
<button onClick={this.HandleShowTotalButton}>Show Total</button>
<div>{this.state.showTotal}</div>
</div>
</div>
);
}
}
ReactDOM.render(<Random />, document.getElementById('root'));
問題はここにあります:
HandleSaveButton = () => {
this.setState(
{
// there is no need to set these values because we already have them in state
numberOne: this.state.numberOne,
numberTwo: this.state.numberTwo
},
function() {
this.setState({
// you're setting your numberOne value to ''
numberOne: '',
message: 'Enter number two'
});
}
);
};
入力変更関数をユニバーサルにし、入力の名前属性に値を割り当てることで、コードを少し乾かすことができます。次に、状態のアクティブフィールドに応じて、handleSaveを動的にすることで、コードを単純化します。
state = {
activeField: 'fieldOne',
fieldOne: '',
fieldTwo: '',
total: '',
message: '',
}
// this will update any shallow inputs in state
handleInputChange(e) {
const { target: { name, value } } = e;
this.setState({ [name]: value });
}
handleSave(e) {
const { activeField, fieldOne, fieldTwo } = this.state;
if (activeField == 'fieldOne') {
this.setState({
activeField: 'fieldTwo',
message: 'Enter number two.'
});
} else if (activeField == 'fieldTwo') {
// here we basically cut out the logic you have in HandleShowTotalButton,
// you may show total to handle a boolean value instead and conditionally
// render the total value after the user clicks it
this.setState({ total: fieldOne + fieldTwo });
}
}
// below is just an example of what your input should look like not the literal jsx you'll be using
render() {
// we use the activeField as a key in state to obtain our activeValue
const { activeField } = this.state;
const activeValue = this.state[activeField];
return (
// your inputs could look like this with a dynamic name and value
<input name={activeField} value={activeValue} onChange={this.handleInputChange} />
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加