Компоненты React загружаются до завершения расчетов - PullRequest
0 голосов
/ 14 июля 2020

Уважаемые Я работаю над проектом React и в настоящее время борюсь с небольшой проблемой. в чем проблема? Когда приложение загружается в мобильном представлении, я вижу, что отображаются все компоненты, и через несколько мс ненужные данные исчезают. Я хочу изменить свое приложение так, чтобы отображались только необходимые компоненты.

import React, { useState, useEffect } from "react";
import styled from "styled-components";
import PropTypes from "prop-types";
import RegistrationInputSide from "./../RegistrationInputSide/RegistrationInputSide";
import AppInfoSide from "./../AppInfoSide/AppInfoSide";
import SuccessWindow from "./../SuccessWindow/SuccessWindow";
import { names, labels, types} from "./registrationFormData";


const FormStyle = styled.div.attrs(({ className }) => ({
  className,
}))`
  display: flex;
  width: 100%;
  height: 100%;

  .fields {
    display: ${({ fieldsVisibility }) => (fieldsVisibility ? "flex" : "none")};
  }
  .info {
    display: ${({ infoVisibility }) => (infoVisibility ? "flex" : "none")};
  }
`;

const RegistrationForm = ({user, onChange, validation, onSubmit, formCorrectness, formModified}) => {
  const [isMobile, setIsMobile] = useState(false);
  const [isMoved, setIsMoved] = useState(false);
  const [firstRender, setFirstRender] = useState(true);
  const {password, repeatedPassword, email } = user;
  const {emailValidation, passwordValidation, repeatedPasswordValidation} = validation;


  const calculateMobileVisibility = (form) => {
    const {name, isMobile} = form;
    const visibilityRequirements = {
      "info": [{"isMobile":true, "isMoved":false, "isModified":false, "formCorrectness": false}],
      "fields": [{"isMobile":true, "isMoved":true, "isModified":false, "formCorrectness": false},{"isMobile":true, "isMoved":false, "isModified":true, "formCorrectness": false}, {"isMobile":true, "isMoved":true, "isModified":true, "formCorrectness": false}],
      "success": [{"isMobile":true, "isMoved":true, "isModified":false, "formCorrectness": true},{"isMobile":true, "isMoved":false, "isModified":true, "formCorrectness": true}, {"isMobile":true, "isMoved":true, "isModified":true, "formCorrectness": true}]
    }

    if(isMobile === false){
      return true;
    }

    const requirements = visibilityRequirements[name];
    delete form.name;

    let resultArr = requirements.map(requirement => {return Object.keys(form).map(formItem => requirement[formItem] === form[formItem])});

    const finalArr = resultArr.map(singleRes => singleRes.every((val) => val === true));

    return finalArr.includes(true);
  };


  const calculateInfoSideVisiblity = () => {
    return calculateMobileVisibility({"isMobile":isMobile, "isMoved": isMoved, "isModified": formModified ,"formCorrectness": formCorrectness, "name": "info"});
  }

  const calculateFieldsSideVisibility = () => {
    return calculateMobileVisibility({"isMobile":isMobile, "isMoved": isMoved, "isModified": formModified ,"formCorrectness": formCorrectness, "name": "fields"});
  }

  const onClickHandleMobile = (e) => {
    e.preventDefault();
    setIsMoved(true);
  };

  const handleResize = () => {
    window.visualViewport.width > 576 ? setIsMobile(false) : setIsMobile(true);
  };

  useEffect(() => {
    if(firstRender===true){
      handleResize();
      setFirstRender(false);
    }

    window.addEventListener("resize", handleResize);

    return () => {
      window.removeEventListener("resize", handleResize);
    };
  });

  return (
    <FormStyle fieldsVisibility={calculateFieldsSideVisibility()} infoVisibility={calculateInfoSideVisiblity()}>
      <form onSubmit={onSubmit}>
        <AppInfoSide
          className="form-info-side info"
          onClick={onClickHandleMobile}
        />
        {!formCorrectness && (<RegistrationInputSide
          className="form-user-input-side fields"
          inputFieldsData={inputFieldsData}
          onClick={onSubmit}
          onChange={onChange}
          user={user}
        />)}
        {formCorrectness && (<SuccessWindow
          className="success-window fields"
          successMessage="Account successfully created!"
        />)}
      </form>
    </FormStyle>
  );
};

Я не знаю, как предотвратить отображение нежелательных элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...