Как вставить JavaScript в файл Vue - PullRequest
0 голосов
/ 27 апреля 2018

Я нашел скрипт number to words и хочу использовать этот скрипт в файле .vue, но не могу найти, куда вставить этот скрипт. Может быть, кто-то может помочь, где вставить этот скрипт? а как поменять onkeyup который работает на vuejs2

function convertNumberToWords(amount) {
    var words = new Array();
    words[0] = '';
    words[1] = 'One';
    words[2] = 'Two';
    words[3] = 'Three';
    words[4] = 'Four';
    words[5] = 'Five';
    words[6] = 'Six';
    words[7] = 'Seven';
    words[8] = 'Eight';
    words[9] = 'Nine';
    words[10] = 'Ten';
    words[11] = 'Eleven';
    words[12] = 'Twelve';
    words[13] = 'Thirteen';
    words[14] = 'Fourteen';
    words[15] = 'Fifteen';
    words[16] = 'Sixteen';
    words[17] = 'Seventeen';
    words[18] = 'Eighteen';
    words[19] = 'Nineteen';
    words[20] = 'Twenty';
    words[30] = 'Thirty';
    words[40] = 'Forty';
    words[50] = 'Fifty';
    words[60] = 'Sixty';
    words[70] = 'Seventy';
    words[80] = 'Eighty';
    words[90] = 'Ninety';
    amount = amount.toString();
    var atemp = amount.split(".");
    var number = atemp[0].split(",").join("");
    var n_length = number.length;
    var words_string = "";
    if (n_length <= 9) {
        var n_array = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0);
        var received_n_array = new Array();
        for (var i = 0; i < n_length; i++) {
            received_n_array[i] = number.substr(i, 1);
        }
        for (var i = 9 - n_length, j = 0; i < 9; i++, j++) {
            n_array[i] = received_n_array[j];
        }
        for (var i = 0, j = 1; i < 9; i++, j++) {
            if (i == 0 || i == 2 || i == 4 || i == 7) {
                if (n_array[i] == 1) {
                    n_array[j] = 10 + parseInt(n_array[j]);
                    n_array[i] = 0;
                }
            }
        }
        value = "";
        for (var i = 0; i < 9; i++) {
            if (i == 0 || i == 2 || i == 4 || i == 7) {
                value = n_array[i] * 10;
            } else {
                value = n_array[i];
            }
            if (value != 0) {
                words_string += words[value] + " ";
            }
            if ((i == 1 && value != 0) || (i == 0 && value != 0 && n_array[i + 1] == 0)) {
                words_string += "Crores ";
            }
            if ((i == 3 && value != 0) || (i == 2 && value != 0 && n_array[i + 1] == 0)) {
                words_string += "Hundred and ";
            }
            if ((i == 5 && value != 0) || (i == 4 && value != 0 && n_array[i + 1] == 0)) {
                words_string += "Thousand ";
            }
            if (i == 6 && value != 0 && (n_array[i + 1] != 0 && n_array[i + 2] != 0)) {
                words_string += "Hundred and ";
            } else if (i == 6 && value != 0) {
                words_string += "Hundred ";
            }
        }
        words_string = words_string.split("  ").join(" ");
    }
    return words_string;
}
<input type="text" name="number" placeholder="Number OR Amount" onkeyup="word.innerHTML=convertNumberToWords(this.value)" />
<div id="word"></div>

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018
Файлы

.vue принимают весь допустимый код JavaScript, поэтому вы можете либо просто поместить эту функцию в свой компонент Vue в объект methods и использовать ее как обычно, либо, если вы хотите использовать ее во многих компонентах, вы также можете поместите его в файл и импортируйте в свои компоненты.

Как импортировать библиотеки JS

0 голосов
/ 27 апреля 2018

Вы действительно не пользуетесь тем, что Vue делает так. Вам вообще не нужно использовать ручные обработчики событий или прямое манипулирование DOM; вместо этого позвольте структуре позаботиться об этом за вас. Одним из способов является использование вычисляемого свойства на основе входного значения:

Вычисляемая недвижимость:

<input type="text" name="number" placeholder="Number OR Amount" v-model="theNumber">
<div id="word" v-html="theWord"></div>

...

computed: {
   theWord() {
      // your "convertNumberToWords" function here, using `this.theNumber` as its input, and returning the word you want displayed in the DOM
      return "foo"; 
   }
}

При каждом изменении v-модели theNumber вычисленная функция theWord автоматически запускается и обновляет DOM.

Ниже приведен пример работы, содержащий полную функцию «число в слова»:

Vue.component('theComponent', {
  template: `
    <span>
      <input v-model="theNumber">
      <div v-html="theWord"></div>
    </span>`,
  data() {
    return {
      theNumber: '1'
    }
  },
  computed: {
    theWord() { 
      var words = new Array();
      words[0] = '';
      words[1] = 'One';
      words[2] = 'Two';
      words[3] = 'Three';
      words[4] = 'Four';
      words[5] = 'Five';
      words[6] = 'Six';
      words[7] = 'Seven';
      words[8] = 'Eight';
      words[9] = 'Nine';
      words[10] = 'Ten';
      words[11] = 'Eleven';
      words[12] = 'Twelve';
      words[13] = 'Thirteen';
      words[14] = 'Fourteen';
      words[15] = 'Fifteen';
      words[16] = 'Sixteen';
      words[17] = 'Seventeen';
      words[18] = 'Eighteen';
      words[19] = 'Nineteen';
      words[20] = 'Twenty';
      words[30] = 'Thirty';
      words[40] = 'Forty';
      words[50] = 'Fifty';
      words[60] = 'Sixty';
      words[70] = 'Seventy';
      words[80] = 'Eighty';
      words[90] = 'Ninety';
      amount = this.theNumber.toString();
      var atemp = amount.split(".");
      var number = atemp[0].split(",").join("");
      var n_length = number.length;
      var words_string = "";
      if (n_length <= 9) {
        var n_array = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0);
        var received_n_array = new Array();
        for (var i = 0; i < n_length; i++) {
          received_n_array[i] = number.substr(i, 1);
        }
        for (var i = 9 - n_length, j = 0; i < 9; i++, j++) {
          n_array[i] = received_n_array[j];
        }
        for (var i = 0, j = 1; i < 9; i++, j++) {
          if (i == 0 || i == 2 || i == 4 || i == 7) {
            if (n_array[i] == 1) {
              n_array[j] = 10 + parseInt(n_array[j]);
              n_array[i] = 0;
            }
          }
        }
        value = "";
        for (var i = 0; i < 9; i++) {
          if (i == 0 || i == 2 || i == 4 || i == 7) {
            value = n_array[i] * 10;
          } else {
            value = n_array[i];
          }
          if (value != 0) {
            words_string += words[value] + " ";
          }
          if ((i == 1 && value != 0) || (i == 0 && value != 0 && n_array[i + 1] == 0)) {
            words_string += "Crores ";
          }
          if ((i == 3 && value != 0) || (i == 2 && value != 0 && n_array[i + 1] == 0)) {
            words_string += "Hundred and ";
          }
          if ((i == 5 && value != 0) || (i == 4 && value != 0 && n_array[i + 1] == 0)) {
            words_string += "Thousand ";
          }
          if (i == 6 && value != 0 && (n_array[i + 1] != 0 && n_array[i + 2] != 0)) {
            words_string += "Hundred and ";
          } else if (i == 6 && value != 0) {
            words_string += "Hundred ";
          }
        }
        words_string = words_string.split("  ").join(" ");
      }
      return words_string;

    }
  }
});

new Vue({
  el: '#app'
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.0/vue.js"></script>
<div id="app">
  <the-component></the-component>
</div>

Фильтр:

В качестве альтернативы, если вы часто используете эту функцию во всем приложении, лучше использовать ее как фильтр . Определите фильтр в вашем main.js, и он будет доступен во всех компонентах:

Vue.filter('numberToWord', function (value) {
  // your function here
})

<!-- these are equivalent: -->
<span>{{theNumber | numberToWord}}</span>
<span>{{filters.numberToWord(theNumber)}}</span>

Преобразование чисел в слова:

Кстати: это не имеет непосредственного отношения к вашему вопросу, но есть некоторые проблемы с самой функцией числа в слова, о которых вы должны знать; он терпит неудачу для многих входных значений выше 99,999 - например, 100001 выходит как «Сто сто один» - и использует регионально-специфический термин «Crores» для десяти миллионов, который вы можете удалить, если ваш сайт не предназначен для аудитория, которая будет знакома с этим термином.

Вот несколько других реализаций той же идеи , некоторые из которых могут быть предпочтительнее той, что использовалась выше.

0 голосов
/ 27 апреля 2018

Вот несколько способов сделать это.

Вы можете добавить этот скрипт в другой файл Javascript и импортировать его в свой раздел скриптов в файле .vue.

<script>
import numberToWords from 'utils';
....   
</script>

Или вы можете создать метод в вашем компоненте с этой функцией внутри него.

На мой взгляд, первая версия лучше, потому что вы можете использовать ее во всех ваших компонентах.

...