ElementUI radio组件选中小改造


Posted in Javascript onAugust 12, 2019

ElementUI 是自己比较钟爱的一套 vue 组件库,自己好几个项目里都在用它。一直以来这些丰富的组件,让我能快速的搞定各种后台管理页面,极大地提高了工作效率。

但是不管什么软件,肯定都没办法称之为完美,而最近的几个小需求中,也发现了 element ui 的一些不足(也可能是因为自己的需求比较奇葩吧)。其中一点就是本文要提到的,radio 绑定对象类型值的问题。

具体现象就是,当通过 mapState 方法自动一个计算对象数组,然后将它绑定到 el-radio 上时,el-radio-group 里的 el-radio 无法根据其绑定值正确的显示 checked 状态。

例如下面这段代码:

<template>
 <div id="app">
  <el-radio-group
   v-model="checkedUser"
  >
   <el-radio
    v-for="(user, index) in users"
    :key="index"
    :label="user"
    :value="user"
   >
    {{ `${user.name}(${user.age}岁)` }}
   </el-radio >
  </el-radio-group>

  <h2>当前选中</h2>
  <pre>{{ checkedUser }}</pre>
 </div>
</template>

<script>
import { mapState } from 'vuex'

export default {
 name: 'app',

 data () {
  return {
   checkedUser: {
    name: 'C',
    age: 1,
   },
  }
 },

 computed: {
  ...mapState({
   users: state => state.users
  })
 },
}
</script>

其中 users 为 vuex store 中的 state。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({
 state: {
  users: [
   {
    name: 'A',
    age: 18,
   },
   {
    name: 'B',
    age: 20,
   },
   {
    name: 'C',
    age: 1,
   },
  ]

 },
})

export default store

但当运行代码之后看到,第三个 el-radio 并没有像预期的那样处于选中状态。

ElementUI radio组件选中小改造

查看代码时发现,el-radio 里的 checked 是根据 this.model === this.label 来判断的(见代码),而当 this.model 和 this.label 都是对象是,它们必须是引用同一个对象才会“恒等”。

得益于 Vue 提供的 extends 属性,我们可以轻松的扩展官方原来的 el-radio 组件,对其稍加改造,就可以解决这个问题。

<template>
 <label
  class="el-radio"
  :class="[
   border && radioSize ? 'el-radio--' + radioSize : '',
   { 'is-disabled': isDisabled },
   { 'is-focus': focus },
   { 'is-bordered': border },
   { 'is-checked': isChecked }
  ]"
  role="radio"
  :aria-checked="isChecked"
  :aria-disabled="isDisabled"
  :tabindex="tabIndex"
  @keydown.space.stop.prevent="model = isDisabled ? model : label"
 >
  <span class="el-radio__input"
     :class="{
    'is-disabled': isDisabled,
    'is-checked': isChecked
   }"
  >
   <span class="el-radio__inner"></span>
   <input
    ref="radio"
    class="el-radio__original"
    :value="label"
    type="radio"
    aria-hidden="true"
    v-model="model"
    @focus="focus = true"
    @blur="focus = false"
    @change="handleChange"
    :name="name"
    :disabled="isDisabled"
    tabindex="-1"
   >
  </span>
  <span class="el-radio__label" @keydown.stop>
   <slot></slot>
   <template v-if="!$slots.default">{{label}}</template>
  </span>
 </label>
</template>

<script>
import { isEqual } from 'lodash'
import { Radio } from 'element-ui'

export default {
 name: 'MyRadio',

 // 使用 extemds 选项来扩展官方的 el-radio
 extends: Radio,

 computed: {
  // IMPORTANT: 改写部分,主要是支持 object 类型的值
  isChecked () {
   return isEqual(this.model, this.label)
  },
 },
}
</script>

改造完成后,引用这个组件并替换掉原来模板里用到的 el-radio,刷新页面后会发现,radio 的初始选中状态正常了。

ElementUI radio组件选中小改造

实际上,el-checkbox/el-checkbox-group 也有类似的问题,也是可以解决的,但看过源码之后,发现 el-checkbox 的一些逻辑与 el-radio 又有不小差别,毕竟它绑定的可能就是对象数组,所以具体处理起来会有些不一样,本文就不具体介绍了,如果各位有兴趣可以自行探索。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
重定向实现代码
Nov 20 Javascript
javascript 窗口加载蒙板 内嵌网页内容
Nov 19 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
Apr 26 Javascript
jqgrid 表格数据导出实例
Nov 21 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
Jan 04 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
javascript比较语义化版本号的实现代码
Sep 09 Javascript
ionic3 懒加载
Aug 16 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
Aug 12 #Javascript
微信小程序实现页面分享onShareAppMessage
Aug 12 #Javascript
react实现antd线上主题动态切换功能
Aug 12 #Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
Aug 12 #Javascript
解析原来浏览器原生支持JS Base64编码解码
Aug 12 #Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 #Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 #Javascript
You might like
APMServ使用说明
2006/10/23 PHP
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
jquery插件开发注意事项小结
2013/06/04 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
echarts多条折线图动态分层的实现方法
2019/05/24 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
2020/11/06 Javascript
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
python3调用windows dos命令的例子
2019/08/14 Python
用Python开发app后端有优势吗
2020/06/29 Python
Mytheresa中国官网:德国时尚奢侈品商城
2017/08/04 全球购物
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
任命书怎么写
2014/06/04 职场文书
注册资产评估专业求职信
2014/07/16 职场文书
2014年双拥工作总结
2014/11/21 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
会计实训总结范文
2015/08/03 职场文书
Nginx配置https的实现
2021/11/27 Servers
Golang实现可重入锁的示例代码
2022/05/25 Golang