首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个页面中的多个表单- reactjs

一个页面中的多个表单- reactjs
EN

Stack Overflow用户
提问于 2020-01-25 22:55:17
回答 3查看 6.2K关注 0票数 5

我正在建设页面,在那里用户可以通过单击切换按钮在登录和注册模式之间切换。登录表单有2个输入字段,注册表单有3个输入字段。我的想法是构建两个彼此独立的窗体,并使用两个独立的自定义钩子实例。

代码语言:javascript
运行
复制
import React, { useState } from "react";

import { useForm } from "../../shared/hooks/form-hook";
import Card from "../../shared/components/UIElements/Card";
import Input from "../../shared/components/FormElements/Input";
import Button from "../../shared/components/FormElements/Button";
import {
  VALIDATOR_MINLENGTH,
  VALIDATOR_EMAIL
} from "../../shared/util/validators";
import "./Auth.css";

const Auth = props => {
  const [showLogin, setShowLogin] = useState(true);

  const [formStateLogin, inputHandlerLogin] = useForm(
    {
      email: {
        value: "",
        isValid: false
      },
      password: {
        value: "",
        isValid: false
      }
    },
    false
  );
  const [formStateSignup, inputHandlerSignup] = useForm(
    {
      name: {
        value: "",
        isValid: false
      },
      email: {
        value: "",
        isValid: false
      },
      password: {
        value: "",
        isValid: false
      }
    },
    false
  );

  const loginSubmitHandler = event => {
    event.preventDefault();
    console.log("login handler");
  };

  const signupSubmitHandler = event => {
    event.preventDefault();
    console.log(formStateSignup.inputs);
  };

  const switchButtonHandler = () => {
    setShowLogin(!showLogin);
  };

  return (
    <Card className="authentication">
      {showLogin ? (
        <form onSubmit={loginSubmitHandler} className="place-form">
          <h2>Enter your login details</h2>
          <Input
            id="email"
            element="input"
            type="email"
            placeholder="Email address"
            label="Email"
            validators={[VALIDATOR_EMAIL(), VALIDATOR_MINLENGTH(5)]}
            onInput={inputHandlerLogin}
            errorText="Please enter valid email address"
          />
          <Input
            id="password"
            element="input"
            type="password"
            placeholder="Password"
            label="Password"
            validators={[VALIDATOR_MINLENGTH(5)]}
            onInput={inputHandlerLogin}
            errorText="Please enter valid password (at least 5 chars)"
          />
          <Button type="submit" disabled={!formStateLogin.isValid}>
            LOGIN
          </Button>
        </form>
      ) : (
        <form onSubmit={signupSubmitHandler} className="place-form">
          <h2>Enter your signup details</h2>
          <Input
            id="name_s"
            element="input"
            type="text"
            placeholder="Enter your name"
            label="Name"
            validators={[VALIDATOR_MINLENGTH(2)]}
            onInput={inputHandlerSignup}
            errorText="Please enter valid name at least 2 chars"
          />
          <Input
            id="email_s"
            element="input"
            type="email"
            placeholder="Email address"
            label="Email"
            validators={[VALIDATOR_EMAIL(), VALIDATOR_MINLENGTH(5)]}
            onInput={inputHandlerSignup}
            errorText="Please enter valid email address"
          />
          <Input
            id="password_s"
            element="input"
            type="password"
            placeholder="Password"
            label="Password"
            validators={[VALIDATOR_MINLENGTH(5)]}
            onInput={inputHandlerSignup}
            errorText="Please enter valid password (at least 5 chars)"
          />
          <Button type="submit" disabled={!formStateSignup.isValid}>
            LOGIN
          </Button>
        </form>
      )}
      <Button inverse onClick={switchButtonHandler}>
        {showLogin ? "SWITCH TO SIGNUP" : "SWITCH TO LOGIN"}
      </Button>
    </Card>
  );
};

export default Auth;

这两个表单看起来都呈现得很好,但问题是,当我在一个表单中输入文本并决定切换到另一个表单时,原来表单中的值并没有丢失,而是转换成了新的表单:

这是ReactJS的限制,还是超文本标记语言?:)还是我的错误代码?

EN

回答 3

Stack Overflow用户

发布于 2020-07-30 16:22:30

将两个表单放在一个组件中并不是一个好的约定,这会弄得一团糟……我宁愿让LoginForm和SignUpForm成为两个独立的组件,并通过基于state的三元运算符在它们之间切换,以任何你喜欢的方式。窗体和它们的状态将分开,代码可读性更好

票数 1
EN

Stack Overflow用户

发布于 2020-01-26 13:25:04

如果你在第一页选择单选按钮,然后用单选按钮呈现第二页,那么复选框和单选按钮也会发生同样的情况。由于dom操作成本很高,因此会自动选择。

在您的示例中,react只是添加新的第三个字段并将其删除,您需要将字段的值属性设置为相应的状态。

票数 0
EN

Stack Overflow用户

发布于 2020-07-30 16:41:32

你真的可以。使用嵌套管线在零部件之间切换

代码语言:javascript
运行
复制
import { Switch, Route } from 'react-router-dom';

<Switch>
   <Route path='/register' >
      // component 1
      <Register />
   </Route>
   <Route path='/login' >
      // component 2
      <Login />
   </Route>
</Switch>  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59910380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档