不能在 VueJS 和 Laravel/Spark 中使用 @johmun/vue-tags-input

Can not use @johmun/vue-tags-input with VueJS and Laravel/Spark

我目前使用 VueJS/Laravel/Spark 设置了一个新的 playground,并希望实现标签输入组件。

我不明白如何正确注册这些组件。我正在按照操作指南和官方文档进行操作,但实施效果一般。

我想从@johmun -> http://www.vue-tags-input.com 实现我通过 npm (npm install @johmun/vue-tags-input) 安装的库。

我创建了一个名为 VueTagsInput.vue 的单个文件组件,如下所示:

<template>
  <div>
    <vue-tags-input
      v-model="tag"
      :tags="tags"
      @tags-changed="newTags => tags = newTags"
      :autocomplete-items="filteredItems"
    />
  </div>
</template>

<script>
import VueTagsInput from '@johmun/vue-tags-input';

export default {
  components: {
    VueTagsInput,
  },
  data() {
    return {
      tag: '',
      tags: [],
      autocompleteItems: [{
        text: 'Spain',
      }, {
        text: 'France',
      }, {
        text: 'USA',
      }, {
        text: 'Germany',
      }, {
        text: 'China',
      }],
    };
  },
  computed: {
    filteredItems() {
      return this.autocompleteItems.filter(i => {
        return i.text.toLowerCase().indexOf(this.tag.toLowerCase()) !== -1;
      });
    },
  },
};
</script>

我在 resources/js/bootstrap.js 导入了这个单个文件组件,如下所示:

import VueTagsInput from './VueTagsInput.vue'

我在 home.blade.php 视图中使用这个组件是这样的:

<vue-tags-input v-model="tag" 
                autocomplete-always-open 
                add-from-paste 
                allow-edit-tags>
</vue-tags-input>

这呈现了一个输入,我可以根据需要与之交互,但我不能对上面输入的国家使用自动完成功能,并且控制台还会抛出以下错误:

[Vue warn]: Property or method "tag" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

我不知道我做错了什么。

所以我通过反复试验偶然发现了解决方案。

首先,我必须在 resources/js/bootstrap.js 中以正确的方式注册组件,如下所示:

import VueTagsInput from './VueTagsInput.vue'
Vue.component('vue-tags-input', VueTagsInput);

但这导致了另一个错误,因为我在组件注册本身中调用了组件。为了克服这个错误,我在单文件组件中使用了名称选项。我给新创建的组件取了一个不同的名称,如下所示:

<template>
  <div>
    <johmun-vue-tags-input
      v-model="tag"
      :tags="tags"
      @tags-changed="newTags => tags = newTags"
      :autocomplete-items="filteredItems"
    />
  </div>
</template>

<script>
import JohmunVueTagsInput from '@johmun/vue-tags-input';

export default {
  name: "VueTagsInput",
  components: {
    JohmunVueTagsInput,
  },
  data() {
    return {
      tag: '',
      tags: [],
      autocompleteItems: [{
        text: 'Spain',
      }, {
        text: 'France',
      }, {
        text: 'USA',
      }, {
        text: 'Germany',
      }, {
        text: 'China',
      }],
    };
  },
  computed: {
    filteredItems() {
      return this.autocompleteItems.filter(i => {
        return i.text.toLowerCase().indexOf(this.tag.toLowerCase()) !== -1;
      });
    },
  },
};
</script>