reactjs - React,表单刷新问题,不阻止默认行为
问题描述
这个问题与React 有关,表单刷新问题(抱歉重复)。但事情<form onSumbit={ validation }
没有被触发。这是我想要达到的结果的简短解释。我创建了一个表单,用户将在其中输入电子邮件和文本。单击Submit
按钮时 - 数据通过 SmtpJS 发送。虽然,当我输入数据时 - 表单重新加载(表单,而不是整个页面)。我试图控制onSubmit
表单的事件,但它仍然重新加载。为什么?
import React, { Component, lazy, Suspense } from 'react';
import './App.css';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
// other components' imports
import { OnlineReception } from './components/OnlineReception/OnlineReception';
export default class App extends Component {
state = {
...
// feedback form
formData: {
host: "smtp.mailtrap.io",
recipient: "recipient@gmail.com", // email is an example here
sender: "",
text: "",
subject: "Feedback",
token: ""
}
}
// send email with data
// from Online Reception's
// component form
/*
sendEmail = () => {
window.Email.send({
Host : this.state.formData.host,
Username : "someUsername", // for local testing
Password : "somePassword", // for local testing
To : this.state.formData.recipient,
From : this.state.formData.sender,
Subject : this.state.formData.subject,
Body : `<html>${this.state.formData.text}</html>`
}).then(
message => alert(message)
)
};
*/
// changing sender & message input values
toggleChangeSender = async (event) => {
await this.setState({
...this.state,
formData: {
host: this.state.formData.host,
recipient: this.state.formData.recipient,
sender: event.target.value,
text: this.state.formData.text,
subject: this.state.formData.subject,
token: this.state.formData.token
}
});
console.log("sender - ", this.state.formData.sender);
}
toggleChangeText = async (event) => {
await this.setState({
...this.state,
formData: {
host: this.state.formData.host,
recipient: this.state.formData.recipient,
sender: this.state.formData.sender,
text: event.target.value,
subject: this.state.formData.subject,
token: this.state.formData.token
}
});
console.log("text - ", this.state.formData.text);
}
render() {
return (
<BrowserRouter>
<div className="App">
...
<Switch>
...
<Route path="/online-reception/" component={
() =>
<OnlineReception
formData={ this.state.formData }
onChangeSenderData={ this.toggleChangeSender }
onChangeTextData={ this.toggleChangeText }
/>
} />
</Switch>
</div>
</BrowserRouter>
);
}
}
带有表单的 OnlineReception 组件
import React from 'react';
import './css/OnlineReception.css';
export const OnlineReception = (props) => {
let { formData } = { ...props };
const validation = (e) => {
e.preventDefault();
console.log("validation called");
console.log("formData - ", formData);
};
return (
<div className="OnlineReception">
<h3 className="title">
Feedback
</h3>
<form className="feedback"
onSubmit={ validation }
>
<div className="wrapper">
<label>
Email
</label>
<input
type="email"
name="replyto"
className="field"
placeholder="Example: yourname@gmail.com"
autoComplete="off"
value={ formData.sender }
onChange={ props.onChangeSenderData }
/>
<label>
Message
</label>
<textarea
name="message"
className="field text-body"
placeholder="Text here"
value={ formData.text }
onChange={ props.onChangeTextData }
/>
<div className="buttonBox">
<button className="submit"
type="submit"
>
Submit
</button>
</div>
</div>
</form>
</div>
)
};
解决方案
它似乎对我有用。不过,我只是在没有 React Router 的情况下尝试了它,只是一个直接的组件,它工作得很好。我认为您的问题是您使用的是组件道具而不是渲染道具。
尝试<Route path="/online-reception/" render={ ...
推荐阅读
- node.js - 访问已部署的 Heroku 站点时出现 H13 错误
- reactjs - 意外的标记。需要构造函数、方法或属性
- bootstrap-4 - bootstrap4:flex:对齐内容中心不起作用
- c++ - SFML/C++ 单元格不会移动
- excel - 如何在 Excel 中将两个垂直数字列表合并为一个长垂直列表?
- javascript - 在 D3 中离开边界区域之前,元素分组上的鼠标悬停会触发
- twilio-api - 提交 wastapp 查询时的 twilio API 问题
- r - 创建一个 geom_bar,并根据每个帐户说出单词的次数为每个条着色
- ruby-on-rails - Rails 系统测试在没有加载资产的情况下运行
- r - 防止长行的 [R] 数据帧被截断?