vue2:v-for实现的el-radio-group选中时显示角标,并自定义选中按钮的字体颜色和背景色

59 篇文章 ¥19.90 ¥99.00

        项目中需要实现一组预定义查询,每一个查询按钮在选中时右上角显示一个角标,展示当前查询返回的数据条目。

1、text-color="#3785FF" fill="#E6EAF1" 处理选中时的字体颜色和背景色,如上图,分别为蓝色和浅灰色。

2、badge中:value="selectedRadio === item?total:''" 动态显示内容,当前按钮选中状态下才显示数字,非选中状态下置为空。

<el-radio-group v-for="(item, index) in searchGroupList" :key="index"
                          v-model="selectedRadio" size="small" 
                          @change="handleSearchGroupChange(item)"
                          text-color="#3785FF" fill="#E6EAF1">
            <el-badge :value="selectedRadio === item?total:''" class="custom-badge" type="warni
<template> <div style="padding: 10px"> <div style="margin: 10px 0;"> <!-- 功能区域--> <el-button type="primary" round v-on:click="add">新增</el-button> <!-- 搜索区域--> <el-button type="primary" icon="el-icon-search" style="margin-outside: 10px; float: right" @click="goSearch">搜索</el-button> <el-input v-model="search" placeholder="请输入你搜索的用户名" @keydown.enter.native="goSearch" style="width: 20%; float: right" clearable> </el-input> </div> <!-- 表格区域--> <el-table :data="tableData" v-loading="loading" stripe border style="width: 99%"> <el-table-column prop="id" label="ID" sortable> </el-table-column> <el-table-column prop="username" label="用户名"> </el-table-column> <el-table-column label="用户类型"> <!-- 这里应该是使用template default标签把那个整个data数据取出来,然后scope就是整个数据,每一行数据就是scope.row,tableData=scope--> <template #default="scope"> <span v-if="scope.row.role === 2" style="color: #098486">普通用户</span> <span v-if="scope.row.role === 1" style="color: red">管理员</span> </template> </el-table-column> <el-table-column prop="nickName" label="昵称"> </el-table-column> <el-table-column prop="age" label="年龄"> </el-table-column> <el-table-column prop="sex" label="性别"> </el-table-column> <el-table-column width="120px" label="头像"> <template #default="scope"> <el-image style="width: 90px; height: 90px" :src="scope.row.avatar" :preview-src-list="[scope.row.avatar]"> </el-image> </template> </el-table-column> <!-- 操作区域--> <el-table-column fixed="right" label="操作" align = "center"> <template #default="scope"> <!-- 这里scope.row传入直接是传入一行的数据对象,可以使用row.username取出用户名的--> <el-button v-on:click="editeClick(scope.row)" type="primary" size="small">编辑</el-button> <el-popconfirm title="这是一段内容确定删除吗?" @confirm="deleteClick(scope.row.id)" style="margin-left: 10px"> <template #reference> <el-button type="danger" size="small">删除</el-button> </template> </el-popconfirm> </template> </el-table-column> </el-table> <!-- 页码区域以及弹出表单--> <div style="margin: 20px 0"> <!-- 页码区域,在Vue2里面是不支持v-model:prop="data"的,所以我们要用v-bind:prop.sync="data"实现双向绑定--> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="currentPage" :page-sizes="[5,10,20]" :page-size.sync="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="totalNumber"> </el-pagination> <!-- 添加用户的表单--> <el-dialog title="新增/修改用户" :visible.sync="dialogVisible" width="30%"> <!-- 输入表单--> <el-form v-bind:model="form" label-width="120px"> <el-form-item label="用户名:"> <el-input v-model="form.username" style="width: 80%"></el-input> </el-form-item> <el-form-item label="密码:"> <el-input v-model="form.password" style="width: 80%" type="password"></el-input> </el-form-item> <el-form-item label="昵称:"> <el-input v-model="form.nickName" style="width: 80%"></el-input> </el-form-item> <el-form-item label="年龄:"> <el-input v-model="form.age" style="width: 80%"></el-input> </el-form-item> <!-- 绑定字符串不用:label,绑定数字就要用:label才行--> <el-form-item label="性别:"> <el-radio v-model="form.sex" label="男">男</el-radio> <el-radio v-model="form.sex" label="女">女</el-radio> </el-form-item> </el-form> <!-- 下面的按钮--> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <el-button type="primary" @click="save">确 定</el-button> </span> </el-dialog> </div> </div> </template> <script> // @ is an alias to /src import request from "@/utils/request"; export default { name: 'HomeView', components: {}, created() { document.title = '用户管理'; this.loadData(); }, methods: { // 搜索功能 goSearch:function (){ this.loadData(); }, // 加载表格数据,Get请求,Get请求不能直接传对象,只有Post可以直接传对象进去 loadData() { this.loading = true request.get("/user", { params: { pageNum: this.currentPage, pageSize: this.pageSize, search: this.search } }).then(res => { console.log(res); this.tableData = res.data.records; this.totalNumber = res.data.total; this.loading = false; }) }, // 打开表单栏 add() { // 先清空表单 this.form = {}; // 再打开表单 this.dialogVisible = true; }, // 点击表单的确定按钮,保存数据到后台,Post请求Put请求 save() { this.$message({ type: "info", message: "马上保存/修改" }) if (this.form.id) { // 有ID就更新 request.put("/user",this.form).then(res =>{ console.log(res); if (res.code === '0'){ this.$message({ type: "success", message: "更新成功" }) }else { this.$message({ type: "error", message: res.msg }) } }) }else { // 没有就新增 // 这里不用添加/api,在request.js中我们已经添加了baseurl为api了,然后在vue.config.js中会被拦截 request.post("/user", this.form).then(res => { console.log(res); if (res.code === '0'){ this.$message({ type: "success", message: "新增成功" }) }else { this.$message({ type: "error", message: res.msg }) } }); } // alert("保存/修改成功"); 需要检查之后再看是否成功 // 更新tableData的数据 this.loadData(); this.dialogVisible = false; }, // 修改行数据 editeClick(row) { // 将数据深拷贝过来,避免浅拷贝的修改问题 this.form = JSON.parse(JSON.stringify(row)); this.dialogVisible = true; }, // 删除数据 deleteClick(id) { request.delete('/user', { params: { id : id } }).then(res=>{ if (res.code === '0') { this.$message({ type: "warning", message: "删除成功", }) }else { this.$message({ type: "error", message: res.msg, }) } }); // 更新数据 this.loadData(); }, // 表单每页大小的改变,因为有了双向绑定,直接更新一下数据就好了 handleSizeChange() { this.loadData(); }, // 改变当前页码 handleCurrentChange: function () { this.loadData(); } }, data() { return { loading: true, //新建一个表单,用来储存新增用户修改用户的数据 form: { }, // 增加框是否可见 dialogVisible: false, // 总数据数 totalNumber: 400, // 当前页码 currentPage: 1, // 一页多少个 pageSize: 5, // 输入框的数据 search: '', // 表格的数据 tableData: [] } } } </script>
最新发布
10-30
帮我添加注释<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>调查表单</title> <script src="js/vue.js"></script> <style> #user-from{ max-width: 600px; margin: 20px auto; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 8px; } .from-group{ margin-bottom: 15px; } label{ display: block; margin-bottom: 5px; font-weight: 500; } .form-control{ width: 100%; padding: 8px 12px; border: 1px solid #ddd; } .radio-group, .checkbox-group{ display: flex; gap: 15px; } .radio-group label, .checkbox-group label{ display: flex; align-items: center; gap:5px; } .submit-btn{ background-color: #42b983; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-size: 16px; } .submit-btn:disabled{ background-color: #cccccc; cursor: not-allowed; } .data-preview{ margin-top: 20px; padding: 15px; background-color: #f5f5f5; border-radius: 4px; } pre{ white-space: pre-wrap; word-wrap: break-word; } </style> </head> <body> <div id="user-from"> <h2>用户信息调查</h2> <form @submit.prevent="handleSubmit"> <div class="from-group"> <label>姓名:</label> <input type="text" v-model="userInfo.name" placeholder="请输入姓名" class="form-control"> </div> <div class="from-group"> <label>个人简介:</label> <textarea v-model="userInfo.bio" placeholder="请输入个人简介" class="form-control" rows="3"></textarea> </div> <div class="from-group"> <label>性别</label> <div class="radio-group"> <label> <input type="radio" value="male" v-model="userInfo.gender"> 男 </label> <label> <input type="radio" value="female" v-model="userInfo.gender"> 女 </label> </div> </div> <div class="from-group"> <label> <input type="checkbox" v-model="userInfo.agreeTerms" > 我已阅读同意用户协议 </label> </div> <div class="from-group"> <label>兴趣爱好:</label> <div class="checkbox-group"> <label> <input type="checkbox" value="reading" v-model="userInfo.hobbies"/>阅读 </label><label for=""> <input type="checkbox" value="sports" v-model="userInfo.hobbies"/>运动 </label><label for=""> <input type="checkbox" value="coding" v-model="userInfo.hobbies"/>编程 </label><label for=""> <input type="checkbox" value="music" v-model="userInfo.hobbies"/>音乐 </label> </div> </div> <div class="from-group"> <label>职业:</label> <select v-model="userInfo.occupation" class="form-control"> <option value="">请选择职业</option> <option value="student">学生</option> <option value="teacher">教师</option> <option value="engineer">工程师</option> <option value="doctor">医生</option> <option value="other">其他</option> </select> </div> <button type="submit" class="submit-btn" :disabled= "!userInfo.agreeTerms">提交</button> </form> <div class="data-preview"> <h3>当前表单数据:</h3> <pre>{{userInfo}}</pre> </div> </div> <script> const app=new Vue({ el:"#user-from", data:{ userInfo:{ name:'', bio:'', gender:'male', agreeTerms: false, hobbies:[], occupation:'' } }, methods:{ handleSubmit(){ alert('表单提交成功 \n ' +JSON.stringify(this.userInfo,null,2)); } } }) </script> </body> </html>
09-27
<template class> <div class="building"> <div class="main"> <el-form ref="form" :model="loginform" label-width="60px" label-position="left" > <el-form-item label="用户名"> <el-input v-model="loginform.userName" label="left"></el-input> </el-form-item> <el-form-item label="密码" style="left: 0%"> <el-input v-model="loginform.pwd"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submit()">登录</el-button> <el-button type="primary" @click="dialogFormVisible = true" >注册</el-button > <el-button style="text-align: center">取消</el-button> </el-form-item> </el-form> </div> <div> <el-dialog title="" :visible.sync="dialogFormVisible" append-to-body width="30%" class="registerStyle" custom-class="no-header-dialog" > <el-form :model="form" label-position="left" :rules="registerRules" ref="registerRef" > <el-form-item label="用户名" prop="userName"> <el-input v-model="form.userName" autocomplete="off" style="width: 200px; float: left" ></el-input> </el-form-item> <el-form-item prop="nickName"> <template #label> <span>昵</span>    <span>称</span> </template> <el-input v-model="form.nickName" autocomplete="off" style="width: 200px; float: left" ></el-input> </el-form-item> <el-form-item prop="pwd"> <template #label> <span>密</span>    <span>码</span> </template> <el-input v-model="form.pwd" autocomplete="off" style="width: 200px; float: left" ></el-input> </el-form-item> <el-form-item label="手机号" prop="phoneCode"> <el-input v-model="form.phoneCode" autocomplete="off" style="width: 200px; float: left" ></el-input> </el-form-item> <el-form-item> <template #label> <span>头</span>    <span>像</span> </template> <el-upload class="avatar-uploader" action="http://localhost:8081/file/upload" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" style="width: 200px; float: left" > <img v-if="pic" :src="pic" class="avatar" /> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </el-form-item> <el-form-item prop="roleId"> <template #label> <span>角</span>    <span>色</span> </template> <el-radio-group v-model="form.roleId" style="width: 300px; float: left" > <el-radio-button label="1">管理员</el-radio-button> <el-radio-button label="2">用户</el-radio-button> <el-radio-button label="3">教练</el-radio-button> </el-radio-group> </el-form-item> <el-form-item style="float: center"> <el-button type="primary" @click="register()">注册</el-button> <el-button @click="resetForm('form')">重置</el-button> </el-form-item> </el-form> </el-dialog> </div> </div> </template> <script> import { login } from "@/api/Login"; import { register } from "@/api/Login"; export default { name: "LoginView", data() { return { pic: "", formLabelWidth: "150px", dialogFormVisible: false, form: { roleId: 2, }, loginform: { userName: "", pwd: "", }, registerRules: { userName: [ { required: true, message: "请输入活动名称", trigger: "blur" }, { min: 6, max: 10, message: "长度在 6 到 10 个字符", trigger: "blur", }, ], nickName: [ { required: true, message: "请输入昵称", trigger: "blur" }, { min: 1, max: 6, message: "长度在 1 到 6 个字符", trigger: "blur" }, ], pwd: [ { required: true, message: "请输入密码", trigger: "blur" }, { min: 6, max: 10, message: "长度在 6 到 10 个字符", trigger: "blur", }, ], phoneCode: [ { required: true, message: "请输入手机号", trigger: "blur" }, { min: 11, max: 11, message: "请输入正确的手机号", trigger: "blur" }, ], roleId: [ { required: true, message: "请选择注册角色", trigger: "blur" }, ], }, }; }, methods: { //回显 handleAvatarSuccess(res, file) { this.pic=URL.createObjectURL(file.raw); console.log(res.data.url) this.form.pic = res.data.url; }, //设置文件格式 beforeAvatarUpload(file) { const isLt2M = file.size / 1024 / 1024 < 10; if (!isLt2M) { this.$message.error("上传头像图片大小不能超过 2MB!"); } return isLt2M; }, //登录 submit() { login(this.loginform).then((resp) => { console.log(resp.data.data); if (resp.data.code == 200) { this.$message(resp.data.data.message); if (resp.data.data.user.roleId == 1) { this.$router.push("/admin"); } else if (resp.data.data.user.roleId == 2) { localStorage.setItem("userId", resp.data.data.user.id); this.$router.push("/user"); } else { this.$router.push("/coach"); } } else { console.log(resp.data.message); // location.reload(); } }); }, //注册 register() { register(this.form).then((resp) => { if (resp.data.code == 200) { this.$message.success(resp.data.message + "请登录"); this.dialogFormVisible = false; } else { this.$message.error(resp.data.message + "请重新输入"); this.$refs.registerRef.resetFields(); } }); }, //重置表单 resetForm() { this.$refs.registerRef.resetFields(); }, }, }; </script> <style> .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409eff; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 178px; height: 178px; line-height: 178px; text-align: center; } .avatar { width: 178px; height: 178px; display: block; } .no-header-dialog .el-dialog__header { display: none; } .el-dialog .el-dialog__body { display: flex; justify-content: center; align-items: center; background: url("@/assets/register.jpg"); } .building { background: url("@/assets/login.jpg"); width: 100%; height: 100%; position: fixed; background-size: cover; opacity: 0.7; } .main { background: url("@/assets/login.jpg"); background-size: cover; /* 背景图片覆盖整个div */ background-repeat: no-repeat; /* 背景图片不重复 */ background-position: center; /* 背景图片居中显示 */ text-align: center; background-color: #fff; border-radius: 20px; width: 350px; height: 300px; margin: auto; position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; justify-content: center; align-items: center; } </style>这个页面的对话框样式影响到其他地方的对话框了
08-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值