vue面试七: 全局组件注册与多个组件注册到单个组件中、什么是路由分区?、Vue动态组件与缓存?

一 全局组件注册与多个组件注册到单个组件中

背景:
1 path.basename用法
2 keys()用法
3 require.context()的用法

path.basename('/foo/bar/baz/asdf/quux.html');
// 返回: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// 返回: 'quux'

var obj = { a: 'alive', b: 'bike', c: 'color' };
console.log(Object.keys(obj)); // console: ['a', 'b', 'c']
/*
require.context(directory,useSubdirectories,regExp)

directory:表示检索的目录
useSubdirectories:表示是否检索子文件夹
regExp:匹配文件的正则表达式,一般是文件名
例如 require.context("@/views/components",false,/.vue$/)

*/
const path = require('path')    // 获取文件
const files = require.context('@/components/home', false, /\.vue$/)   // 获取components/home 下的vue文件
const modules = {} //  创建对象用于存文件的名字
files.keys().forEach(key => {
  const name = path.basename(key, '.vue')  // 获取文件的名字
  modules[name] = files(key).default || files(key)  // 赋值
})
export default{
    ...
    components:modules
}

import Vue from 'vue'
// 自定义组件
const requireComponents = require.context('../views/components', true, /\.vue/)
// 打印结果
// 遍历出每个组件的路径
requireComponents.keys().forEach(fileName => {
  // 组件实例
  const reqCom = requireComponents(fileName)
  // 截取路径作为组件名
  const reqComName =reqCom.name|| fileName.replace(/\.\/(.*)\.vue/,'$1')
  // 组件挂载
  Vue.component(reqComName, reqCom.default || reqCom)
})

二 什么是路由分区?

1 新建文件 logn.router.js order.router.js

export default {
    path: '/login',
    name: 'login',
    component: () => import('../views/login.vue'),
    children: [
    
    ]
}
export default {
    path: '/order',
    name: 'order',
    component: () => import('../views/order.vue'),
    children: [
    
    ]
}

2 在 router.js中 引入 login.router.jsorder.router.js

import Vue from "vue";
import Router from "vue-router";
import Login from './routers/login.router.js';
import Order from './routers/order.router.js';
import Home from './views/home/home';

Vue.use(Router);

export default new Router({
    routes: [
        { path: '/home', name: 'home', component: Home},
        Login,
        Order    
    ]
});

结合 require.context 使用路由分区

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

Vue.use(Router);

const routerList = [];
function importAll (r) {
    r.keys().forEach(
        key => routerList.push(r(key).default);
    );
}

importAll(require.context('./router', true, /\.router\.js/));
export default new Router({
    routes: [
        { path: '/home', name: 'home', component: Home} 
        ...routerList  // 解构
    ]
});

三 Vue动态组件与缓存?

让多个组件使用同一个挂载点,并动态切换,这就是动态组件。本文将详细介绍Vue动态组件

<div id="example">
  <button @click="change">切换页面</button>
  <component :is="currentView"></component>   //is 是那个组件就切换到那个组件
</div>
<script>
var home = {template:'<div>我是主页</div>'};
var post = {template:'<div>我是提交页</div>'};
var archive = {template:'<div>我是存档页</div>'};
new Vue({
  el: '#example',
  components: {
    home,
    post,
    archive,
  },
  data:{
    index:0,
    arr:['home','post','archive'],
  },
  computed:{
    currentView(){
        return this.arr[this.index];
    }
  },
  methods:{
    change(){
      this.index = (++this.index)%3;
    }
  }
})
</script>

缓存

keep-alive

activateddeactivated<keep-alive>树内的所有嵌套组件中触发
activated : 离开页面触发
deactivated : 在进入页面时触发

includeexclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示

<div id="example">
  <button @click="change">切换页面</button>
  <keep-alive include="home,archive">
    <component :is="currentView"></component> 
  </keep-alive>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
new Vue({
  el: '#example',
  data:{
    index:0,   
    arr:[
      {name:'home',template:`<div>我是主页</div>`},
      {name:'posts',template:`<div>我是提交页</div>`},
      {name:'archive',template:`<div>我是存档页</div>`}
    ],
  },
  computed:{
    currentView(){
        return this.arr[this.index];
    }
  },
  methods:{
    change(){
      var len = this.arr.length;
      this.index = (++this.index)% len;
    },
  }
})
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值