拜读及分析Element源码-alert组件篇

alert组件比较简单,基本上就是展示不同的样式, 只有一个关闭事件。(有问题欢迎指正与讨论 也可以来小站逛逛)

结构

  <transition name="el-alert-fade">
    <!-- 
      typeClass:根据传入的type控制样式
      center: 根据传入的center控制内容是否居中
      role:属性作用是告诉Accessibility类应用(比如屏幕朗读程序,为盲人提供的访问网络的便利程序),这个元素所扮演的角色,主要是供残疾人使用。使用role可以增强文本的可读性和语义化。 
     -->
    <div
      class="el-alert"
      :class="[typeClass, center ? 'is-center' : '']"
      v-show="visible"
      role="alert"
    >
      <!-- 
        showIcon: 控制是否显示icon
        iconClass: 根据传入的type动态控制icon的样式
        isBigIcon: 如果传入了description(辅助性文字)或者 插槽内传入了内容 则显示大icon
       -->
      <i class="el-alert__icon" :class="[ iconClass, isBigIcon ]" v-if="showIcon"></i>
      <div class="el-alert__content">
        <!-- 如果传入了description(辅助性文字)或者 传入了匿名插槽 则显示加粗title -->
        <span class="el-alert__title" :class="[ isBoldTitle ]" v-if="title">{{ title }}</span>
        <!-- 传入插槽内容则显示插槽内容 未传入默认显示slot内的内容description -->
        <slot>
          <p class="el-alert__description" v-if="description">{{ description }}</p>
        </slot>
        <!-- 
          closable: 是否显示关闭按钮,默认显示
          closeText: 关闭按钮自定义文字,无显示X有显示文字
         -->
        <i class="el-alert__closebtn" :class="{ 'is-customed': closeText !== '', 'el-icon-close': closeText === '' }" v-show="closable" @click="close()">{{closeText}}</i>
      </div>
    </div>
  </transition>
复制代码

props

  props: {
    // 接收标题
    title: {
      type: String,
      default: '',
      required: true
    },
    // 辅助性文字
    description: {
      type: String,
      default: ''
    },
    // 接收主题 computed里会根据不同type返回对应的样式
    type: {
      type: String,
      default: 'info'
    },
    // 关闭按钮显示
    closable: {
      type: Boolean,
      default: true
    },
    // 关闭按钮自定义文字
    closeText: {
      type: String,
      default: ''
    },
    // 是否显示icom
    showIcon: Boolean,
    // 内容是否居中
    center: Boolean
  }
复制代码

computed

  computed: {
    // alert的样式
    typeClass() {
      return `el-alert--${this.type}`
    },
    // alert里icon的样式
    iconClass() {
      return TYPE_CLASSES_MAP[this.type] || 'el-icon-info'
    },
    // 如果传入了description(辅助性文字)或者 传入了匿名插槽 则显示大icon
    isBigIcon() {
      return this.description || this.$slots.default ? 'is-big' : ''
    },
    // 如果传入了description(辅助性文字)或者 传入了匿名插槽 则显示加粗title
    isBoldTitle() {
      return this.description || this.$slots.default ? 'is-bold' : ''
    }
  }
复制代码

methods

  methods: {
    // 关闭alert方法
    close() {
      // v-show隐藏alert
      this.visible = false
      // 向父组件暴露close方法
      this.$emit('close')
    }
  }
复制代码

data

  data() {
    return {
      // 组件显示隐藏
      visible: true
    }
  }
复制代码

学习

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值