如何使用Reactstrap在React中构建表单

来自菜鸟教程
跳转至:导航、​搜索

介绍

Reactstrap 提供了预构建的 Bootstrap 4 组件,允许极大的灵活性和预构建的验证。 这使我们能够快速构建精美的表单,保证给人留下深刻印象并提供直观的用户体验。

在本教程中,您将使用 Reactstrap 在 React 应用程序中构建登录表单。

先决条件

  • Node.js 的本地开发环境。 关注【X7X】如何安装Node.js并创建本地开发环境【X76X】。
  • 对 React 有一定的了解。 你可以阅读我们的 如何在 React.js 系列中编码。
  • 对 Bootstrap 4 有一定的了解。 你可以阅读官方的 Bootstrap 4.6 文档

本教程已使用 Node v16.2.0、npm v7.14.0、react v17.0.2、reactstrap v8.9.0 和 bootstrap v4 进行了验证。 6.0。

第 1 步 — 设置项目

首先使用 create-react-app 生成 React App,然后安装依赖项:

npx create-react-app reactstrap-example

切换到新的项目目录:

cd reactstrap-example

现在,您可以运行 React 应用程序:

npm start

修复项目的任何错误或问题。 并在网络浏览器中访问 localhost:3000

一旦你有一个工作的 React 应用程序,你可以安装 reactstrap

npm install reactstrap@8.9.0

然后,您可以安装 bootstrap

npm install bootstrap@4

注意: 在使用 Reactstrap 时,指定 Bootstrap 的 4.x 版本很重要,以便安装兼容版本。 不指定版本将安装当前为 5.x 的最新版本的 Bootstrap。


接下来,在代码编辑器中打开 src/index.js 文件。 添加以下行以在项目中使用 Bootstrap 样式:

src/index.js

import 'bootstrap/dist/css/bootstrap.min.css';

此时,您将拥有一个新的 React 应用程序,其中包含 Reactstrap 和 Bootstrap 的依赖项。

第 2 步 — 使用表单组件

Reactstrap 允许我们预先构建 Form 组件,包括从标准文本 Input 到更高级的文件上传 Input 的任何内容。

首先,从 reactstrap 导入 Components。 在此示例中,我们将导入 ButtonFormFormGroupInputLabel 以直接在我们的登录中使用形式。

import {
  Button,
  Form,
  FormGroup,
  Input,
  Label
} from 'reactstrap';

现在我们有了所需的组件,让我们构建表单。

Reactstrap 接受 props 例如 typenameidplaceholder

  • type 定义输入的类型,例如文件上传、单选按钮,甚至更具体的文本输入,例如电子邮件。
  • name 是最终发送到我们后端的键值对的键。
  • id 是我们在操作 DOM 时使用的。
  • placeholder 允许我们在输入中添加示例文本。

在代码编辑器中打开 App.js 并添加以下代码行:

src/App.js

import { Component } from 'react';
import {
  Button,
  Form,
  FormGroup,
  Input,
  Label
} from 'reactstrap';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <h2>Sign In</h2>
        <Form className="form">
          <FormGroup>
            <Label for="exampleEmail">Username</Label>
            <Input
              type="email"
              name="email"
              id="exampleEmail"
              placeholder="example@example.com"
            />
          </FormGroup>
          <FormGroup>
            <Label for="examplePassword">Password</Label>
            <Input
              type="password"
              name="password"
              id="examplePassword"
              placeholder="********"
            />
          </FormGroup>
        <Button>Submit</Button>
      </Form>
    </div>
  );
}

export default App;

然后,在您的代码编辑器中打开 App.css 并将其替换为以下样式:

应用程序.css

.App {
  border: 2px solid #d3d3d3;
  border-radius: .5em;
  margin-bottom: 1em;
  margin-left: auto;
  margin-right: auto;
  margin-top: 100px;
  padding: 1em;
  text-align: left;
  width: 600px;
}

.form {
  padding: 1em;
}

label {
  font-weight: 600;
}

保存更改并在 Web 浏览器中观察应用程序:

Reactstrap 提供了多种内置方式来设置表单组件的样式。 以下是一些可能派上用场的关键项目:

  • 颜色:Reactstrap 在使用 has-successclassName 时支持 Bootstrap 的内置颜色。
  • 内联表单:在 <Form> 中,我们可以添加 <Form inline>LabelInput 放在同一行。
  • 容器、行和列:<Col> 是 Reactstrap 对 Bootstrap 列的包装器。 这使我们不仅可以格式化台式机,还可以格式化手机和平板电脑。

此时,您拥有一个带有使用 Bootstrap 样式的登录表单的 React 应用程序。

第 3 步 — 添加验证和用户提示

FormText 允许我们在字段上方或下方添加额外的指示符文本。

对于此示例,“用户名”字段将需要电子邮件地址形式的值。 添加了 FormText 以告知用户预期值。

<FormText>Your username is most likely your email.</FormText>

保存更改并在 Web 浏览器中观察应用程序:

在将 FormFeedback 添加到此示例之前,您需要管理状态:

constructor(props) {
  super(props);
  this.state = {
    email: '',
    validate: {
      emailState: '',
    },
  };
}

render() {
  const { email } = this.state;
  // ...
}

并处理表单的更改:

constructor(props) {
  super(props);
  // ...
  this.handleChange = this.handleChange.bind(this);
}

handleChange = (event) => {
  const { target } = event;
  const value = target.type === 'checkbox' ? target.checked : target.value;
  const { name } = target;

  this.setState({
    [name]: value,
  });
};

FormFeedback 立即验证字段。 您可以灵活地自定义输入验证。 使用 Regex 添加一个函数来验证 onChange 事件上的电子邮件,并将 has-successhas-danger 设置为状态。

validateEmail(e) {
  const emailRegex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

  const { validate } = this.state;

  if (emailRegex.test(e.target.value)) {
    validate.emailState = 'has-success';
  } else {
    validate.emailState = 'has-danger';
  }

  this.setState({ validate });
}

警告: 有一个用于验证电子邮件地址的标准规范。 这个简化的正则表达式仅用于教程目的。


要将其应用于您的 Input,请添加 valid 道具和您的条件:

valid={ this.state.validate.emailState === 'has-success' }

以及带有条件的 invalid 道具:

invalid={ this.state.validate.emailState === 'has-danger' }
/>

创建一个 FormFeedback 默认显示失败文本:

<FormFeedback>
  Uh oh! Looks like there is an issue with your email. Please input a correct email.
</FormFeedback>

使用 valid 属性创建第二个 FormFeedback 以显示成功文本:

<FormFeedback valid>
  That's a tasty looking email you've got there.
</FormFeedback>

然后,将 valuevalidateEmailhandleChange 添加到 Input 中:

<Input
  type="email"
  name="email"
  id="exampleEmail"
  placeholder="example@example.com"
  valid={ this.state.validate.emailState === 'has-success' }
  invalid={ this.state.validate.emailState === 'has-danger' }
  value={ email }
  onChange={ (e) => {
                      this.validateEmail(e);
                      this.handleChange(e);
                    } }
/>

当用户输入错误的用户名时,用户将收到 has-danger 样式的反馈:

当用户正确输入用户名时,用户将获得 has-success 样式的反馈:

现在,您的表单使用 FormTextFormFeedback 和验证。

第 4 步 — 提交表格

最后,在提交时,我们通常会将数据提交到我们的数据库,但在我们的示例中,我们将使用 submitForm 函数控制台记录电子邮件。

submitForm(e) {
  e.preventDefault();
  console.log(`Email: ${ this.state.email }`);
}

所有部件都准备好后,App.js 将类似于以下内容:

src/App.js

import { Component } from 'react';
import {
  Form,
  FormFeedback,
  FormGroup,
  FormText,
  Label,
  Input,
  Button,
} from 'reactstrap';
import './App.css';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      email: '',
      password: '',
      validate: {
        emailState: '',
      },
    };
    this.handleChange = this.handleChange.bind(this);
  }

  handleChange = (event) => {
    const { target } = event;
    const value = target.type === 'checkbox' ? target.checked : target.value;
    const { name } = target;

    this.setState({
      [name]: value,
    });
  };

  validateEmail(e) {
    const emailRex =
      /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

    const { validate } = this.state;

    if (emailRex.test(e.target.value)) {
      validate.emailState = 'has-success';
    } else {
      validate.emailState = 'has-danger';
    }

    this.setState({ validate });
  }

  submitForm(e) {
    e.preventDefault();
    console.log(`Email: ${this.state.email}`);
  }

  render() {
    const { email, password } = this.state;

    return (
      <div className="App">
        <h2>Sign In</h2>
        <Form className="form" onSubmit={(e) => this.submitForm(e)}>
          <FormGroup>
            <Label>Username</Label>
            <Input
              type="email"
              name="email"
              id="exampleEmail"
              placeholder="example@example.com"
              valid={this.state.validate.emailState === "has-success"}
              invalid={this.state.validate.emailState === "has-danger"}
              value={email}
              onChange={(e) => {
                this.validateEmail(e);
                this.handleChange(e);
              }}
            />
            <FormFeedback>
              Uh oh! Looks like there is an issue with your email. Please input
              a correct email.
            </FormFeedback>
            <FormFeedback valid>
              That's a tasty looking email you've got there.
            </FormFeedback>
            <FormText>Your username is most likely your email.</FormText>
          </FormGroup>
          <FormGroup>
            <Label for="examplePassword">Password</Label>
            <Input
              type="password"
              name="password"
              id="examplePassword"
              placeholder="********"
              value={password}
              onChange={(e) => this.handleChange(e)}
            />
          </FormGroup>
          <Button>Submit</Button>
        </Form>
      </div>
    );
  }
}

export default App;

结论

在本教程中,您使用 Reactstrap 在 React 应用程序中构建了一个登录表单。 这允许您使用带有 React 组件的 Bootstrap 4 元素进行构建。

如果您想了解有关 React 的更多信息,请查看 我们的 React 主题页面 以获取练习和编程项目。