跟随Element学习Vue小技巧(1)——Layout

1,861 阅读4分钟

Stay Hungry · Stay Foolish

前言

Layout布局,朋友,你认真的吗?这么简单的组件还要你来教我???

是的,我灰常认真,来,给你看一张我认真的亚子,嘻嘻嘻

生活无非是一日三餐,搞定三餐,剩下的还会遥远吗,嘿嘿嘿

你准备好了吗?我将带你踏上第一趟旅行!

坐稳,扶好,起飞咯!

1 Row

组件接口

什么?你没听过组件接口! 该说你什么好呢?
其实吧,我也没听过,现在总该听过了吧!
API接口知道吧,入参知道吧,出参知道吧
那么,重点来了,喀喀喀
说你呢,还不赶紧做笔记 组件接口 属性 方法 事件

代码片段

props: {
  tag: {
    typeString,
    default: 'div'
  },
  gutter: Number,
  typeString,
  justify: {
    typeString,
    default: 'start'
  },
  align: {
    typeString,
    default: 'top'
  }
}

技巧解析

你看出什么来了吗?
我是一个组件,我可以接受如下参数
tag 我默认是div,保持沉默就好,小心枪打出头鸟哟
gutter 我只接收数字类型,小样,字符串还行蒙混过关
type 我只接收字符串类型,注意刷卡哟
justify 我默认是start,万事开头难,当缩头乌龟也可以
align 我默认是top,我的寂寞有谁懂

自定义属性

什么,你从来没有用过?
偷偷告诉你,我也没用过 收下这波骚操作,在妹纸面前好好秀一秀
多瑞米发索拉喜多, 动起来...

代码片段

componentName'ElRow',
gutter() {
  ...
  while (parent && parent.$options.componentName !== 'ElRow')
  ...
}

技巧解析

componentName: 我适应不了这个世界,于是我创造了属于自己的世界
gutter: 小鬼,站起来,说的就是你,我忍你很久了
想要被发现了,就得跟别人不一样!!

margin负值

啥?margin还可以是负值
那么,长胖了也能瘦回去咯

代码片段

style() {
  const ret = {};

  if (this.gutter) {
    ret.marginLeft = `-${this.gutter / 2}px`;
    ret.marginRight = ret.marginLeft;
  }

  return ret;
}

技巧解析

姓名 年龄 工作
小可爱 18 吃可爱多
200 200 200

什么,一下子吃到了200斤,哈哈哈
200只是盒子宽度而已,总宽度不就是 200 * 3 = 600
间隔20呢,不是得 200 * 3 + 20 * 2 = 640
可是盒子box左右margin各为10,算下来(200 + 20)* 3 = 660
平白无故多出了20斤赘肉,好可怕!!!
不怕不怕,给外层wrap左右margin设为-10,吸口气,往里缩20斤
所以 (200 + 20)* 3 - 10 * 2 = 640
简直是完美

render函数

这个,感觉挺高深的,一脸懵逼的样子??? 大佬别急,且听小白我慢慢道来

代码片段

render(h) {
  return h(this.tag, {
    class: [
      'el-row',
      this.justify !== 'start' ? `is-justify-${this.justify}` : '',
      this.align !== 'top' ? `is-align-${this.align}` : '',
      { 'el-row--flex'this.type === 'flex' }
    ],
    style: this.style
  }, this.$slots.default);
}

技巧解析

拿起手术刀,开始动手术咯
我一刀下去,h(tag, {}, text)
是不是瞬间不那么高大上了
大佬请看,<div class="el-row">我是默认内容<div>
找到感觉没? 哦,原来是html拆解啊

  • tag: div
  • {class: 'el-row'}
  • 我是默认内容
    那么,this.$slots.default是个啥东东咧?
    不急,不急,咱们的旅行长着呢

好累!好累!我先休息一会儿

好累!好累!让我在偷个懒嘛

2 Col

组件通信

喂?你在吗?
在的
喂?你还在吗?
在的
喂?你在吗?
在的
喂?你会一直在吗?
我会一直在的
这波狗粮,还够吃吗?

你回来,看我不告诉你爸,打死你!!!

代码片段

gutter() {
  let parent = this.$parent;
}

技巧解析

this: 这是我,是我
this: 下面请我老爸闪亮登场 this.$children
this: 走开,儿子被闹
this.$children:爷爷,爸爸他偏心
this.$parent:孩子他爸,让咱孙子亲自尝试一回 所以呀,不要只想着从父亲那么索取,而一味溺爱孩子 也该让孩子做点贡献,自己尽心赡养父母

父链子链, 你学会了吗?

class遍历

来,把这个搬过来
嗯,把这个也搬过来
嗯...,还有这个
嗯...,这个,统统搬过来
你妹的,就不能一次说完吗,我直接遍历一波带走

代码片段

['span''offset''pull''push'].forEach(prop => {
  if (this[prop] || this[prop] === 0) {
    classList.push(
      prop !== 'span'
        ? `el-col-${prop}-${this[prop]}`
        : `el-col-${this[prop]}`
    );
  }
});

技巧解析

很简单,有木有
我怕多说一句是对你们的侮辱!

对象遍历

你对象还好吗?
我对象很好啊,我对。。牛也很好,对猫也很好,对狗也很好,对谁都挺好的

代码片段

Object.keys(props).forEach(prop => {
  classList.push(
    prop !== 'span'
      ? `el-col-${size}-${prop}-${props[prop]}`
      : `el-col-${size}-${props[prop]}`
  );
})

技巧解析

对象,还遍历,渣男!
传统遍历 for(let key in props)
花式遍历 Object.keys(props).forEach()
送你小花花

还在装逼,不累吗?

不装了,我睡觉了

我是一只只有七秒记忆的鱼

却妄想带你踏上一场奇妙的旅行

参考链接