ElementUI源码分析-Row和Col组件

一、简述

  • ElementUI的row组件和col组件属于里面的layout部分,通过基础的 24 分栏,能快速的创建布局。
  • 通过 row 和 col 组件,并通过 col 组件的 span 属性我们就可以自由地组合布局。

二、解读源码

  • 通过参照源码,从新实现了一遍row和col;

三、Row

  • 以下是ElementUI中的源码:
export default {
  name: 'BsRow', // 组件的name
  componentName: 'BsRow', // 组件名,主要用于会被子组件获取
  props: {
    tag: { // 通过传入的tag,来渲染不同的标签
      type: String,
      default: 'div'
    },
    gutter: Number,// 通过gutter来控制row中的元素之间的间隔
    type: String, // 控制是否以flex进行布局
    justify: { // flex元素中水平排列规则
      type: String,
      default: 'start'
    },
    align: {
      type: String,
      default: 'top'
    }
  },
  computed: {
    style() {
      const ret = {}; // 计算样式
      if(this.gutter) {
        ret.marginLeft = `${this.gutter / 2}px`;
        ret.marginRight = ret.marginLeft;
      }
      return ret;
    }
  },
  render(h) {
    // 返回dom元素
    return h(this.tag, {
      class: [
        'bs-row',
        this.justify !== 'start'? `is-justify-${this.justify}`: '',
        this.align !== 'top'? `is-align-${this.align}`: '',
        {'bs-row-flex': this.type === 'flex'}
      ],
      style: this.style
    }, this.$slots.default)
  }
}
  • 注释明确说明了传入的每个属性的用处

3.1 computed

  • computed里主要是用于计算样式
 style() {
      const ret = {}; // 计算样式
      if(this.gutter) {
        ret.marginLeft = `-${this.gutter / 2}px`;
        ret.marginRight = ret.marginLeft;
      }
      return ret;
    }
  },
  • 这段代码主要是通过gutter来设置row内部的元素间隔,因为设置了子元素的padding来控制间隔,所以首尾也会有间隔,我们通过将margin设置为负值即可解决

3.2 render函数

  • render函数主要是用于渲染dom元素的,这就是采用了jsx的写法;通过返回一个h函数来创建一个组件
render(h) {
    return h(this.tag, { // 自定义渲染标签
      class: [
        bs-row', // 组件基本样式
        this.justify !== 'start' ? `is-justify-${this.justify}` : '', // 水平排列样式名生成
        this.align !== 'top' ? `is-align-${this.align}` : '', // 垂直排列样式名生成
        { 'bs-row--flex': this.type === 'flex' } // flex布局样式
      ],
      style: this.style
    }, this.$slots.default);
}

  • 关于组件的样式主要是利用了BEM的scss写法来控制css样式

四、Col

  • col源码如下:

export default {
  name: 'BsCol', // 组件名
  props: {
    span: { // 每个组件占据的比例
      type: Number,
      default: 24,
    },
    tag: {
      type: String, // 自定义渲染标签
      default: 'div'
    },
    offset: Number, // 栅格左侧间隔数
    pull: Number, // 栅格向右移动格数
    push: Number,// 栅格向左移动格数
    xs: [Number, Object], // <768px 响应式栅格数或者栅格属性对象
    sm: [Number, Object], // ≥768px 响应式栅格数或者栅格属性对象
    md: [Number, Object],// ≥992px 响应式栅格数或者栅格属性对象
    lg: [Number, Object],// ≥1200px 响应式栅格数或者栅格属性对象
    xl: [Number, Object],// ≥1920px 响应式栅格数或者栅格属性对象
  },
  computed: {
    gutter() {
      // 获取父元素, 反向递归查找第一个名为BsRow的父组件
      let parent = this.$parent;
      while(parent && parent.$options.componentName !== 'BsRow') {
        parent = parent.$parent;
      }
      return parent ? parent.gutter : 0
    }
  },
  render(h) {
    let classList = [];
    let style = {};
     // 通过父组件的gutter生成自生的padding-left与padding-right
    if(this.gutter) {
      style.paddingLeft = this.gutter / 2 + 'px';
      style.paddingRight = style.paddingLeft;
    }
  	// 这里逻辑是通过比对props对象,生成对应的CSS规则
    ['span', 'offet', 'pull', 'push'].forEach(prop => {
      if(this[prop] || this.prop === 0) {
        classList.push(
          prop !== 'span'
            ? `bs-col-${prop}-${this[prop]}`
            : `bs-col-${this[prop]}`
        )
      }
    });
    ['xs', 'sm', 'md', 'lg', 'xl'].forEach(size => {
      if(typeof this[size] === 'object') {
        let props = this[size];
        Object.keys(props).forEach( prop => {
          classList.push(
            prop !== 'span'
              ? `bs-col-${size}-${prop}-${props[prop]}`
              : `bs-col-${size}-${props[prop]}`
          )
        })
      }
    });
    return h(this.tag, {
      class: ['bs-col', classList],
      style
    }, this.$slots.default)
  }
}
  • 同样的通过传入的值,来生成css规则,从而实现响应式

原文地址:https://blog.csdn.net/weixin_42991716/article/details/118271808

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


el-menu 有个属性 :default-active="curActive"  el-menu-item有个属性:index=“home”这2个属性值对上号就自动定位了data(){ return{ curActive:"home" }; },
基础用法1<el-inputv-model="input1"palcehoder="请输入"></el-input>23varMain={4data(){5return{6input1:''7}8}9}10varCtor=Vue.extend(Main)11newCtor().$mount('#app&#03
 1.安装element-uinpminstallelement-ui-S 2.在main.js中importElementUIfrom'element-ui'import'element-ui/libheme-chalk/index.css'Vue.use(ElementUI)注意index.css的路径不要出错:在node_modules文件夹里node_modules\element-ui\lib\theme-c
layout布局通过基础的24分栏,可进行快速布局基础布局使用单一分栏创建基础的栅格布局,通过span属性指定每栏的大小<el-col:span="8"></el-col>1<el-row>2<el-col:span="8"><divclass="grid-contentbg-purple"></div>&
 今天做一个选择年份的功能,直接调用了ElementUI里面的DatePicker组件,官网上有该组件的用法介绍,讲得很清楚。 我的代码: 官网说明: 奇怪的事情发生了,我明明按照例子写了  value-format="yyyy" 可是获得的值却一直还是Date对象 仔细检查后,我突然发现我的v-model
  that.end 即为结束日期
vueelementUitree懒加载使用详情2018年11月21日11:17:04开心大表哥阅读数:3513 https://blog.csdn.net/a419419/article/details/84315751 背景:vue下使用elementUI文档:http://element-cn.eleme.io/#/zh-CN/componentree#tree-shu-xing-kong-jian需求:只保存二
环境搭建说明:1、全局安装angluar脚手架npminstall-g@angular/cli2、初始化项目(支持scss)ngnew项目名称--style=scss//进入项目cd项目名称运行代码可以是:serve或者npminstall(安装依赖)npmstart(运行)3、安装elementnpm
1、在写埋点监控项目的时候,需求是表格里面的数据后台传递过来为0,但是要求显示的时候为—,在elementUI判断,将prop去掉在下面加上<templateslot-scope="scope"><emplate>里面在写vue的判断,因为通过Scopedslot可以获取到row,column,$index和store(table内容的状态管理)的数据。2、
<el-table-columnprop="pubArea"//表格data中对应的字段column-key="pubArea"//过滤条件变化时根据此key判断是哪个表头的过滤label="报修类型"align="center"width=
1.npminstallbabel-plugin-component-D   然后.babelrc替换plugins 文件就在根目录下  2.组件中英文及自定义中英文importVueI18nfrom'vue-i18n'importenLocalefrom'element-ui/lib/locale/lang/en'importzhLocalefrom'element-ui/lib/locale/lang/zh-C
 <el-treeref="tree":data="menu.treeData":props="menu.defaultProps":filter-node-method="filterNode":expand-on-click-node=&quot
2019独角兽企业重金招聘Python工程师标准>>>使用vue+elementui的tree组件,elementui官网elementui的tree组件问题描述:tree层级过多时左右不可滚动问题解决:修改overflow属性值.el-tree-node>.el-tree-node_children{overflow:visible;} 其他相关链接:css--ov
首先elementUI的导航栏中的选中项的高亮显示时的字体颜色可以在属性中设置,但是高亮时的背景颜色不能设置,所以要自己修改高亮的背景颜色.el-menu-item.is-active{background-color:#00b4aa!important;} 在使用elementUI构建vue项目的时候会遇到页面刷新的时候子路由会保
1.首先创建Vue项目(使用vue-cli进行创建)创建项目文章指导地址: https://blog.csdn.net/assiduous_me/article/details/892086492.ElementUI:一套为开发者、设计师和产品经理准备的基于Vue2.0的桌面端组件库 链接地址:http://element.eleme.io/#/zh-CN3.正式开
使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用scss编写,用主题工具的方法(使用的较多)第一种方法:使用命令行主题工具使用vue-cli安装完项目并引
每页显示的序号都是一样的:<el-table:data="tableData"highlight-current-row@current-change="handleCurrentChange"><el-table-columntype="index"width="50"></el-table-column><el-table>根据
  记录一下自己踩的坑,控制element内的table的某列显示隐藏不能用v-show,而是要用v-if具体网上百度了,看一下v-show和v-if的区别吧猜测:由于el-table-column会生成多行标签元素,根据v-show是不支持template语法的,推断v-show不能显示隐藏多个元素 
样式重置单vue文件中重置全局重置多写一个style不加scrop,可能会影响全局样式待补充table单价数量小计3252?在ElementUI中,我需要获取row内的数据并进行计算,需要用到v-slot<el-table-columnlabel="小计"><templatev-slot="scope">{{scop
工作需要做一个带滑块效果的导航栏,初步想法是用element的导航组件去做,后面摸坑结合各位大佬的博客初步实现效果,话不多说,直接上代码,记录一下爬坑之旅1<template>2<divclass="y-nav">3<el-rowclass="nav">4<el-menu5:default-active="$route.