Vue+Vant封装通用模态框单选框组件

前言

我们知道,在vant组件中提供的组件往往是比较基础的,能够满足基本需求。但是我们想实现ui设计的一些比较丰富效果的组件,需要自己去实现,且当项目中多次用到的时候,我们将以组件化的思想将其封装起来,供各个页面方面使用。

vant提供的单选框效果:

 项目中UI提供的单选框效果图

1.右边显示单选框效果

2.右边显示为图标效果

 情况

 实现思路

在组建中定义如下变量,用来接收父组件传的值

定义props值

  • title:标题
  • showList:展示列表的数据
  • actionVal:当前列表数据中被选中的值
  • dialogType:弹框的类型(0-列表 文字 图标;1-列表 文字 radio;2-自动以内容)
  • onlyCancel:是否只显示取消按钮,true只显示取消按钮,false:既显示取消按钮,又显示确定按钮。因为有些是需要点击单选框某项之后直接关闭模态框触发回传事件,有些是需要点击确定按钮再触发,所以这里做了一个区分

定义点击事件

1.列表项点击事件:listClick(i)

listClick(i){
 // 这个key值也是根据父组件传递过来的列表,key值是每项的唯一标识值,这个唯一标示值根据自身业务逻辑而定
 this.currActionVal=i.key//存储当前最新值
 this.$emit('update',this.currentActionVal);//这里可以稍微优化,若存在确定按钮,这一步在确定事件中再进行
 setTimeout(()=>{
   this.show=false
 },500)
}

 2.点击确定按钮事件:handleConfirm

handleConfirm(){
    this.$emit('update',this.currentActionVal)
}

 3.点击取消事件:handleCancel

handleCancel(){
  this.$emit('cancel',this.currentActionVal,this.actionVal);//回传旧值和新值,若用户没有触发修改事件时,这里currentActionVal和this.actionVal相等
}

 父组件调用

引入与注册

使用

右边显示为图标效果

     // html
     <bottomDialog
        ref="actionDialog"
        :title="$t('hvac.actionModel')"
        :onlyCancel="true"
        :showList="actionIcon"
        :actionVal="action"
        :dialogType="0"
        @update="actionUpdate($event)"
        @cancel="actionCancel(arguments)"
      ></bottomDialog>

 

右边显示为radio效果

 

最后,附上封装的组件的代码

<template>
  <div>
    <van-dialog
      v-model="show"
      :title="currTitle"
      :confirmButtonText="$t('common.ensure')"
      confirmButtonColor="#FEB946"
      :cancelButtonText="$t('common.cancel')"
      cancelButtonColor="#666666"
      :showCancelButton="true"
      :showConfirmButton="showConfirmFlag"
      @confirm="handleConfirm"
      @cancel="handleCancel"
    >
      <!-- 列表 文字-图标 -->
      <div class="list-container" v-if="Number(dialogType) === 0">
        <div
          class="list-box"
          v-for="(i, k) in showList"
          :key="k"
          @click="listClick(i)"
        >
          <div
            class="item-right no-action-font"
            :class="{ 'smartOrange-color': i.key === currActionVal }"
          >
            {{ i.title }}
          </div>

          <div class="item-left" :class="i.class"></div>
        </div>
      </div>

      <!-- 列表radio 文字-radio -->
      <div class="list-container" v-if="Number(dialogType) === 1">
        <van-radio-group v-model="currActionVal">
          <div class="list-box" v-for="(i, k) in showList" :key="k">
            <div
              class="item-right no-action-font"
              :class="{ 'smartOrange-color': i.key === currActionVal }"
            >
              {{ i.title }}
            </div>

            <div class="item-left">
              <van-radio :name="i.key">
                <template #icon="props">
                  <div
                    class="item-left"
                    :class="
                      props.checked ? 'radio-icon-orange' : 'radio-icon-grey'
                    "
                  ></div>
                </template>
              </van-radio>
            </div>
          </div>
        </van-radio-group>
      </div>

      <!-- 自定义内容 -->
      <div class="list-container" v-if="Number(dialogType) === 2">
        <slot name="default"></slot>
      </div>
    </van-dialog>
  </div>
</template>

<script>
import { Dialog, RadioGroup, Radio } from "vant";
export default {
  name: "bottomDialog",
  components: {
    Dialog,
    RadioGroup,
    Radio,
  },
  props: {
    //   标题
    title: {
      type: String,
      default: "123",
    },
    //  是否只显示取消按钮  -true 只有取消按钮 -false 有取消、确定按钮
    onlyCancel: {
      type: Boolean,
      default: false,
    },
    // 展示列表数据
    showList: {
      type: Array,
      default() {
        return [];
      },
      required: false,
    },
    // 当前列表数据中被选中的值
    actionVal: {
      type: Number,
      default: 0,
      required: false,
    },
    // 弹窗的类型
    // 0-列表 文字-图标
    // 1-列表radio  文字-radio
    // 2-自定义内容
    dialogType: {
      type: Number,
      default: 0,
    },
  },
  data() {
    return {
      show: false,
      currTitle: this.title,
      showConfirmFlag: !this.onlyCancel,
      currActionVal: this.actionVal,
    };
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    //   点击确定按钮事件
    handleConfirm() {
      console.log(this.currActionVal);
      this.$emit("update", this.currActionVal);
    },

    // 点击取消按钮事件
    handleCancel() {
      console.log("newVal:" + this.currActionVal);
      console.log("oldVal:" + this.actionVal);
      this.$emit("cancel", this.currActionVal, this.actionVal);
    },

    // 列表-图标点击事件
    listClick(i) {
      this.currActionVal = i.key;
      this.$emit("update", this.currActionVal);
      setTimeout(() => {
        this.show = false;
      }, 500);
    },
  },
};
</script>

<style lang="scss" scoped>
.list-container {
  padding: 20px 40px;

  .list-box {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    .item-left {
      width: 30px;
      height: 30px;
    }
  }
}
// 重写vant弹窗初始样式
.van-dialog {
  position: fixed !important;
  top: auto !important;
  left: 50% !important;
  bottom: 60px !important;
  transform: translateX(-50%) !important;
}
.van-dialog__header {
  font-size: 18px !important;
  color: #feb946 !important;
  font-weight: 600 !important;
}
::v-deep .van-radio__icon{
  height: 100%;
}
.van-radio{
  height: 100%;
}
.van-radio__icon {
  height: 30px !important;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器出现503 服务不可用错误怎么办?

​  HTTP 503 服务不可用错误代码表示网站暂时不可用。无论您是网站访问者还是管理员&#xff0c;503 页面都很麻烦。尽管该错误表明存在服务器端问题&#xff0c;但对于访问者和网络管理员来说&#xff0c;有一些可能的解决方案。本文将解释Linux服务器出现503 服务不可用错…

scratch足球射门练习 中国电子学会图形化编程 少儿编程 scratch编程等级考试一级真题和答案解析2023年3月

目录 scratch足球射门练习 一、题目要求 1、准备工作 2、功能实现 二、案例分析

【网络安全】红队基础免杀

引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下&#xff1a; int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experime…

分享几个国内免费的ChatGPT镜像网址(亲测有效-4月25日更新)

最近由于ChatGPT的爆火也让很多小伙伴想去感受一下ChatGPT的魅力&#xff0c;那么今天就分享几个ChatGPT国内的镜像网址&#xff0c;大家可以直接使用&#xff01;记得点赞收藏一下呦&#xff01; 1、AQ Bot&#xff0c;网址&#xff1a;点我 https://su.askaiw.com/aq 缺点&…

面试篇:Redis

一、缓存穿透 1、缓存穿透 查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查数据库。即&#xff1a;大量请求根本不存在的key 2、查询流程 3、出现原因 业务层误将缓存和库中的数据删除了&#xff0c;也可能是有人恶…

JUC-多线程(12. AQS-周阳)学习笔记

文章目录 1. 可重入锁1.1. 概述1.2. 可重入锁类型1.3. Synchronized 可重入实现机理 2. LockSupport2.1. LockSupport 是什么2.2. 3种线程等待唤醒的方法2.2.1 Object 的等待与唤醒2.2.2. Condition接口中的等待与唤醒2.2.3. 传统的 synchronized 和 Lock 实现等待唤醒通知的约…

【手把手做ROS2机器人系统开发一】开发环境搭建

【手把手做ROS2机器人系统开发一】开发环境搭建 目录 【手把手做ROS2机器人系统开发一】开发环境搭建 一、专栏介绍&#xff1a; 二、开发环境搭建&#xff1a; 1.Ubuntu系统安装 2.ROS2系统环境安装 3.测试系统运行 一、专栏介绍&#xff1a; 大家好&#xff0c;今天给大家…

栈的基本操作(C语言实现)创建,销毁,入栈,出栈

前言 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;栈的…

同样是测试,朋友到了30k,我才12K,这份测试面试8股文确实牛

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而&#xff0c;小编要说的是&#xff0c;不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿&#xff0c;薪资的差别还是很大的。 众所周知&#xff0c;目前互联网行业是众多行业中薪资待遇最好的&#xff0c;…

Fedora 38 正式发布

Fedora Linux 38 正式发布&#xff0c;用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接&#xff0c;你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

【视频课程】算法工程师需要的ChatGPT大模型算法理论与实践课程!非粗浅科普...

前言 自从2022年11月ChatGPT发布之后&#xff0c;迅速火遍全球。其对话的交互方式&#xff0c;能够回答问题&#xff0c;承认错误&#xff0c;拒绝不适当的请求&#xff0c;高质量的回答&#xff0c;极度贴近人的思维的交流方式&#xff0c;让大家直呼上瘾&#xff0c;更是带火…

安装配置SVN版本控制管理工具

SVN工具能帮我们做什么&#xff1f; 核心功能&#xff1a;文档版本管理系统 适合对象&#xff1a;个人与团队都可以使用&#xff0c;企业中项目资源的重要管理工具 举例&#xff1a;一个文件夹里面的文档管理 1.下载安装SVN服务器 VisualSVN-Server 2.下载安装SVN客户端 T…

<网络编程>网络套接字

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的关系 理解源端口号和目的端口号 初步认识TCP、UDP协议 TCP协议 UDP协议 网络字节序列 socket网络接口 socket常见API sockaddr结构 UDPsocket 编码&#xff1a; 理解源IP地址和目的IP地址 源IP&#xf…

Jupyter Notebook的安装与使用

Jupyter Notebook Jupyter Notebook介绍Jupyter Notebook使用安装启动创建文件编写代码和文本常用命令配置文件 Anaconda Jupyter Notebook介绍 Jupyter Notebook是一个基于Web的交互式计算环境&#xff0c;可以让用户以文档形式记录代码、数据分析结果和说明文本&#xff0c;并…

从零开始的ChatGLM 配置详细教程

从零开始的ChatGLM配置教程 文章目录 从零开始的ChatGLM配置教程一&#xff0c;前言二&#xff0c;环境配置1、下载ChatGLM项目2、配置程序运行环境 三、在HuggingFace下载chatGLM-6B模型1&#xff0c;安装 Git Lfs2&#xff0c;下载相关文件3&#xff0c;在HuggingFace中下载相…

一致性 Hash 算法 及Java TreeMap 实现

1、一致性 Hash 算法原理 一致性 Hash 算法通过构建环状的 Hash 空间替线性 Hash 空间的方法解决了这个问题&#xff0c;整个 Hash 空间被构建成一个首位相接的环。 其具体的构造过程为&#xff1a; 先构造一个长度为 2^32 的一致性 Hash 环计算每个缓存服务器的 Hash 值&…

基于Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaSpringvueelement实现旅游信息管理平台系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

抢先看,甘特图工具DHTMLX gantt 灯箱编辑器通过套件 UI 小部件进行了扩展

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

为什么重写equals时必须重写hashCode()

不重写equals和不重写 hashCode()之前&#xff1a;equals()比较的是对象的内存地址&#xff0c;hashCode()比较的其实也是内存地址(内存地址输入到哈希函数中得到的整数) 重写了之后&#xff0c;equals()比较的是对象的内容值&#xff0c;如果hashCode()不重写&#xff0c;还是…

Android硬件通信之 WIFI通信

一&#xff0c;简介 1.1 随着网络的普及和通信技术的发展&#xff0c;网络的传输速度也越来越快&#xff0c;wifi技术也还成为手机设备最基本的配置。我们可以通过wifi实现手机与手机之前的信息传输&#xff0c;当然也可以与任意一台有wifi模块的其它设备传输。 1.2 wifi与蓝…