使用element-ui中的el-radio(单选框)组件实现选中和取消选中功能(vue对对象中的属性动态赋值)

字节探星客
• 阅读 5613

最近在开发一个活动功能,表单里面有单选框选择,并且可以取消选择,在网上找到了方法并总结了一下,我参考的是这位前辈的代码。下面是我的代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>使用element-ui中的el-radio(单选框)组件实现选中和取消选中功能</title>
    <!--引入 element-ui 的样式,-->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <script src="https://cdn.bootcss.com/vue/2.5.16/vue.min.js"></script>
    <!-- 引入element 的组件库-->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>
    <div id="app">
        <el-button type="primary" @click="isShow = true">请选择优惠活动</el-button>
        <el-dialog title="请选择优惠活动" :close-on-click-modal="false" :visible.sync="isShow" width="731px">
            <div class="model-body">
                <el-form ref="form" :model="activityInfo" label-width="80px" label-position="top">
                    <el-form-item label="活动1">
                        <el-radio-group v-model="activityInfo.radio1" :key="radioKey1">
                            <el-radio v-for="item in moneyOffList" :key="item.id" :label="item.id"
                                @click.native.prevent="changeRadio(item.id, 1)">{{ item.activityName }}</el-radio>
                        </el-radio-group>
                    </el-form-item>
                    <el-form-item label="活动2">
                        <el-radio-group v-model="activityInfo.radio2" :key="radioKey2">
                            <el-radio v-for="item in buyPurchaseList" :key="item.id" :label="item.id"
                                @click.native.prevent="changeRadio(item.id, 2)">{{ item.activityName }}
                            </el-radio>
                        </el-radio-group>
                    </el-form-item>
                    <el-form-item label="活动3">
                        <el-radio-group v-model="activityInfo.radio3" :key="radioKey3">
                            <el-radio v-for="item in couponList" :key="item.id" :label="item.id"
                                @click.native.prevent="changeRadio(item.id, 3)">{{ item.activityName }}</el-radio>
                        </el-radio-group>
                    </el-form-item>
                </el-form>
            </div>
            <div slot="footer" class="footer">
                <!-- 方法返回一个数组, 对象中属性名的集合 -->
                <span class="left1">已选 {{Object.keys(activityInfo).length}} 个活动</span>
                <el-button class="cancel-style" size="small" @click="isShow = false">取 消</el-button>
                <el-button type="primary" @click="confirmActivit">确 认</el-button>
            </div>
        </el-dialog>
    </div>
    <script>
        new Vue({
            el: '#app',
            data() {
                return {
                    // 显示或隐藏弹层
                    isShow: false,
                    // form表单
                    activityInfo: {},
                    // 活动1
                    moneyOffList: [],
                    // 活动2
                    buyPurchaseList: [],
                    // 活动3
                    couponList: [],
                    // 控制单选框点击选中和取消
                    radioKey1: false,
                    // 控制单选框点击选中和取消
                    radioKey2: false,
                    // 控制单选框点击选中和取消
                    radioKey3: false,
                    // 模拟后端返回的数据
                    activityList: [
                        {
                            "activityName": "测试1",
                            "marketingType": "1",
                            "id": "1564166823610396674",
                            "activityType": "5",
                        },
                        {
                            "activityName": "测试2",
                            "marketingType": "1",
                            "id": "1564190540612743169",
                            "activityType": "5",
                        },
                        {
                            "activityName": "测试3",
                            "marketingType": "2",
                            "id": "1564194283531370497",
                            "activityType": "4",
                        },
                        {
                            "activityName": "测试4",
                            "marketingType": "2",
                            "id": "1564201347171319810",
                            "activityType": "4",
                        },
                        {
                            "activityName": "测试5",
                            "marketingType": "2",
                            "id": "1566712633057349634",
                            "activityType": "3",
                        },
                        {
                            "activityName": "测试6",
                            "marketingType": "2",
                            "id": "1567399000281288706",
                            "activityType": "3",
                        },
                    ],

                }
            },
            mounted() {

            },
            watch: {
                isShow: {
                    handler(newName, oldName) {
                        if (newName) {
                            // 区分各种活动类型
                            this.activityList.forEach(item => {
                                if (item.marketingType == 1 && (item.activityType == '1' || item.activityType == '2' || item.activityType == '5')) {
                                    this.moneyOffList.push(item)
                                } else if (item.marketingType = 2 && item.activityType == '4') {
                                    this.buyPurchaseList.push(item)
                                } else if (item.marketingType = 2 && item.activityType == '3') {
                                    this.couponList.push(item)
                                }
                            });
                        } else {
                            // 关闭弹层之后初始化
                            this.moneyOffList = [];
                            this.buyPurchaseList = [];
                            this.couponList = [];
                            this.activityInfo = {};
                        }
                    },
                }
            },
            methods: {
                // 点击单选框操作
                changeRadio(val, number) {
                    // 如果未选中则单选框高亮,否则单选框取消选中(vue对对象中的属性动态赋值)
                    this.activityInfo['radio' + number] = this.activityInfo['radio' + number] == val ? '' : val;
                    this['radioKey' + number] = !this['radioKey' + number];
                    // 去掉空值,删除对象中的某一个属性和属性值
                    if (!this.activityInfo['radio' + number]) {
                        delete this.activityInfo['radio' + number]
                    }
                },
                // 点击确定发送请求
                confirmActivit() {
                    // Object.values, 获取对象中的属性值,返回一个数组
                    let activityIds = Object.values(this.activityInfo);
                    // js中的数组去掉空值(点击单选框的时候已经做了空值处理,这一步可以不要)
                    activityIds = activityIds.filter(function (s) {
                        return s && s.trim();
                    });
                    console.log(activityIds, '传给后端的参数');
                }
            }
        })
    </script>
</body>

</html>

通过这个需求我学到了单选框取消选中的方法,学习了vue对对象中的属性动态赋值,学习了Object.keys()方法和Object.values()方法。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这