Создание формы регистрации с использованием стилизованных компонентов в React может стать отличным способом добавить в ваше приложение нестандартный стиль. В этом сообщении блога мы рассмотрим шаги по созданию простой формы регистрации с использованием стилизованных компонентов.

Во-первых, давайте создадим новый проект React с помощью команды create-react-app:

npx create-react-app my-sign-up-form

Далее давайте установим пакет styled-components, который мы будем использовать для создания наших стилизованных компонентов:

npm install styled-components

Теперь, когда у нас есть все необходимое, давайте создадим форму регистрации. Мы начнем с создания нового компонента SignUpForm. Этот компонент будет компонентом с отслеживанием состояния, который будет хранить данные для наших полей формы, а также обрабатывать любую проверку и отправку формы.

import React from 'react';
import styled from 'styled-components';
import { StyledForm, StyledInput, StyledButton, StyledAlert, StyledLabel } from './FormComponents';

function LoginForm() {
    const [username, setUsername] = React.useState('');
    const [password, setPassword] = React.useState('');
    const [passwordInvalid, setPasswordInvalid] = React.useState(false);
    const [enabled, setEnabled] = React.useState(false);

    const handleSubmit = (e) => {
        e.preventDefault();

        // validate password and set passwordInvalid state accordingly
        if (password.length < 8) {
            setPasswordInvalid(true);
        } else {
            setPasswordInvalid(false);
        }
    }

    const usernameEntered = (e) => {
        setUsername(e.target.value);
        // buttonEnabled(username, password)
    }

    const passwordEntered = (e) => {
        setPassword(e.target.value);
        // buttonEnabled(username, password)
    }

    const buttonEnabled = (username, password) => {
        if(username.length > 0 && password.length > 0) {
            setEnabled(true);
        } else {
            setEnabled(false);
        }
    }

    return (
        <StyledForm onSubmit={handleSubmit}>
            <StyledLabel>Username:</StyledLabel>
            <StyledInput type="text" value={username} onChange={e => usernameEntered(e)}/>
            <StyledLabel invalid={passwordInvalid}>Password:</StyledLabel>
            <StyledInput type="password" value={password} onChange={(e) => passwordEntered(e)} />
            {passwordInvalid && <StyledAlert>Password is invalid.</StyledAlert>}
            <StyledButton type="submit" disabled={!username || !password}>Login</StyledButton>
        </StyledForm>
    )
}

export default LoginForm;
import styled from "styled-components";

export const StyledForm = styled.form`
  background-color: #f4f4f4;
  padding: 20px;
  border-radius: 5px;
`

export const StyledLabel = styled.label`
  display: block;
  margin-bottom: 5px;
  font-weight: bold;
  color: ${props => props.invalid ? 'red' : 'black'};
`

export const StyledInput = styled.input`
  width: 100%;
  padding: 10px;
  border: 1px solid #ccc;
  border-radius: 5px;
`

export const StyledButton = styled.button`
  background-color: #4caf50;
  color: white;
  padding: 10px;
  margin-top: 10px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  &:disabled {
    opacity: 0.5;
  }
  &:enabled {
    opacity: 1.0;
  }
  opacity: ${props => !props.enabled ? 0.5 : 1};
`

export const StyledAlert = styled.div`
  padding: 10px;
  background-color: #f44336;
  color: white;
  margin-top: 10px;
  border-radius: 5px;
`