react-bootstrap onSubmit无法正确绑定

时间:2019-07-15 17:35:36

标签: node.js reactjs express bootstrap-4 react-bootstrap

我正在尝试使用 express-react-views react-bootstrap 编写Express应用。

我没有使用创建React应用(运行npx create-react-app my-app)的常规方法,而是设置了Express应用并通过它运行路由。这一切似乎都可行,但是现在我正在尝试使用onSubmit处理程序创建一个引导表单。

我在React网站上查看了以下表单的代码示例:https://reactjs.org/docs/forms.html,但是使用下面的代码,我的handleSubmit从未被调用。如果我将onSubmit中的代码替换为console.log(‘hello’),那么在加载页面时,我会在控制台中看到'hello'

const React = require('react');
const Jumbotron = require('react-bootstrap').Jumbotron;
const Container = require('react-bootstrap').Container;
const Form = require('react-bootstrap').Form;
const FormGroup = require('react-bootstrap').FormGroup;
const Button = require('react-bootstrap').Button;
const AuthorisedLayout = require('./Layouts/loggedin');

class Generate extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    console.log('handleSubmit() clicked’);
    console.log(event);
    event.preventDefault();
  }

  render() {
    return (
      <AuthorisedLayout title={this.props.title}>
        <Jumbotron>
          <Container>
            <h1 className="display-3">{this.props.title}</h1>
            <p>{this.props.username}, this will generate a new key pair to be stored on the server.</p>
            <p>When the generation is complete, a zip file containing the key pair will download to your machine.</p>
          </Container>
        </Jumbotron>
        <Container>
          <Form onSubmit={this.handleSubmit}>
            <FormGroup controlId="service">
              <Form.Label>Service Name</Form.Label>
              <Form.Control type="text" placeholder="Service name" value={this.state.value} onChange={this.handleChange}></Form.Control>
            </FormGroup>
            <Button variant="primary" type="submit">
              Generate key pair
            </Button>
          </Form>
        </Container>
      </AuthorisedLayout>
    );
  }
}

module.exports = Generate;

我相信我的express应用已正确设置为使用jsx视图:

const app = express();
app.set('Views', __dirname + '/Views');
app.set('view engine', 'jsx');
app.engine('jsx', require('express-react-views').createEngine());

那么我如何使我的onSubmit正常工作,它应该在哪里输出我拥有的各种console.log,并防止事件链发生?

修改

我在这里创建了一种Codepen之类的东西:codepen

2 个答案:

答案 0 :(得分:0)

也许您需要在触发event.persist()函数之前添加handleSubmit。例如:

onSubmit={(event) => {event.persist();this.handleSubmit(event)}}>

handleSubmit(event)

handleSubmit(event){
    // use event.currentTarget - It will be visible here
}

答案 1 :(得分:0)

关于 express-react-views 作用和不作用的根本误解。

express-react-views 充当基于JSX的服务器端模板程序,这意味着它不提供诸如onSubmitonChange之类的事件处理程序:

  handleChange(event) {
    this.setState({value: event.target.value});
  }

  handleSubmit(event) {
    console.log('handleSubmit() clicked’);
    console.log(event);
    event.preventDefault();
  }

多余。

据说可以添加此功能,但是 express-react-views 的创建者并未对此加以说明或鼓励,因为这不是添加事件处理程序的保证方法。