React TS - компонент TypeWriter - PullRequest
       5

React TS - компонент TypeWriter

0 голосов
/ 11 марта 2020

Так что я все еще изучаю React и JavaScript в целом. Я пытался сделать компонент эффекта TypeWriter. В Интернете я нашел учебное пособие о том, как сделать ванильный JS TypeWriter, я пытаюсь преобразовать его в компонент React, я начал с него, пытаясь преобразовать некоторые переменные синхронизации в подпорки, но я ' я не уверен, как получить его полностью конвертированным и изо всех сил.

Дополнительно: Я также хотел бы сделать так, чтобы было prop для бесконечного зацикливания анимации или просто воспроизведения это один раз. Например: loop={true} заставит его играть неопределенно долго, если вы не укажете этот реквизит, он просто оживит массив и остановится на последнем слове в массиве.

Вместо использования classNames , Я хотел бы использовать styled-components, это, вероятно, также сработало бы лучше, так как для анимации мигающего курсора происходит кое-что динамическое c className.

Я не уверен, если код из этого руководства является наиболее эффективным способом написания такого рода логики c, поэтому, если есть способ улучшить его, пожалуйста, дайте мне знать. :)

Вот ванильное JS Учебное пособие по TypeWriter CodePen

Вот то, что у меня есть в моем компоненте:

import * as React from "react";
import styled from "styled-components";

interface ITypeWriter {
  textArray: Array<string>;
  typingDelay: number;
  erasingDelay: number;
  newTextDelay: number;
}

const TypeWriter: React.FC<ITypeWriter> = ({
  textArray,
  typingDelay,
  erasingDelay,
  newTextDelay
}) => {
  // START - Code from tutorial
  const typedTextSpan = document.querySelector(".typed-text");
  const cursorSpan = document.querySelector(".cursor");

  let textArrayIndex = 0;
  let charIndex = 0;

  function type() {
    if (charIndex < textArray[textArrayIndex].length) {
      if (!cursorSpan.classList.contains("typing"))
        cursorSpan.classList.add("typing");
      typedTextSpan.textContent += textArray[textArrayIndex].charAt(charIndex);
      charIndex++;
      setTimeout(type, typingDelay);
    } else {
      cursorSpan.classList.remove("typing");
      setTimeout(erase, newTextDelay);
    }
  }

  function erase() {
    if (charIndex > 0) {
      if (!cursorSpan.classList.contains("typing"))
        cursorSpan.classList.add("typing");
      typedTextSpan.textContent = textArray[textArrayIndex].substring(
        0,
        charIndex - 1
      );
      charIndex--;
      setTimeout(erase, erasingDelay);
    } else {
      cursorSpan.classList.remove("typing");
      textArrayIndex++;
      if (textArrayIndex >= textArray.length) textArrayIndex = 0;
      setTimeout(type, typingDelay + 1100);
    }
  }

  document.addEventListener("DOMContentLoaded", function() {
    if (textArray.length) setTimeout(type, newTextDelay + 250);
  });
  // END - Code from tutorial

  return (
    <div className="App">
      <StyledText>{}</StyledText>
    </div>
  );
};

export default TypeWriter;

const StyledText = styled.span`
  font-weight: normal;
  color: #dd7732;
`;

Вот CodeSandBox , вилки приветствуются:)

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