iview 3.x 升级指南 —— Icon 篇

iview 在今年 7 月 28 号发布了 3.0.0 版本,大版本升级每每意味着功能、接口的大变动。
虽然官网已经有长长的 更新日志,但看起来仍是有些抽象了,
因此我决定作个新旧版本的比较,盘点新版本到底为咱们带来了什么新特性。

这是系列文章的第一篇,讲的是最简单的组件 —— Icon,但愿能给你们带来帮助html

先看结论

新版本 Icon 有以下变化点:app

  1. 新版本的 Icon 组件支持更多图标类型
  2. 新旧版本的图标名有些差别,升级时务必注意
  3. Icon 组件支持自定义图标,可经过 custom 属性传递类名
  4. Button、Avatar、Rate 组件也支持自定义图标,可经过 custom-icon 属性传递类名

有时间的朋友,也欢迎看看下面的详细解读:iview

基础升级

新版 Icon 组件 最大的变化,是升级图标库 ionicons 到 3.x 版本,可用的图标类型从 730 增长至 866。奇怪的是,目前ionicons提供的版本已是 4.2.5 iview 却只用了其 3.x 版本。ionic

升级后的图标库,功能更强大了,但却为旧版本升级带来了一个坑:ide

官网alert

具体是那些图标名称发生变化了呢?官网没有明说,ionicons也没有明说,找来找去也没找着可信的说明,建议你们在升级的时候仔细测试全部 Icon 调用。性能

支持自定义图标

除了ionicons库的变化以外,新版 Icon 还支持 经过 custom 传入图标 class 名,实现自定义图标功能,举个例子:测试

<Icon custom="fa fa-user" />
<!-- 等同于: -->
<i class="ivu-icon fa fa-user">

这真是一个很方便的功能,由于 iview 提供的图标是不可能覆盖全部应用场景的,实际开发中通常都会自行引入其余图标库,在旧版本中引入的图标库与 iview 之间是割裂的,无法复用 icon 的行为逻辑,好比 Button 中图标的 loading 效果。
在新版本中终于能够大胆使用自定义图标了,好比 下面的例子,我在 Button 组件中使用 font-awesome 的 fa-user 图标,但在 loading 态中,仍是会保留原来的转菊花效果。ui

<div id="app">
  <i-button custom-icon="fa fa-user">Custom icon</i-button>
  <i-button custom-icon="fa fa-user" :loading="true">
    Loading effect
  </i-button>
</div>

尴尬的是,目前仅有 ButtonAvatarRate 三个组件支持 customIcon 属性,其余组件,诸如 TabInputAlert 等尚不支持,官方也没有给出明确的计划,因此也很差揣测。this

代码

新旧版本 Icon 组件代码差异不大,我将差别点抽出来:spa

<script>
    export default {
        props: {
            ...
            custom: {
                type: String,
                default: ''
            }
        },
        computed: {
            classes () {
                return [
                    `${prefixCls}`,
                    {
                        [`${prefixCls}-${this.type}`]: this.type !== '',
                        [`${this.custom}`]: this.custom !== '',
                    }
                ];
            }
            ...
        }
    };
</script>

能够看到,区别有两点,一是支持 custom 属性;二是基于 typecustom 两个 props 计算 classes 值。Icon 组件很简单,这里只有一个小小建议: 对 type 值作个校验
既然 type 属性只能传入 ionicons 支持的图标,为何不作个 in 校验呢?为了性能?新版的 ionicons 有 866 图标,确实可能会影响一丢丢性能,但实际上是能够在 process.env.NODE_ENV ==='development' 环境下作校验呀,多多少少也是能够挡住一些问题。

相关文章
相关标签/搜索