原本想把el-row和el-col放在同一篇来写,然鹅发现对于一个菜鸟来讲,简单的el-row(它不简单)已经让我学到不少。css
这是个人row.js文件vue
模仿代码中均以el-test 替换el, 目的是为了边模仿边测试和el组件的效果对比编程
export default {
// 驼峰命名法
name: 'ElTestRow',
props: {
gutter: Number,
// 渲染的标签类型
tag: {
type: String,
default: 'div'
},
//是否使用flex布局
type: String,
justify: {
type: String,
default: 'start'
},
align: {
type: String,
default: 'top'
}
},
render(h) {
let classStyle = []
let style = {}
//为何在设置gutter的时候 父组件要设置margin? 是为了保证col第一个和最后一个仍然贴紧row的左侧和右侧 可是这样作会撑开el-row
if (this.gutter) {
style.marginLeft = `-${this.gutter/2}px`
style.marginRight = style.marginLeft
}
classStyle = [
'el-test-row',
this.justify !== 'start' ? `is-justify-content-${this.justify}` : '',
this.align !== 'top' ? `is-align-items-${this.align}` : '',
{'el-test-row-flex': this.type === 'flex'}
]
return h(this.tag,{
class: classStyle,
style
}, this.$slots.default)
},
}
复制代码
用render函数形式建立插件el-row。在VUE官网上有说Vue 推荐在绝大多数状况下使用模板来建立你的 HTML。然而在一些场景中,你真的须要 JavaScript 的彻底编程的能力。这时你能够用渲染函数,它比模板更接近编译器。
。简单来讲我感受就是render有更快的编译渲染速度?(感受是这个描述)。另外,感受render在某些时候相对于template
更加灵活一点,你能够想一下若是用template
row组件该怎么写。缓存
关于render函数该如何使用,我以为看官网就够了cn.vuejs.org/v2/guide/re…。不要怕,写就完了! 在仿制过程当中产生了疑问,在element的row.js中 是使用计算属性监控gutterbash
computed: {
style() {
const ret = {};
if (this.gutter) {
ret.marginLeft = `-${this.gutter / 2}px`;
ret.marginRight = ret.marginLeft;
}
return ret;
}
},
复制代码
**疑问一:为何要使用计算属性来改变style?(已解决于2019年7月10日,见文章尾)ide
在个人row文件中,我并无使用计算属性判断gutter的改变,可是在测试过程当中,改变gutter,视图同样会发生变化,因此我不是太理解为何要使用
computed
函数
学到了两个方面的内容布局
两个class连写
class1>class2 两个class之间有>号 表明选择父级为class1的全部class2
class1 class2 两个class 之间有空格 表明class1内部的全部class2 class2出如今class1的子级元素才会有效果
class1class2 两个class之间无空格 表明两个class出如今同一个元素上 class2才会有效果
class1,class2 两个class之间有逗号 表明选择全部的class1,class2
复制代码
.el-test-row:after{
content: '';
clear: both;
display: block;
}
复制代码
同时我就看到element的row.css在class先后都添加了伪类性能
.el-row::after,
.el-row::before {
display: table;
content: "";
}
复制代码
疑问2 为何先后都要加伪类,不是很懂(我以为加一个就够了😂)学习
在使用gutter的时候,element会在class el-row
先后分别添加margin-left margin-right
,以确保位于最左和最右的el-col
是和el-row
无间隔(目前我认为是这样)可是这样会撑开el-row的边框,所以在我觉得,gutter可能须要一些优化,保证gutter不会撑开el-row的宽度。
render
函数在每一次有变量改变的时候都会触发,gutter
的改变会触发style
的改变,render
也会跟着再次执行,可是若是按照我原来的写法把gutter改变致使样式改变写到render里面
,那么在每一次render
执行的时候都会去从新计算style
,这是很没有必要的,好比说咱们改变的是type
、jutify
这时候咱们并不须要从新计算style
,这时候style
的值直接取缓存里面的就成,减小了重复计算style
,优化了性能。
PS:由大佬总结来的一句话就是 computed有缓存
。一位不爱负责的大佬