我有一个Vue 2项目,有很多(50+)single-file components个.我使用Vue路由进行路由,Vuex用于状态.

有一个名为helpers.js的文件,其中包含一系列通用函数,例如将字符串的第一个字母大写.此文件如下所示:

export default {
  capitalizeFirstLetter(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
  }
}

My main.js文件初始化应用程序:

import Vue from 'vue'
import VueResource from "vue-resource"
import store from "./store"
import Router from "./router"
import App from "./components/App.vue"

Vue.use(VueResource)

const app = new Vue({
  router: Router,
  store,
  template: '<app></app>',
  components: { App },
}).$mount('#app')

My App.vue文件包含以下模板:

<template>
  <navbar></navbar>
  <div class="container">
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // stuff
    }
  }
}
</script>

然后,我有一堆单文件组件,Vue Router可以处理这些组件,导航到应用程序中的<router-view>标签内.vue模板.

现在假设我需要在SomeComponent.vue中定义的组件中使用capitalizeFirstLetter()函数.为了做到这一点,我首先需要导入它:

<template>Some Component</template>

<script>
import {capitalizeFirstLetter} from '../helpers.js'
export default {
  data() {
    return {
      myString = "test"
    }
  },
  created() {
    var newString = this.capitalizeFirstLetter(this.myString)
  }
}
</script>

这很快就会成为一个问题,因为我最终将函数导入到许多不同的组件中,如果不是全部的话.这似乎是重复的,也使项目更难维护.例如,如果我想重命名助手.js或其中的函数,然后我需要进入导入它的每个组件,并修改import语句.

Long story short:如何在助手中实现这些功能.js globally可用,这样我就可以在any组件内调用它们,而不必先导入它们,然后在函数名前加上this?我基本上希望能够做到这一点:

<script>
export default {
  data() {
    return {
      myString = "test"
    }
  },
  created() {
    var newString = capitalizeFirstLetter(this.myString)
  }
}
</script>

推荐答案

在任何组件中,无需首先导入它们,然后将其前置到函数名

你描述的是mixin.

Vue.mixin({
  methods: {
    capitalizeFirstLetter: str => str.charAt(0).toUpperCase() + str.slice(1);
  }
})

这是一个全球性的融合.这样,所有组件都将有一个capitalizeFirstLetter方法,所以您可以从组件方法调用this.capitalizeFirstLetter(...),也可以在组件模板中直接调用capitalizeFirstLetter(...).

工作示例:http://codepen.io/CodinCat/pen/LWRVGQ?editors=1010

参见此处的文档:https://vuejs.org/v2/guide/mixins.html

Vue.js相关问答推荐

V-img不显示文件夹中的图像

写入计算值时出错,但我没有写入任何值

当用户在嵌套路由中时激活链接

Nuxt.js 中的开发工具样式编辑问题

使用上传组件而不触发 POST 请求

从组件的 内的组件调用方法

如何将对象作为props传递并让组件更新子对象

将检测外部点击自定义指令从 Vue 2 迁移到 Vue 3

使用 Vue.js (cdn) 在特定元素上切换显示/隐藏

如何在nuxt路由中添加meta?

Angular 5 中的 功能

Vue.js 处理多次点击事件

为什么 Vue.js 使用 VDOM?

按键删除对象不会更新vue组件

axios 拦截器响应未定义

在 nuxt.js 页面中包含外部 javascript 文件

在 VUE JS 的光标位置插入字符

Vuetify RTL 风格

使用 Vuetify 的可滚动数据表

如何在布局中使用组件?