javascript - 如何获取用户输入的值并基于 React 中的值显示另一个元素?

标签 javascript reactjs forms date validation

我正在尝试显示一个复选框(“我同意”),例如用户年龄小于 18 岁,否则不显示该复选框。

我写了一个handleAgreementCheckbox,如果用户年龄小于 18 岁,它应该返回一个 bool 值(true, false),不知道如何获取元素值并显示复选框。

如何在 React 中做到这一点?

代码

import React from 'react'
import {
  Form,
  Field
} from 'react-advanced-form'
import {
  Input,
  Button
} from 'react-advanced-form-addons'

export default class RegistrationForm extends React.Component {
  registerUser = ({
    serialized,
    fields,
    form
  }) => {
    return fetch('https://backend.dev', {
      body: JSON.stringify(serialized)
    })
  }

  handleAgreementCheckbox = () => {
      const currentTime = new Date();
      const eligibleUserDOB = new Date(currentTime.getFullYear() - 18, currentTime.getMonth(), currentTime.getDate());
      return currentTime>= eligibleUserDOB;
  };

  render() {
    return (
      <section className = "container">
        <Form action = {
          this.registerUser
        }
        onSubmitStart = {
          this.props.onSubmitStart
        }>
            <Input name = "firstName"
            label = "First name"
            required = {
              ({
                get
              }) => {
                return !!get(['lastName', 'value'])
              }
            }/>
            <Input name = "lastName"
            label = "Last name"
            required = {
              ({
                get
              }) => {
                return !!get(['firstName', 'value'])
              }
            }
            />

            <Input name = "emailAddress"
            type = "email"
            label = "Email Address"
            required />

            <Input name = "phoneNumber"
            type = "text"
            label = "Phone Number"
            required />

            <Input name = "dateOfBirth"
            type = "date"
            label = "Date of Birth"
            required />

            <Input name = "eligibleAge"
            type = "checkbox"
            label = "I agree"
            value = "unchecked"
            />
          <Button primary> Submit </Button>
        </Form>
      </section>
    );
  }
}

(谢谢!我是 React 新手。)

Demo on codesandbox

最佳答案

好的,明白了,首先创建一个状态来保存资格的真假条件。然后在您的handleAgreementCheckbox 方法中设置该状态。最后使用资格状态根据 true 或 false 有条件地呈现复选框。

/**
 * Registration form.
 * The component we have built together as the part of
 * React Advanced Form presentation on Medium.
 */
import React, { useState } from "react";
import { Form, Field } from "react-advanced-form";
import { Input, Button } from "react-advanced-form-addons";
// import 'react-phone-number-input/style.css'
// import PhoneInput from 'react-phone-number-input'
import PhoneInput from "react-phone-input-2";
import "react-phone-input-2/lib/style.css";

export default class RegistrationForm extends React.Component {
  registerUser = ({ serialized, fields, form }) => {
    return fetch("https://backend.dev", {
      body: JSON.stringify(serialized)
    });
  };

  state = { phone: "", eligible: false };

  handleOnChange = value => {
    console.log(value);
    this.setState({ phone: value }, () => {
      console.log(this.state.phone);
    });
  };

  handleAgreementCheckbox = event => {
    let selectedDate = event.nextValue; //======> fetch selected date and split it to pass into date object.
    selectedDate = selectedDate.split("-");
    console.log(selectedDate);

    const currentTime = new Date();
    const eligibleUserDOB = new Date(
      selectedDate[0],
      selectedDate[1] - 1,
      selectedDate[2]
    );
    console.log(currentTime, eligibleUserDOB);
    console.log(currentTime > eligibleUserDOB);

    if (currentTime >= eligibleUserDOB) { //====> on greater set eligible to true
      this.setState({ eligible: true });
    } else {                              //====> on less set eligible to false
      console.log(this.state);
      this.setState({ eligible: false });
    }

    return currentTime >= eligibleUserDOB;
  };

  render() {
    return (
      <section className="container">
        <Form
          action={this.registerUser}
          onSubmitStart={this.props.onSubmitStart}
        >
          <Input
            name="firstName"
            label="First name"
            required={({ get }) => {
              return !!get(["lastName", "value"]);
            }}
          />
          <Input
            name="lastName"
            label="Last name"
            required={({ get }) => {
              return !!get(["firstName", "value"]);
            }}
          />

          <Input
            name="emailAddress"
            type="email"
            label="Email Address"
            required
          />

          <PhoneInput
            name="phoneNumber"
            type="text"
            country={"us"}
            enableAreaCodes={true}
            onlyCountries={["us"]}
            areaCodes={{ us: ["332"] }}
            inputProps={{
              name: "phone",
              country: "us",
              required: true,
              autoFocus: true
            }}
            value={this.state.phone}
            onChange={this.handleOnChange}
            required
          />

          <Input
            name="dateOfBirth"
            type="date"
            label="Date of Birth"
            onChange={this.handleAgreementCheckbox}
            required
          />
          {this.state.eligible && ( //===========> print the state here and change time to see it in working. It will display the check on true and hide on false
            <Input
              name="eligibleAge"
              type="checkbox"
              label="I agree"
              value="unchecked"
            />
          )}
          <Button primary> Submit </Button>
        </Form>
      </section>
    );
  }
}

// <PhoneInput
//  country="US"
//  value={this.phoneNumberValidation.value}
//  onChange={this.phoneNumberValidation.setValue} />

工作演示here

关于javascript - 如何获取用户输入的值并基于 React 中的值显示另一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60685939/

相关文章:

javascript - imacro 每 10 次循环加载一次 url

javascript - While 循环递增数组长度

reactjs - 输入意外结束,需要 token }

没有错误的 Django 表单为 is_valid() 返回 False

python - Flask - 如何结合 Flask-WTF 和 Flask-SQLAlchemy 来编辑数据库模型?

javascript - 在createScript错误时获取意外标识符

javascript/jquery 设置 var 没有发生

javascript - react-devtools:默认情况下,DevTools 监听本地主机上的 8097 端口。如何定制?

reactjs - React-native Tab 导航器未显示

javascript - 提交 AJAX 表单以表达 api - JSON 中位置 0 处出现意外标记 #