e.preventDefault(), прикрепленный к форме, не работает, и когда я нажимаю кнопку «Сохранить», страница перезагружается при отправке.
У меня есть отдельный компонент формы, который отлично работает, но я не могу исправить этот.
Что я делаю неправильно? Любая помощь приветствуется.
Мой код ниже
ТИА
class Todo extends Component {
constructor(props){
super(props);
this.state = { isEditing: false, task: this.props.task }
this.handleRemove = this.handleRemove.bind(this);
this.toggleEdit = this.toggleEdit.bind(this);
this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleChangeEvent.bind(this);
}
handleRemove () {
this.props.removeTodo(this.props.id)
};
toggleEdit () {
this.setState ({
isEditing: !this.state.isEditing
});
}
handleChangeEvent(e) {
this.setState({
[e.target.name]: e.target.value
});
}
handleSubmit(e) {
e.preventDefault();
this.props.updateTodo(this.props.id, this.state.task);
this.setState({
isEditing: false
})
}
render() {
let result;
if (this.state.isEditing) {
result = (
<div>
<form onSubmit = {this.handleSubmit}>
<input
type='text'
name='task'
value = {this.state.task}
onChange = {this.handleChangeEvent}
/>
<button>Save</button>
</form>
</div>
)
} else {
result = (
<div>
{this.props.task}
<button onClick = {this.handleRemove}>X</button>
<button onClick = {this.toggleEdit}>E</button>
</div>
)
}
return result;
}
}
export default Todo;
кажется, здесь работает stackblitz.com/edit/react-8cbglq
он ничего не регистрирует.
Похоже, в вашем constructor
вы неправильно привязываете функцию:
this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleChangeEvent.bind(this);
Вместо этого вторая функция должна быть связана с handleSubmit
Я думаю, сначала стоит отметить, что без javascript (обычный html) элемент формы отправляется при нажатии на <input type = "submit" value = "submit form">
или <button>
также отправляет форму </button>
.
В javascript вы можете предотвратить это, используя обработчик событий и вызывая e.preventDefault()
при нажатии кнопки или отправке формы. e
— это объект события, передаваемый в обработчик события. С помощью react два соответствующих обработчика событий доступны через форму onSubmit, а другой — через кнопку onClick
.
<Button color = "primary" onClick = {this.onClickPreventDefault}>onClickPreventDefault</Button>
Пример: http://jsbin.com/vowuley/edit?html, js, консоль, вывод
Изменены области:
result
setState()
не является асинхроннымДругие области для улучшения:
Вы можете сделать это компонентом без сохранения состояния с помощью useState()
Надеюсь, это поможет ??
class Todo extends Component {
state = {
isEditing: false
};
handleRemove = () => {
this.props.removeTodo(this.props.id);
};
toggleEdit = () => {
this.setState(({ isEditing }) => ({
isEditing: !isEditing
}));
};
handleChangeEvent = ({ target }) => {
this.setState({
[target.name]: target.value
});
};
handleSubmit = e => {
e.preventDefault();
this.setState(
{
isEditing: false
},
() => {
this.props.updateTodo(this.props.id, this.props.task);
}
);
};
render() {
const { task } = this.props;
return this.state.isEditing ? (
<div>
<form onSubmit = {this.handleSubmit}>
<input
type = "text"
name = "task"
value = {task}
onChange = {this.handleChangeEvent}
/>
<button type = "sumbit">Save</button>
</form>
</div>
) : (
<div>
{task}
<button onClick = {this.handleRemove}>X</button>
<button onClick = {this.toggleEdit}>E</button>
</div>
);
}
}
export default Todo;
вы можете использовать console.info(e) в методе handleSubmit?