vue组件以使用常见功能

时间:2018-08-21 16:02:27

标签: vue.js components

我希望了解Vue CLI3项目系统。当前将内嵌vue的单个长html文件重构为真正的“ .vue”组件。一个目标是在vue组件之间使用一些通用功能来处理各种事情。 在我的common-functions.js文件中,我有类似以下内容:

function capitalize(str) {
    return str[0].toUpperCase() + str.substr(1, );
};

在我的HelloWorld.vue文件中,我已经找到了它,并且它在许多尝试中都无法正常工作。我发现所有搜索似乎都在处理其他问题,肯定有一种简单的方法可以使用一些常用功能,对吗?

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <ul>
      <li v-for='c in categoryNames'>{{ c }}</li>
    </ul>
  </div>
</template>

<script>

  require('../js/common-functions.js');

  export default {
    name: 'HelloWorld',
    data () {
      return {
        msg: capitalize('welcome to Your Vue.js App!'),
        categoryNames : this.$root.categoryNames
      }
    }
  }

</script>

消息当然是:

[Vue warn]: Error in data(): "ReferenceError: capitalize is not defined"

found in

---> <HelloWorld> at src/components/HelloWorld.vue
       <App> at src/App.vue
         <Root>

2 个答案:

答案 0 :(得分:1)

common-functions.js的末尾,导出函数:

export default capitalize;

然后在HelloWorld.vue中,将其导入:

import capitalize from '../js/common-functions.js';
// this should replace the require line

答案 1 :(得分:1)

一种解决方案:

通过Vue.use()将全局函数注册到Vue.prototype

就像下面的演示一样:

let myGlobalAPIGroup1 = { // API Group 1
  install: function (_Vue) {
    if(!_Vue.prototype.$apiGroup1) {
      _Vue.prototype.$apiGroup1 = {}
    }
    _Vue.prototype.$apiGroup1.capitalize = function (str) {
      return str[0].toUpperCase() + str.substr(1, );
    }
  }
}

let myGlobalAPIGroup2 = { // API Group 2
  install: function (_Vue) {
    if(!_Vue.prototype.$apiGroup2) {
      _Vue.prototype.$apiGroup2 = {}
    }
    _Vue.prototype.$apiGroup2.capitalize = function (str) {
      return str[0].toUpperCase() + str.substr(1, ) + '@';
    }
  }
}

Vue.use(myGlobalAPIGroup1) //register
Vue.use(myGlobalAPIGroup2) //register

new Vue({
  el: '#app',
  data() {
    return {
      testValues: ['label a', 'label b'],
    }
  },
  methods:{
    testAPI1: function(item) {
      return this.$apiGroup1.capitalize(item)
    },
    testAPI2: function(item) {
      return this.$apiGroup2.capitalize(item)
    }
  }
})
#app > div {
  display: inline-block;
  margin-left: 5px;
  border: 1px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>
<div id="app">
  <div>
    <h3>Group 1:</h3>
    <p v-for="(item, index) in testValues" :key="index">{{testAPI1(item)}}</p>
  </div>

  <div>
    <h3>Group 2:</h3>
    <p v-for="(item, index) in testValues" :key="index">{{testAPI2(item)}}</p>
  </div>
</div>