函数式编程合集
vue加载时文件的执行顺序
- 执行index.html文件
- 执行main.js文件
- main.js挂载了app.vue文件,用app.vue的templete替换index.html中的
- main.js中注入了路由文件,将对应的组件渲染到router-view中
- router-view中加载Layout文件
- Layout 加载Navbar, Sidebar, AppMain 这里有两个问题
- 为什么项目启动时默认显示index.html文件
- 为什么默认加载main.js文件 这两个都在webpack中有相应的配置,可在配置文件中查看
vue-router中,require代替import解决vue项目首页加载时间过久的问题
vue的路由配置文件(routers.js),一般使用import引入的写法,当项目打包时路由里的所有component都会打包在一个js中,在项目刚进入首页的时候,就会加载所有的组件,所以导致首页加载较慢,而用require会将component分别打包成不同的js,按需加载,访问此路由时才会加载这个js,所以就避免进入首页时加载内容过多。
require: 运行时调用,理论上可以运用在代码的任何地方,import:编译时调用,必须放在文件开头
示例: import写法:
import userCenter from '@/page/usercenter/index.vue'
export default [
{
path: '/userCenter',
name: 'user-center',
component: userCenter
},
{
path: '/news/detail',
name: 'news-detail',
component: () => import('@/page/news/detail.vue')
}
]
require写法:
export default [
{
path: '/userCenter',
name: 'user-center',
component: resolve => require(['@/page/userCenter/index.vue'], resolve)
},
{
path: '/news/detail',
name: 'news-detail',
component: () => resolve => require(['@/page/news/detail.vue'], resolve)
}
]
v-model
在官网我们可以得知,v-model只是语法糖而已。 语法糖:也译为糖衣语法,主要是方便程序员使用,通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
v-model在input元素上时 第一行的代码其实只是第二行的语法糖
<input v-model="sth" />
<input v-bind:value="sth" v-on:input="sth = $event.target.value" />
然后第二行代码还能简写成这样:
<input :value="sth" @input="sth = $event.target.value" />
要理解这行代码,首先你要知道 input 元素本身有个 oninput 事件,这是 HTML5 新增加的,类似 onchange ,每当输入框内容发生变化时,就会触发oninput,把最新的value传递给 sth。
我们仔细观察语法糖和原始语法那两行代码,可以得出一个结论:
在给<input />元素添加v-model属性时,默认会把value作为元素的属性,然后把'input'事件作为实时传递value的触发事件
Vue自定义组件通过v-model通信
model:
- model的类型定义如下,它有两个属性 prop、event v-model默认情况如下:
- prop: 默认绑定的是value
- event: 默认触发的事件类型是input
<my-checkbox v-model="foo" value="some value"></my-checkbox>
Vue.component('my-checkbox', {
model: {
prop: 'checked',
event: 'change'
},
})
Vue.component('my-checkbox', {
model: {
prop: 'checked',
event: 'change'
},
props: {
// this allows using the `value` prop for a different purpose
value: String,
// use `checked` as the prop which take the place of `value`
checked: {
type: Number,
default: 0
}
},
// ...
})
<my-checkbox v-model="foo" value="some value"></my-checkbox>
以上代码等价于:
<my-checkbox
:checked="foo"
@change="val => { foo = val }"
value="some value">
</my-checkbox>
不简写
<my-checkbox
v-bind:checked="foo"
v-on:change="function(val) {return foo = val }"
value="some value">
</my-checkbox>
插槽
baijiahao.baidu.com/s?id=166754…
sass-resources-loader
ui组件
jenkins
npm i npm rebuild node-sass npm run dist npm publish npm run build
关于使用element中的popup问题
1.前言 我们知道弹出框都是在触发了某种条件后展示,而一个个的新的弹出框的展示,总是覆盖着上一个弹出框。实现覆盖功能需要保证新的弹出框的z-index要比旧的弹出框的z-index值相等或着更高,为达到这个目的element为所有的弹出框(所有下拉框、提示框、Dialog对话框等等)直接或间接的使用到一个js组件element-ui/src/utils/vue-popper,而这个vue-popper又使用了另一个组件element-ui/src/utils/popup/popup-manager.js。
PopupManager PopupManager中有一个zIndex属性初始值为2000,所有的弹出框的z-index其实都是从这个PopupManager.zIndex中获取的,当要展示一个新的弹出框时,组件便会去获取最新的PopupManager.zIndex,然后为PopupManager.zIndex加1,这样就保证了新的弹出框总是比旧的弹出框z-index大,省去自己一个个设置的麻烦,也减少问题的出现。
2.遇到的问题 element本身的弹出框没有什么问题,问题在于我们擅自使用了element未直接暴露出来的组件,这里以el-select中的select-dropdown.vue为例。 我们通过拷贝el-select源码来定制下拉框的内容和逻辑,一切看起来都很完美,但是有一个致命的问题,自己定制的选择器的下拉框总是会出现时不时无法展示的问题,要疯狂点击才会展示。排查后发现就是z-index的值问题,自定义的下拉框的z-index总是无法跟原生的弹出框z-index同步,原因其实很简单。。。使用的不是同一个PopupManager 原来我们直接复制el-select源码,源码中引入下拉框 import ElSelectMenu from './select-dropdown.vue' 我们修改为 import ElSelectMenu from 'element-ui/packages/select/src/select-dropdown.vue' 再来看select-dropdown.vue源码中对于vue-popper的引用 import Popper from 'element-ui/src/utils/vue-popper' 没毛病,但是其实毛病就出在这引用路径上的src,src就是source源的意思,源码中互相引用没问题,但是我们在项目中使用element组件的使用,并不是来自源码,而是来自源码编译出来的依赖库,是npm模块中lib目录下的文件。所以我们的自定义组件用了一个新的PopupManager对象跟原生element组件不同的PopupManager,导致zIndex不同步,展示错误。
3.解决 复制select-dropdown.vue,将原先 import Popper from 'element-ui/src/utils/vue-popper' 修改为 import Popper from 'element-ui/lib/utils/vue-popper' el-select改引用为我们修改后的select-dropdown.vue。。。
4.最后 1.es6中import的每个模块都是单例的,同一个对象被所有引用共用 2.引用element中未暴露的组件时,要注意尽量使用lib下的,防止出现类似问题 3.引用npm包的某个文件时时,要注意引用其源码和编译后库的区别