Vue的小技巧

1.自动注册组件(require.context)

Vue的小技巧_第1张图片

components/index.js  将其封装成vue插件,提供install

const requireComponents = require.context("./common", false, /\.vue$/);

console.log(requireComponents.prototype);

function toFirstUpper(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}

const install = Vue => {
  // requireComponents.keys()----["./MyButton.vue"]
  requireComponents.keys().forEach(filename => {
    const config = requireComponents(filename); //vue的实例
    // filename ---- ./MyButton.vue
    // 进行转化得到 MyButton,另外防止有小写,进行首字母转化
    const componentName = toFirstUpper(
      filename.replace(/\.\//, "").replace(/\.\w+$/, "")
    );
    // 全局注册组件
    Vue.component(componentName, config.default || config);
  });
};

export default {
  install
};

main.js 使用插件

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import MyComponent from "./components/index";
Vue.use(MyComponent); //使用自动注册的插件

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount("#app");

Home.vue  页面演示,因为是全局注册的,可以直接使用




components/common/MyButton.vue






Vue的小技巧_第2张图片

2. 同样,可以用require.context来自动注册路由

Vue的小技巧_第3张图片

router/index.js  路由的注册

import Vue from "vue";
import VueRouter from "vue-router";

Vue.use(VueRouter);

let routes = [];

//根据目录下的文件,自动进行路由的注册
const requireViews = require.context("@/views", true, /\.vue$/);

requireViews.keys().forEach(filename => {
  // ["./About.vue", "./Home.vue"]
  const view = filename.replace(/\.\//, "").replace(/\.\w+$/, "");
  /**
   * path 进行小写
   * name的话有目录嵌套就用-隔开,字母小写
   * component 用路由懒加载
   */
  const route = {
    path: `/${view.toLowerCase()}`,
    name: view.toLowerCase().replace("/", "-"),
    component: () =>
      import(/* webpackChunkName: "about" */ `../views/${view}.vue`)
  };
  routes.push(route);
  console.log(routes);
});

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes
});

export default router;

效果如下:

Vue的小技巧_第4张图片

你可能感兴趣的:(vue,js)