[英]How to display the state on the same page when clicked Submit button in react
[英]Using React to create a form, how could I get my err message to display on Submit (when the submit button is clicked)?
我正在使用 React 創建一個包含兩個輸入文本的表單,並且希望每次用戶輸入非數字值作為年齡並單擊提交按鈕時顯示錯誤消息。 該表單顯然正在執行我想要的大部分操作,但沒有顯示錯誤消息。
注意:如果可能的話,我不希望在這里使用 alert() 語法。
謝謝你的幫助。
class MyForm extends React.Component { constructor(props) { super(props); this.state = { username: '', age: null, errormessage: '' }; } errorHandler = () => { let err = ''; if (nam === "age") { if (val !="" && !Number(val)) { err = <strong>Your age must be a number</strong>; } } this.setState({errormessage: err}); } myChangeHandler = (event) => { let nam = event.target.name; let val = event.target.value; this.setState({[nam]: val}); } render() { return ( <form onSubmit={this.errorHandler}> <h1>Hello {this.state.username} {this.state.age}</h1> <p>Enter your name:</p> <input type='text' name='username' onChange={this.myChangeHandler} /> <p>Enter your age:</p> <input type='text' name='age' onChange={this.myChangeHandler} /> <br/> <input type='submit' /> {this.state.errormessage} </form> ); } } ReactDOM.render(<MyForm />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div id="root"></div>
您可以在Age
字段下方顯示錯誤消息。 它是條件渲染。 僅當errormessage
包含某個值時errormessage
呈現它。
render() {
return (
<form onSubmit={this.errorHandler}>
<h1>Hello {this.state.username} {this.state.age}</h1>
<p>Enter your name:</p>
<input
type='text'
name='username'
onChange={this.myChangeHandler}
/>
<p>Enter your age:</p>
<input
type='text'
name='age'
onChange={this.myChangeHandler}
/>
<br/>
{this.state.errormessage ?
<div id="err">{this.state.errorMessage}</div>
: null}
<input
type='submit'
/>
{this.state.errormessage}
</form>
);
}
}
您可以通過檢查是否呈現id=err
div
來測試它。
在您的 errorHandler 中,您有兩個未定義的變量,nam 和 val,(nam === "age") 和 (val !="" && !Number(val))。 nam 和 val 變量僅在 myChangeHandler 方法的本地范圍內起作用。 我會將您的 onChange 處理程序分成兩個,如下所示以設置不同的輸入。 最后,您可以在狀態年齡上使用 Number() 將字符串轉換為數字,然后使用 if 語句使用 isNaN() 來查看年齡是否為數字。 當您嘗試在帶有字母的字符串值上使用 Number() 時,它將返回 Not a Number,因此您可以使用 isNaN() 進行檢查。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN
這是沙箱中的代碼: https : //codesandbox.io/s/stoic-brattain-doz7t
class MyForm extends React.Component {
constructor(props) {
super(props);
this.state = {
username: "",
age: null,
errormessage: ""
};
}
errorHandler = e => {
e.preventDefault();
let err = "";
let newAge = Number(this.state.age);
if (isNaN(newAge)) {
err = <strong>Your age must be a number</strong>;
}
this.setState({ errormessage: err });
};
handleUserName = event => {
this.setState({
username: event.target.value
});
};
handleMyAge = event => {
this.setState({
age: event.target.value
});
};
render() {
return (
<form onSubmit={this.errorHandler}>
<h1>
Hello {this.state.username} {this.state.age}
</h1>
<p>Enter your name:</p>
<input
type="text"
name="username"
defaultValue=""
onChange={this.handleUserName}
/>
<p>Enter your age:</p>
<input
type="text"
name="age"
defaultValue=""
onChange={this.handleMyAge}
/>
<br />
<input type="submit" />
{this.state.errormessage}
</form>
);
}
}
ReactDOM.render(<MyForm />, document.getElementById("root"));
您的 errorHander 方法有問題。 onChangeHandler() 中的 nam 和 val 變量正在使用let ,因此它僅具有局部作用域。 我會建議您在 errorHandler 中從您的狀態中獲取 nam 和 age。
import ReactDOM from 'react-dom';
import React, { Component } from 'react';
class MyForm extends React.Component {
constructor(props) {
super(props);
this.state = {
username: '',
age: null,
errormessage: ''
};
}
myChangeHandler = (event) => {
let nam = event.target.name;
let val = event.target.value;
this.setState({[nam]: val});
}
errorHandler = () => {
let err = '';
let val = this.state.age
if (val !="" && !Number(val)) {
err = <strong>Your age must be a number</strong>;
}
this.setState({errormessage: err});
}
render() {
return (
<form onSubmit={this.errorHandler}>
<h1>Hello {this.state.username} {this.state.age}</h1>
<p>Enter your name:</p>
<input
type='text'
name='username'
onChange={this.myChangeHandler}
/>
<p>Enter your age:</p>
<input
type='text'
name='age'
onChange={this.myChangeHandler}
/>
<br/>
<input
type='submit'
/>
{this.state.errormessage}
</form>
);
}
}
ReactDOM.render(<MyForm />, document.getElementById('root'));
我能夠優化@Springy 給出的答案以獲得下面的代碼。
謝謝@Springy
class MyForm extends React.Component { constructor(props) { super(props); this.state = { username: "", age: null, errormessage: "" }; } errorHandler = e => { e.preventDefault(); let err = ""; let newAge = Number(this.state.age); if (isNaN(newAge)) { err = <strong>Your age must be a number</strong>; } this.setState({ errormessage: err }); }; handleUserAgeName = event => { this.setState({ [event.target.name]:event.target.value }); }; render() { return ( <form onSubmit={this.errorHandler}> <h1> Hello {this.state.username} {this.state.age} </h1> <p>Enter your name:</p> <input type="text" name="username" defaultValue="" onChange={this.handleUserAgeName} /> <p>Enter your age:</p> <input type="text" name="age" defaultValue="" onChange={this.handleUserAgeName} /> <br /> <input type="submit" /> {this.state.errormessage} </form> ); } } ReactDOM.render(<MyForm />, document.getElementById("root"));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div id="root"></div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.