【vue自定义组件】基于element-ui 实现一个单选开

前言

佛祖保佑, 永无bug。Hello 大家好!我是海的对岸!

实际开发中,碰到一个单选开关的效果,这个开关的效果,原型图上是用开关来做的,不是传统的单选框,网上没有现成的(可能有,但是我没找到),这个功能在日常工作中很常见,这里刚好碰到了,手动实现了一下,整理记录下。

期望

预期的效果如下:

开关实现单选框效果.gif

简单说明下(功能简述):

  1. 4个开关(最后一个禁用了,不用考虑,就当共有3个开关参加交互)
  2. 就当是3个开关参与交互,打开其中一个开关,其他另外2个就关闭了
  3. 当某个开关处于打开状态,再次点击这个已经打开的关闭,不让他关闭,只有选择其他的开关时,之前已经打开的才会关闭

实现思路

该功能实现的难点在于,如何让已经打开的关闭,不让它关闭?

我实操下来,发现有2种方法

实现方式(1)desabled

第一种: 结合 :disabled 属性和事件处理逻辑来实现,使用 disabled属性,鼠标悬停在开关上面,会有一种 禁用的图标出来,而且开关也会变成灰色,因为禁用的效果,自然而然,也就不能继续点下去了。这种做法呢,会有个样式上的变化。

实现的效果如下:

开关实现单选框效果2.gif

上代码:(当前使用vue2 开发):

html部分

<template>
    ...
            <div class="map-tool-item">
              <div>常规</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_Vector"
                :disabled="isVectorDisabled"
                @change="change_Vector"/>
            </div>

            <div class="map-tool-item">
              <div>卫星影像</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_Img"
                @change="change_Img"
                :disabled="isImgDisabled"/>
            </div>

            <div class="map-tool-item">
              <div>深色地图</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_dark"
                @change="change_dark"
                :disabled="isDarkDisabled"/>
            </div>
    ...
</template>

js部分
...

data() {
    return {
        switch_Vector: true,  // 显示矢量图
        switch_Img: false,    // 是否加载影像图
        switch_dark: false,   // 是否加载深色地图图
        isVectorDisabled: true, // 是否禁用矢量开关
        isImgDisabled: false, // 是否禁用影像开关
        isDarkDisabled: false, // 是否禁用深色地图开关
    };
},

methods: {
    // 是否开启矢量地图
    change_Vector() {
      if (this.switch_Vector) {
        // 当前开关打开1,设置自己 和 其他 2个开关的 开关状态
        this.switch_Img = false;
        this.switch_dark = false;
        // 当前开关打开2,设置自己 和 其他 2个开关的 是否禁用状态
        this.isVectorDisabled = true;
        this.isImgDisabled = false;
        this.isDarkDisabled = false;
        // 处理地图逻辑...
      } else {
        // 当前开关关闭,设置自己 和 其他 2个开关的 开关状态
        this.isVectorDisabled = false;
        this.isImgDisabled = true;
        this.isDarkDisabled = true;
      }
    },

    // 是否开启影像地图

    change_Img() {
      if (this.switch_Img) {
        this.switch_Vector = false;
        this.switch_dark = false;
        this.isImgDisabled = true;
        this.isVectorDisabled = false;
        this.isDarkDisabled = false;
        // 处理地图逻辑...
      } else {
        this.isImgDisabled = false;
        this.isVectorDisabled = true;
        this.isDarkDisabled = true;
      }
    },

    // 是否开启深色地图

    change_dark() {
      if (this.switch_dark) {
        this.switch_Vector = false;
        this.switch_Img = false;
        this.isDarkDisabled = true;
        this.isVectorDisabled = false;
        this.isImgDisabled = false;
        // 处理地图逻辑...
      } else {
        this.isDarkDisabled = false;
        this.isVectorDisabled = true;
        this.isImgDisabled = true;
      }
    },
}

功能是有了,但是项目经理,觉得这个禁用的图标显示在上面,置灰了一层,图标点击之后,灰蒙蒙的一层。觉得有点丑,能不能就显示正常的颜色,用户点了之后,继续点下去,发现不能点,就会知道要去点下一个开关了,想让我整成这样的效果。那行,第二种实现方法就自然而然出来了。

实现方式(2)监听 input 事件

第二种: 通过监听 input 事件,并在事件处理函数中动态修改绑定值的方式来实现在关闭状态下能打开,但打开后不能再关闭的功能

通俗一点讲,就是 使用 input事件,触发它,让它在打开的状态下,给我自始至终都保持 true。

实现的效果如下(即开头的效果):

开关实现单选框效果.gif

上代码:(当前使用vue2 开发):

html部分

<template>
    ...
            <div class="map-tool-item">
              <div>常规</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_Vector"
                @input="handleSwitchInputVector"
                @change="change_Vector"/>
            </div>

            <div class="map-tool-item">
              <div>卫星影像</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_Img"
                @change="change_Img"
                @input="handleSwitchInputImg"/>
            </div>

            <div class="map-tool-item">
              <div>深色地图</div>
              <el-switch
                class="map-switch"
                active-color="#266bff"
                v-model="switch_dark"
                @change="change_dark"
                @input="handleSwitchInputDark"/>
            </div>
    ...
</template>

js部分

...
data() {
    return {
        switch_Vector: true// 显示矢量图
        switch_Img: false,    // 是否加载影像图
        switch_dark: false,   // 是否加载深色地图图
    };
},

methods: {
    // 是否开启矢量地图
    change_Vector() {
      if (this.switch_Vector) {
        this.switch_Img = false;
        this.switch_dark = false;
        // 处理地图逻辑...
      }
    },

    // 是否开启影像地图
    change_Img() {
      if (this.switch_Img) {
        this.switch_Vector = false;
        this.switch_dark = false;
        // 处理地图逻辑...
      }
    },

    // 是否开启深色地图
    change_dark() {
      if (this.switch_dark) {
        this.switch_Vector = false;
        this.switch_Img = false;
        // 处理地图逻辑...
      }
    },

    // 在开关处在打开的状态下,依旧置为true
    handleSwitchInputVector() {
      this.switch_Vector = true;
    },

    // 在开关处在打开的状态下,依旧置为true
    handleSwitchInputImg() {
      this.switch_Img = true;
    },

    // 在开关处在打开的状态下,依旧置为true
    handleSwitchInputDark() {
      this.switch_dark = true;
    },
}

这样就达到了,我们想要的效果。

两种方法,都能实现功能,但是样式上会有些出入,第一种悬停,会直接出现禁用的图标,而且也会置灰, 第二种,则是样式上没啥太大的变化,但是已经是开启状态的开关,就是点了也不会变成关闭状态。具体用哪种,看你们自己的想法。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-15 17:09
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务