2 注意到子组件的 @focus="$emit('focus', $event)"
其实什么都没做,只是把event传回给父组件而已,那其实和上面类似,完全没必要显式地申明:
<input :value="value" v-bind="$attrs" v-on="listeners"/> computed: { listeners() { return { ...this.$listeners, input: event => this.$emit('input', event.target.value) } } }
$listeners 包含了父作用域中的 (不含 .native 修饰器的)v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。
需要注意的是,由于我们input并不是BaseInput这个组件的根节点,而默认情况下父作用域的不被认作 props 的特性绑定将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。所以我们需要设置 inheritAttrs: false ,这些默认行为将会被去掉,以上两点的优化才能成功。
6. 路由根据开发状态懒加载
6.1 一般情况
一般我们在路由中加载组件的时候:
import Login from '@/views/login.vue' export default new Router({ routes: [{ path: '/login', name: '登陆', component: Login}] })
当你需要懒加载 lazy-loading 的时候,需要一个个把routes的component改为 () => import('@/views/login.vue') ,甚为麻烦。
当你的项目页面越来越多之后,在开发环境之中使用 lazy-loading 会变得不太合适,每次更改代码触发热更新都会变得非常的慢。所以建议只在生成环境之中使用路由懒加载功能。
6.2 优化
根据Vue的异步组件和Webpack的代码分割功能可以轻松实现组件的懒加载,如:
const Foo = () => import('./Foo.vue')
在区分开发环境与生产环境时,可以在路由文件夹下分别新建两个文件: _import_production.js
module.exports = file => () => import('@/views/' + file + '.vue')
_import_development.js ,这种写法 vue-loader 版本至少v13.0.0以上
module.exports = file => require('@/views/' + file + '.vue').default
而在设置路由的 router/index.js 文件中:
const _import = require('./_import_' + process.env.NODE_ENV) export default new Router({ routes: [{ path: '/login', name: '登陆', component: _import('login/index') }] })
这样组件在开发环境下就是非懒加载,生产环境下就是懒加载的了
7 vue-loader小技巧
vue-loader 是处理 *.vue 文件的 webpack loader。它本身提供了丰富的 API,有些 API 很实用但很少被人熟知。例如接下来要介绍的 preserveWhitespace 和 transformToRequire