解决el-checkbox点击文字也会选中

news2024/11/25 6:56:30

最近要做一个 多选框嵌套下拉框的一个功能,在点击下拉框时,多选框一直会被选中或者取消,这里做一下解决记录
首先展示一下要做的功能
在这里插入图片描述
出现原因:
el 的checkbox的组件整个是由lable包裹的,所以重写el-checkbox就可以了
原编码:
在这里插入图片描述
解决:
这里用div或者span都是可以的,div会处理成 line-block

<template>
  <div
    :id="id"
    class="el-checkbox"
    :class="[
      border && checkboxSize ? 'el-checkbox--' + checkboxSize : '',
      { 'is-disabled': isDisabled },
      { 'is-bordered': border },
      { 'is-checked': isChecked }
    ]"
  >
    <label>
      <span
        class="el-checkbox__input"
        :class="{
          'is-disabled': isDisabled,
          'is-checked': isChecked,
          'is-indeterminate': indeterminate,
          'is-focus': focus
        }"
        :tabindex="indeterminate ? 0 : false"
        :role="indeterminate ? 'checkbox' : false"
        :aria-checked="indeterminate ? 'mixed' : false"
      >
        <span class="el-checkbox__inner" />
        <input
          v-if="trueLabel || falseLabel"
          v-model="model"
          class="el-checkbox__original"
          type="checkbox"
          :aria-hidden="indeterminate ? 'true' : 'false'"
          :name="name"
          :disabled="isDisabled"
          :true-value="trueLabel"
          :false-value="falseLabel"
          @change="handleChange"
          @focus="focus = true"
          @blur="focus = false"
        >
        <input
          v-else
          v-model="model"
          class="el-checkbox__original"
          type="checkbox"
          :aria-hidden="indeterminate ? 'true' : 'false'"
          :disabled="isDisabled"
          :value="label"
          :name="name"
          @change="handleChange"
          @focus="focus = true"
          @blur="focus = false"
        >
      </span>
    </label>
    <span v-if="$slots.default || label" class="el-checkbox__label">
      <slot />
      <template v-if="!$slots.default">{{ label }}</template>
    </span>
  </div>
</template>
<script>
import Emitter from 'element-ui/src/mixins/emitter'

export default {
  name: 'RCheckbox',

  mixins: [Emitter],

  inject: {
    elForm: {
      default: ''
    },
    elFormItem: {
      default: ''
    }
  },

  componentName: 'RCheckbox',

  props: {
    value: {},
    label: {},
    indeterminate: Boolean,
    disabled: Boolean,
    checked: Boolean,
    name: String,
    trueLabel: [String, Number],
    falseLabel: [String, Number],
    id: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/
    controls: String, /* 当indeterminate为真时,为controls提供相关连的checkbox的id,表明元素间的控制关系*/
    border: Boolean,
    size: String
  },

  data() {
    return {
      selfModel: false,
      focus: false,
      isLimitExceeded: false
    }
  },

  computed: {
    model: {
      get() {
        return this.isGroup
          ? this.store : this.value !== undefined
            ? this.value : this.selfModel
      },

      set(val) {
        if (this.isGroup) {
          this.isLimitExceeded = false;
          (this._checkboxGroup.min !== undefined &&
            val.length < this._checkboxGroup.min &&
            (this.isLimitExceeded = true));

          (this._checkboxGroup.max !== undefined &&
            val.length > this._checkboxGroup.max &&
            (this.isLimitExceeded = true))

          this.isLimitExceeded === false &&
          this.dispatch('ElCheckboxGroup', 'input', [val])
        } else {
          this.$emit('input', val)
          this.selfModel = val
        }
      }
    },

    isChecked() {
      if ({}.toString.call(this.model) === '[object Boolean]') {
        return this.model
      } else if (Array.isArray(this.model)) {
        return this.model.indexOf(this.label) > -1
      } else if (this.model !== null && this.model !== undefined) {
        return this.model === this.trueLabel
      }
    },

    isGroup() {
      let parent = this.$parent
      while (parent) {
        if (parent.$options.componentName !== 'ElCheckboxGroup') {
          parent = parent.$parent
        } else {
          this._checkboxGroup = parent
          return true
        }
      }
      return false
    },

    store() {
      return this._checkboxGroup ? this._checkboxGroup.value : this.value
    },

    /* used to make the isDisabled judgment under max/min props */
    isLimitDisabled() {
      const { max, min } = this._checkboxGroup
      return !!(max || min) &&
        (this.model.length >= max && !this.isChecked) ||
        (this.model.length <= min && this.isChecked)
    },

    isDisabled() {
      return this.isGroup
        ? this._checkboxGroup.disabled || this.disabled || (this.elForm || {}).disabled || this.isLimitDisabled
        : this.disabled || (this.elForm || {}).disabled
    },

    _elFormItemSize() {
      return (this.elFormItem || {}).elFormItemSize
    },

    checkboxSize() {
      const temCheckboxSize = this.size || this._elFormItemSize || (this.$ELEMENT || {}).size
      return this.isGroup
        ? this._checkboxGroup.checkboxGroupSize || temCheckboxSize
        : temCheckboxSize
    }
  },

  watch: {
    value(value) {
      this.dispatch('ElFormItem', 'el.form.change', value)
    }
  },

  created() {
    this.checked && this.addToStore()
  },
  mounted() { // 为indeterminate元素 添加aria-controls 属性
    if (this.indeterminate) {
      this.$el.setAttribute('aria-controls', this.controls)
    }
  },

  methods: {
    addToStore() {
      if (
        Array.isArray(this.model) &&
        this.model.indexOf(this.label) === -1
      ) {
        this.model.push(this.label)
      } else {
        this.model = this.trueLabel || true
      }
    },
    handleChange(ev) {
      if (this.isLimitExceeded) return
      let value
      if (ev.target.checked) {
        value = this.trueLabel === undefined ? true : this.trueLabel
      } else {
        value = this.falseLabel === undefined ? false : this.falseLabel
      }
      this.$emit('change', value, ev)
      this.$nextTick(() => {
        if (this.isGroup) {
          this.dispatch('ElCheckboxGroup', 'change', [this._checkboxGroup.value])
        }
      })
    }
  }
}
</script>

引入:

import RCheckbox from '@/rewrite/r-checkbox.vue'

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

〖大前端 - 基础入门三大核心之CSS篇㉓〗- 过渡的缓动效果

当前子专栏 基础入门三大核心篇 是免费开放阶段。推荐他人订阅&#xff0c;可获取扣除平台费用后的35%收益&#xff0c;文末名片加V&#xff01;说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS…

〖大前端 - 基础入门三大核心之CSS篇㉑〗- 3D变形 与空间移动

当前子专栏 基础入门三大核心篇 也是免费开放阶段。推荐他人订阅&#xff0c;可获取扣除平台费用后的35%收益。说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。福利&#xff1a…

Java去除字符串中空格、制表符、回车换行的方法

\t 是制表符\r\n 回车换行 注意&#xff1a;\r,\n的顺序是不能够对换的&#xff0c;否则不能实现换行的效果&#xff0e;操作系统的不同&#xff0c;换行符操也不同&#xff1a;\r&#xff1a; return 到当前行的最左边。\n&#xff1a; newline 向下移动一行&#xff0c;并不移…

Reddit NFT爆火,全球最大社区论坛成为Web3大规模应用前哨站

这是白话区块链的第1804期原创 作者 | 火火出品&#xff5c;白话区块链&#xff08;ID&#xff1a;hellobtc&#xff09; 据Dune Analytics最新数据显示&#xff0c;Reddit于Polygon网络发行的NFT系列Reddit Collectible Avatar销售总量已突破9万笔&#xff0c;在12月7日达到94…

火灾报警电路设计

火灾报警电路设计 设计一个火灾报警电路&#xff1a;有一火灾报警系统&#xff0c;设有烟感、温感和紫外线 光感3种类型的火灾探测器。为了防止误报警&#xff0c;只有当其中有两种或两种以 上类型的探测器发出火灾检测信号时&#xff0c;报警系统才产生报警控制信号。设计一个…

Linux驱动device_create创建字符设备文件

在Linux中有两种创建字符设备的方法&#xff0c;一种是通过mknod手动进行设备文件创建&#xff0c;第二种是通过device_create函数进行设备文件创建。在驱动开发中常用第二种方式进行设备文件的创建。 class_create和device_create 先来了解一下跟设备文件创建相关的两个函数。…

window 以zip的方式 安装mysql5.7或mysql8,或者两个一起安装Mysql5.7和Mysql8、或其他的版本也可以

window 以zip的方式 安装mysql5.7或mysql8&#xff0c;或者两个一起安装Mysql5.7和Mysql8、或其他的版本也可以 注意不能同一个端口。需要创建个my.ini ,配置内容在网上查下即可 比如说 mysql8的配置文件或mysql5.7的配置&#xff0c;当然内容差别不大&#xff0c;只是需要看自…

数据库系统课程设计(高校成绩管理数据库系统的设计与实现)

目录 1、需求分析 1 1.1 数据需求描述 1 1.2 系统功能需求 3 1.3 其他性能需求 4 2、概念结构设计 4 2.1 局部E-R图 4 2.2 全局E-R图 5 2.3 优化E-R图 6 3、逻辑结构设计 6 3.1 关系模式设计 6 3.2 数据类型定义 6 3.3 关系模式的优化 8 4、物理结构设计 9 4.1 聚…

【AIGC】论文阅读神器 SciSpace 注册与测试

欢迎关注【youcans的 AIGC 学习笔记】原创作品 【AIGC】论文阅读神器 SciSpace 注册与测试 1. 【SciSpace】网址与用户注册1.1 官网地址&#xff1a;[【SciSpace官网】https://typeset.io](https://typeset.io)1.2 官网注册 2. 【SciSpace】实战解说2.1 导入论文2.2 论文分析2.…

基于Python-sqlparse的SQL表血缘追踪解析实现

目录 前言 一、主线任务 1.数据治理 2.血缘追踪 3.SQL表血缘 二、实现过程 1.目标效果 2.代码实现 1.功能函数识别 2.SQL标准格式 3.解析AST树 4.最终效果&#xff1a; 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&#xff0c;非常感…

eclipse的安装与配置

1、下载 eclipse 下载地址&#xff1a;https://www.eclipse.org/downloads/ 点击 【Download Package】 找到JavaEE IDE&#xff0c;点击【Windows x86_64】 点击【Select Another Mirror】&#xff0c;然后点击国内任意一个大学镜像下载即可&#xff01; 下载成功后&…

express的使用(一)

因为有时候没有登录CSDN,所以弄了一个订阅号&#xff0c;会不定时的更新文章(其实就是在csdn这边发布了之后搬过去&#xff0c;不过有问题的可以留言&#xff0c;csdn不常上来看)&#xff0c;欢迎订阅文章链接&#xff1a;[订阅号-express的使用(一)] ------------------------…

全网首发2023全新ChatGPT3.5小程序开源源码 全新UI

源码简介&#xff1a; 2023全新ChatGPT3.5小程序开源源码 全新UI 全网首发 这一版本ui比较好看 回复速度也快了 小程序是java的 带后台 本来准备给你们带上接口的然后么后台是和接口连接的 我改什么内容你们前段都会显示所以全开源 自己搭建下吧&#xff0c;腾讯云买个国外服…

MFC基础入门

1 MFC入门 1.1 为什么学习MFC 在Windows平台上做GUI开发&#xff0c;MFC是一个不错的选择。 学习MFC不仅可以学习到MFC本身&#xff0c;而且可以学习MFC框架的设计思想。 1.2 Windows消息机制 基本概念解释 SDK&#xff1a;软件开发工具包(Software Development Kit)&…

『MySQL 实战 45 讲』15 - 两阶段提交、索引相关问题

日志和索引相关问题 mysql 两阶段提交问题 在两阶段提交的不同时刻&#xff0c;MySQL 异常重启会出现什么现象&#xff1f; 如果 crash 发生在时刻 A 由于此时 binlog 还没写&#xff0c;redo log 也还没提交&#xff0c;所以崩溃恢复的时候&#xff0c;这个事务会回滚 如果 …

数据链路层协议 ——— 以太网协议

文章目录 链路层解决的问题以太网协议认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMUT对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程 ARP协议ARP协议的作用ARP数据的格式ARP协议的工作流程 链路层解决的问题 IP拥有将数据跨网…

【前端知识】Cookie, Session,Token和JWT的发展及区别(二)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;二&#xff09; 4. Session4.1 Session的背景及定义4.2 Session的特点&#x1f44d;4.2.1 Session的特点&#x1f440;4.2.2 Session保存的位置 4.3 Session的一些重要/常用属性4.4 Session的认证流程4.5 Sessi…

Python数据清洗:Python和Pandas数据清洗的实用教程

前言&#xff1a; 技术书籍是学习技术知识的重要资源之一。读技术书可以帮助我们学习新技能和知识&#xff0c;技术书籍提供了可靠的、全面的信息&#xff0c;帮助我们快速学习新技能和知识。同时技术书籍有助于保持你的竞争力&#xff0c;因为它们提供了最新的技术知识和实践。…

什么? 你还没用过 Cursor? 智能 AI 代码生成工具 Cursor 安装和使用介绍

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

ChatGPT 免费体验来了

露个相吧 1、相信很多小伙伴们面试或者工作中会遇到数组扁平化这一问题&#xff0c;如今正是 chatgpt 大火的时候&#xff0c;何不让我们试试水呢&#xff0c;所以让我们的 chatgpt 用js帮我们写一个数组扁平化吧 2、这就&#xff1f;这就&#xff1f;这就写出来了&#xff1f…