更改输入框值状态报错
Error in changing the value state of input box
当我尝试编辑其中的值时,我的输入框不可编辑。
我不确定是否正确使用我的 onChange 事件来更改输入值。
import React from "react";
import * as TodoActions from "../actions/TodoActions";
import TodoStore from "../stores/TodoStore";
export default class Todo extends React.Component {
constructor(props) {
super();
}
deleteTodo() {
TodoActions.deleteTodo(this.props.id);
}
toggleEdit() {
TodoActions.toggleEdit(this.props.id);
}
updateTodo() {
TodoActions.updateTodo(this.props.text);
}
toggleComplete() {
TodoActions.toggleComplete(this.props.id);
}
onChange(e) {
console.log('e.taget.value: '+ e.target.value);
this.setState({
value: e.target.value
});
console.log(value);
}
render() {
const buttonStyle = { margin: "5px" };
const { complete, edit, text, id } = this.props;
const icon = complete ? "\u2714" : "\u2716"
if (edit) {
return (
<li>
<form onSubmit={this.updateTodo.bind(this)}>
<input onChange={this.onChange.bind(this)} value={text} focus="focused"/>
<button onClick={this.toggleEdit.bind(this)} class="btn btn-default btn-sm" style={buttonStyle}>Cancel</button>
<button onClick={this.updateTodo.bind(this)} class="btn btn-success btn-sm" style={buttonStyle}>Update</button>
</form>
</li>
);
}
return (
<li>
<span>{text}</span>
<span onClick={this.toggleComplete.bind(this)} class="btn btn-default btn-xs" style={buttonStyle}>{icon}</span>
<button onClick={this.toggleEdit.bind(this)} class="btn btn-primary btn-sm" style={buttonStyle}>Edit</button>
<button onClick={this.deleteTodo.bind(this)} class="btn btn-danger btn-sm" style={buttonStyle}>Delete</button>
</li>
);
}
}
您的 <input/>
应该是受控组件,因为您正在使用 value
道具。
试试这个
<input onChange={this.onChange.bind(this)} value={this.state.value || text} focus="focused"/>
并为您的 constructor
添加一个空状态
constructor(props) {
super();
this.state = {}
}
如果你的text
属性没有设置,那么就作为null
传给input,相当于根本不传。在这种情况下,输入呈现为 uncontrolled 并且您无法通过 props 更改其值。
在这种情况下,最好的方法是为您的 属性 设置默认值,以确保它至少是一个空字符串:
Todo.defaultProps = {
text: ''
};
将此添加到末尾,您应该确保输入始终受控。
当我尝试编辑其中的值时,我的输入框不可编辑。
我不确定是否正确使用我的 onChange 事件来更改输入值。
import React from "react";
import * as TodoActions from "../actions/TodoActions";
import TodoStore from "../stores/TodoStore";
export default class Todo extends React.Component {
constructor(props) {
super();
}
deleteTodo() {
TodoActions.deleteTodo(this.props.id);
}
toggleEdit() {
TodoActions.toggleEdit(this.props.id);
}
updateTodo() {
TodoActions.updateTodo(this.props.text);
}
toggleComplete() {
TodoActions.toggleComplete(this.props.id);
}
onChange(e) {
console.log('e.taget.value: '+ e.target.value);
this.setState({
value: e.target.value
});
console.log(value);
}
render() {
const buttonStyle = { margin: "5px" };
const { complete, edit, text, id } = this.props;
const icon = complete ? "\u2714" : "\u2716"
if (edit) {
return (
<li>
<form onSubmit={this.updateTodo.bind(this)}>
<input onChange={this.onChange.bind(this)} value={text} focus="focused"/>
<button onClick={this.toggleEdit.bind(this)} class="btn btn-default btn-sm" style={buttonStyle}>Cancel</button>
<button onClick={this.updateTodo.bind(this)} class="btn btn-success btn-sm" style={buttonStyle}>Update</button>
</form>
</li>
);
}
return (
<li>
<span>{text}</span>
<span onClick={this.toggleComplete.bind(this)} class="btn btn-default btn-xs" style={buttonStyle}>{icon}</span>
<button onClick={this.toggleEdit.bind(this)} class="btn btn-primary btn-sm" style={buttonStyle}>Edit</button>
<button onClick={this.deleteTodo.bind(this)} class="btn btn-danger btn-sm" style={buttonStyle}>Delete</button>
</li>
);
}
}
您的 <input/>
应该是受控组件,因为您正在使用 value
道具。
试试这个
<input onChange={this.onChange.bind(this)} value={this.state.value || text} focus="focused"/>
并为您的 constructor
constructor(props) {
super();
this.state = {}
}
如果你的text
属性没有设置,那么就作为null
传给input,相当于根本不传。在这种情况下,输入呈现为 uncontrolled 并且您无法通过 props 更改其值。
在这种情况下,最好的方法是为您的 属性 设置默认值,以确保它至少是一个空字符串:
Todo.defaultProps = {
text: ''
};
将此添加到末尾,您应该确保输入始终受控。