一 全局组件注册与多个组件注册到单个组件中
背景:
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.js
、order.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
activated
和deactivated
在<keep-alive>
树内的所有嵌套组件中触发
activated
: 离开页面触发
deactivated
: 在进入页面时触发
include
和exclude
属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示
<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>