Насколько правильно этот ротатор слов, который я создал с помощью Vue, копирует логику из версии, реализованной в JQuery?

Привет, я пытаюсь создать эффект ротатора слов или пишущей машинки с помощью vuejs.

Я нашел библиотеки здесь реализуется JQuery. Сейчас я пытаюсь сделать такой ротатор слов. Я использую ту же таблицу стилей и логику. Просто переход с jquery на vue. вот мой код.

 <script>
export default {
  name: "WordRotator",
  props: {
    effect: {
      type: String,
      default: "type"
    },
    words: {
      type: Array,
      default: []
    }
  },
  data: function() {
    return {
      wordIndex: Number,
      letterIndex: Number,
      parentClass: String
    };
  },
  computed: {
    state: vm =>
      vm.parentClass == ""
        ? "typing"
        : vm.parentClass == "waiting"
        ? "waiting"
        : vm.parentClass == "selected"
        ? "selected"
        : "unknown"
  },
  created: function() {
    this.wordIndex = 0;
    this.letterIndex = 0;
    this.parentClass = "waiting";
  },
  mounted: function() {
    var vm = this;
    setTimeout(vm.hideWord, 2500);
    console.log("mounted " + vm.parentClass);
  },
  updated: function() {
    var vm = this;
    console.log("updated " + vm.parentClass);

    if (vm.state == "typing") {
      setTimeout(vm.showWords, 150);
    } else if (vm.state == "selected") {
      setTimeout(function() {
        vm.letterIndex = 0;
        vm.wordIndex = vm.wordIndex == vm.words.length - 1 ? 0 : vm.wordIndex + 1;
        vm.parentClass = "";
      }, 500);
    } else if (vm.state == "waiting") {
      setTimeout(vm.hideWord, 2500);
    }
  },
  methods: {
    hideWord: function() {
      var vm = this;
      vm.parentClass = "selected";
    },
    showWords: function() {
      var vm = this;
      console.log(`Typing ${vm.letterIndex} letter of ${vm.wordIndex} word.`);
      vm.letterIndex = vm.letterIndex + 1;

      // end of word -> switch word
      if (vm.words[vm.wordIndex].split("").length == vm.letterIndex - 1) {
        vm.parentClass = "waiting";
      }
    },
    hideLetter: function() {},
    showLetter: function(letter, word, bool, duration) {}
  },
  render: function(createElement) {
    var vm = this;

    return createElement(
      "div",
      {
        class: `word-rotator letters ${vm.effect}`
      },
      [
        createElement(
          "span",
          {
            class: `word-rotator-words ${vm.parentClass}`
          },
          [
            ...vm.words.map((word, idx) => {
              var letters = word.split(""),
                selected = idx == vm.wordIndex;
              return createElement(
                "b",
                {
                  class: selected ? "is-visible" : "is-hidden",
                  style: "opacity: 1"
                },
                letters.map((letter, index) => {
                  return createElement(
                    "i",
                    {
                      class: selected && index <= vm.letterIndex ? "in" : "out"
                    },
                    [letter]
                  );
                })
              );
            })
          ]
        )
      ]
    );
  }
};
</script>

<style>
</style>

Это вроде как работает, но не кажется текучим, как оригинал. Я новичок в vue и реактивности. Итак, согласно моей логике, я пытаюсь изменить состояние в определенные моменты времени и итераций. Но не уверен, насколько это интенсивный процесс по сравнению с эквивалентом jquery. Не уверен, насколько возможно реагировать на каждой итерации, чтобы обработать компонент vue для отражения изменений.

Я также думаю, что если я могу использовать версию jquery напрямую, поскольку компонент является статическим, он не будет реагировать на ввод данных пользователем.

Верно ли мне подходить к такому итеративному и последовательному изменению поведения в vue.

0 ответов

Другие вопросы по тегам