반응 입력 요소: 값과 기본값
구성요소 내에서 입력 요소를 렌더링할 때 요소 "값"을 설정하면 읽기 전용이 되지만 "기본값"으로 값을 설정하면 상태를 다시 업데이트할 때 다시 업데이트되지 않습니다.
제 코드는 다음과 같습니다.
import React from "react";
export default class EditForm extends React.Component {
editTransaction(event) {
var transaction = this.props.transaction;
event.preventDefault();
var NewTransaction = {
transactions_data: {
amount: this.refs.amount.value
}
}
this.props.editTransaction(NewTransaction, transaction.id);
}
closeForm() {
this.props.closeForm();
}
render() {
var {amount}=this.props.transaction;
return (
<div>
<br/>
<h4>Edit Transaction</h4>
<div className="btn btn-danger pull-right" onClick={this.closeForm.bind(this)}>close</div>
<div className="clearfix"></div>
<form onSubmit={this.editTransaction.bind(this)}>
<div>
<label for="amount">Amount</label>
<input value={amount} onChange={(value) => this.onChange(value)} className="form-control"
id="amount" name="amount" type="number"
ref="amount"/>
</div>
<br/>
<br/>
<input className="btn btn-info" type="submit" value="submit"/>
</form>
</div>
);
}
}
그리고 제가 실수를 했는지 알아냈어요.onChange={(value) => this.onChange(value)}
입력 요소에서는 정상적으로 동작합니다(소품이나 상태가 업데이트되고 값을 다시 입력할 수 있습니다). 하지만 브라우저 콘솔에 오류가 발생하기 때문에 적절한 해결책은 아니라고 생각합니다."this.onChange" 함수가 존재하지 않기 때문입니다.
이 문제는 어떻게 해결할 수 있을까요?
입력이 작동하지 않는 이유는define
그onChange
실제로 존재하는 기능sets the state
갱신된 값으로 설정합니다.다음과 같은 설명만 있으면 되기 때문에 아마 인라인으로 할 수 있을 것입니다.
<input type="text" value={this.state.inputVal} onChange={(e) => {this.setState({inputVal: e.target.value})}} />
단, 이 기능을 사용하는 것이 좋습니다.onChange
여러 입력을 동시에 처리할 수 있고 깔끔해 보이는 방법
class EditForm extends React.Component {
constructor() {
super();
this.state = {
}
}
onChange(e) {
this.setState({[e.target.name]: e.target.value})
}
editTransaction(event) {
var transaction = this.props.transaction;
event.preventDefault();
var NewTransaction = {
transactions_data: {
amount: this.refs.amount.value
}
}
this.props.editTransaction(NewTransaction, transaction.id);
}
closeForm() {
this.props.closeForm();
}
render() {
return (
<div>
<br/>
<h4>Edit Transaction</h4>
<div className="btn btn-danger pull-right" onClick={this.closeForm.bind(this)}>close</div>
<div className="clearfix"></div>
<form onSubmit={this.editTransaction.bind(this)}>
<div>
<label for="amount">Amount</label>
<input value={this.state.amount} onChange={(value) => this.onChange(value)} className="form-control"
id="amount" name="amount" type="number"
ref="amount"/>
<input value={this.state.amount1} onChange={(value) => this.onChange(value)} className="form-control"
id="amount1" name="amount1" type="number"
ref="amount"/>
</div>
<br/>
<br/>
<input className="btn btn-info" type="submit" value="submit"/>
</form>
</div>
);
}
}
ReactDOM.render(<EditForm/>, document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.2/react-dom.min.js"></script>
<div id="app"></div>
redex를 사용하는 경우 reducer를 통해 컴포넌트 상태를 업데이트하는 작업이 될 수 있는 onChange 메서드를 정의해야 합니다.es6에서 간단한 상태를 사용하는 보다 쉬운 방법은 다음과 같습니다.게다가 입력 필드의 값은, 다음의 방법으로 얻을 수 있습니다.ref
Facebook에 의해 좌절되고 있습니다.이 경우 컴포넌트를 제어하려고 하기 때문에 에러가 발생합니다.
자세한 내용을 참조할 수 있도록 폼 설명서에 대한 링크입니다.
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = ({
inputVal: '',
});
}
onChange = (e) => {
this.setState({ [e.target.name]: e.target.value });
}
handleSubmit = (event) => {
event.preventDefault();
console.log(this.state.inputVal);
}
render() {
return (
<div>
<input type="text" value={this.state.inputVal} onChange={this.onChange} />
</div>
);
}
}
이걸 만지작거리다가 정말 간단한 해결책을 찾았어요.
class App extends Component {
constructor(props) {
super(props)
this.enterText = this.enterText.bind(this)
this.state = {
userNameText: 'user name',
pswdText: 'pswd',
textEntry: false
}
}
async enterText() {
if (!this.state.textEntry) {
await this.clearText()
this.setState({textEntry: true})
}
}
clearText() {
this.setState({
userNameText: '',
pswdText: ''
})
}
render() {
return (
<div className="App">
<div className="App-header">
<h1 className="App-title">
Welcome
</h1>
</div>
<div className="login-fields">
<LoginFields userNameText={this.state.userNameText} pswdText={this.state.pswdText} onFocus={this.enterText} />
</div>
</div>
)
}
}
따라서 첫 번째 렌더링() 시 필드 상태는 생성자에 하드 코딩된 것입니다.사용자가 이름 또는 pswd 상자 중 하나를 클릭하면(이러한 상자를 쉽게 분리할 수 있음), 둘 다 clearText()로 클리어되고 둘 다 allowText()로 null로 설정됩니다.null로 설정하면 사용자 입력 텍스트가 허용됩니다.
LoginFields 컴포넌트의 입력에 다음이 포함되어 있는지 확인합니다.
onFocus={this.props.onFocus}
React에서 입력에 값을 설정하면 값은 변경되지 않습니다(onChange 핸들러를 지정하지 않는 한).
<input type="text" name="address" value="Europe" />
이 요소의 최종 결과는 변경할 수 없는 Europe 값을 가진 텍스트 상자이므로 사실상 읽기 전용 텍스트 상자입니다.
대신 입력 필드에 기본값을 지정하는 경우 다음과 같이 defaultValue 속성을 사용해야 합니다.
<input type="text" name="address" defaultValue="Europe" />
따라서 값 속성을 defaultValue로 바꿉니다.
언급URL : https://stackoverflow.com/questions/42807901/react-input-element-value-vs-default-value
'programing' 카테고리의 다른 글
스프링 부트 1.2.3의 경우 JSON 시리얼라이제이션에서 ignore null 값을 설정하려면 어떻게 해야 합니까? (0) | 2023.03.02 |
---|---|
Retrofit 2.0은 Json이 올바른 것처럼 보이는 동안 MalformedJsonException을 얻습니까? (0) | 2023.03.02 |
알려진 필드와 알 수 없는 필드로 json 직렬화 해제 (0) | 2023.03.02 |
Oracle: 테이블이 존재하는 경우 (0) | 2023.03.02 |
JSON 오브젝트 내의 JSON 어레이 해석 (0) | 2023.03.02 |