首页 > 其他分享 >vue3 + vant4 checkbox多选弹框

vue3 + vant4 checkbox多选弹框

时间:2024-04-17 10:38:02浏览次数:29  
标签:checkbox const text value 多选弹 vant4 props false ref

实现效果

代码如下

多选组件
DictSelect.vue

<template>
  <van-popup :show="showPicker" position="bottom" :style="{ height: '34vh' }">
    <div class="con">
      <div class="confirmBtns">
        <van-button class="qxBtn" @click="handleClose" size="normal"
          >取消</van-button
        >
        <div class="title" size="normal">{{ title }}</div>
        <van-button class="qrBtn" @click="onSubmit" size="normal"
          >确认</van-button
        >
      </div>
      <div class="checkboxCon">
        <van-cell v-if="showTotalBtn" title="全选">
          <template #right-icon>
            <van-checkbox
              v-model="isCheckAll"
              :indeterminate="isIndeterminate"
            />
          </template>
        </van-cell>
        <van-checkbox-group
          v-model="selectList"
          ref="checkboxGroup"
          @change="checkedResultChange"
        >
          <van-cell
            v-for="(item, index) in dataList"
            :key="index"
            :title="`${item.text}`"
          >
            <template #right-icon>
              <van-checkbox :name="item.value" />
            </template>
          </van-cell>
        </van-checkbox-group>
      </div>
    </div>
  </van-popup>
</template>

<script setup>
import { reactive, ref, watch, computed, onMounted } from "vue";

const props = defineProps({
  title: {
    type: String,
    default: ""
  },
  dataList: {
    type: Array,
    default: () => []
  },
  initSelectList: {
    type: Array,
    default: () => []
  },
  showTotalBtn: {
    type: Boolean,
    default: false
  }
});

const showPicker = ref(false);
const checkboxGroup = ref();
const isCheckAll = ref(false);
const isIndeterminate = ref(false); // 是否为不确定状态
const selectList = ref([...props.initSelectList]);

const emits = defineEmits(["handleSelect"]);

const handleOpen = () => {
  showPicker.value = true;
};

const handleClose = () => {
  showPicker.value = false;
  // onReset();
};

const onSubmit = () => {
  const selectListText = (selectList.value || []).map(s => {
    const current = props.dataList.find(d => d.value === s);
    return current?.text;
  });

  emits("handleSelect", { values: selectList.value, texts: selectListText });
  handleClose();
};

const checkedResultChange = value => {
  const checkedCount = value.length;
  isCheckAll.value = checkedCount === props.dataList.length;
  isIndeterminate.value =
    checkedCount > 0 && checkedCount < props.dataList.length;
};

watch(isCheckAll, (newValue, oldValue) => {
  if (newValue) {
    checkboxGroup.value.toggleAll(true);
    isIndeterminate.value = false;
  } else {
    checkboxGroup.value.toggleAll();
    isIndeterminate.value = false;
  }
});

defineExpose({
  handleOpen,
  handleClose
});
</script>

<style lang="less" scoped>
.con {
  .confirmBtns {
    display: flex;
    justify-content: space-between;
    height: 44px;
    line-height: 44px;

    .title {
      border: none;
      color: #000;
    }

    .qxBtn {
      border: none;
      color: #969799;
    }

    .qrBtn {
      border: none;
      color: #1989fa;
    }
  }

  .checkboxCon {
    width: 100%;
    height: calc(34vh - 44px);
    overflow-y: auto;
    padding: 10px 0;
  }
}
</style>

父组件使用:

<template>
  <van-field
    v-model="formObj.rangeText"
    name="rangeText"
    label="多选"
    label-align="top"
    placeholder="请输入"
    type="text"
    is-link
    readonly
    :rules="[{ required: true, message: '请选择' }]"
    @click="handlePicker"
  />
  <dict-select
    ref="pickerRef"
    title="请选择"
    showTotalBtn
    :dataList="dataList"
    :initSelectList="formObj.range"
    @handleSelect="onConfirm"
  />
</template>

<script setup>
import { ref } from "vue";

const pickerRef = ref();
const formObj = ref({
  range: ['1'],
  rangeText: ['选项一']
});
const dataList = ref([
  { value: "1", text: "选项一" },
  { value: "2", text: "选项二" },
  { value: "3", text: "选项三" },
  { value: "4", text: "选项四" }
]);

const onConfirm = ({ values, texts }) => {
  console.log("value", values, texts);
  formObj.value.range = values;
  formObj.value.rangeText = (texts || []).join(",");
};

const handlePicker = () => {
  pickerRef?.value?.handleOpen && pickerRef?.value?.handleOpen();
};
</script>

标签:checkbox,const,text,value,多选弹,vant4,props,false,ref
From: https://www.cnblogs.com/ZerlinM/p/18139906

相关文章

  • uniapp checkbox_group实现全选和反选功能
    <template> <view> <label> <checkbox:value="value":checked="allpicks"@tap="allpick"/><text>全选</text> </label> <checkbox-groupname="allpick"> <label......
  • 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关
    往期回顾【QT入门】Qt自定义控件与样式设计之QPushButton常用qss-CSDN博客【QT入门】Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-CSDN博客【QT入门】Qt自定义控件与样式设计之QComboBox样式表介绍-CSDN博客 【QT入门】Qt自定义控件与样式设计之......
  • SAP:界面程序上的按钮、LABEL、Checkbox等说明在哪里定义
    环境:SAPECC6:1、界面程序上的按钮、LABEL、Checkbox等说明在哪里定义?在事务码T-CODE:SE80创建程序后(如:Z12_06),在工具菜单栏点击“其它对象...”按钮,选择”增强选项“,在对象选择窗口的,选择”程序”标签页的“文本元素”。在“文本符号”标签页里输入文本内容。字段说明:符......
  • Qt QCheckBox设置复选框的大小
    Qt设计QCheckBox样式表QCheckBox的各部分代表的样式表1QCheckBox2{3background-color:rgb(85,170,255);4color:yellow;5}67QCheckox::indicator:unchecked8{9/*设置边框的风格*/10border-style:solid;11border-width......
  • QT 之 QCheckBox 去除边框
    以下两种方法均可去除checkBox前面的边框:方法一:如下图所示,直接在样式表上写以下代码即可,但这第一个方法有个弊端,我在安卓手机上运行后旁边会有个小黑点,不仔细看会看不出来,​​​​故除非第二个方案运行后没反应才使用此方法:效果图:方法二:如下图所示,一样也是在样式表中写......
  • 动态生成UniCheckBox列,并绑定事件和下标访问
     procedureTmainform.checklistboxclick(Sender:TObject);beginif(senderasTUniCheckBox).CheckedthenbeginShowMessage((senderasTUniCheckBox).Caption);end;//YoucanusecheckortagortheotherpropertiesofTunicheckBoxend;procedur......
  • Uniapp开发中实现单选checkbox的正确方式
    遇到这种单选是否的需求,你肯定会想这还不简单,放一个checkbox就行,然后想当然的这样用:<checkboxv-model="value"/>但其实在uniapp里是不能直接写的!结果勾选时value的值并没有变化。尝试了加一个:checked绑定也不行。而uni-data-checkbox又只适用于多选的情况。之后我想起到......
  • 复选框——QCheckBox
    简介这个组件是一个界面上的复选框示例代码fromPySide6.QtWidgetsimportQApplication,QWidget,QCheckBox,QVBoxLayout,QPushButtonclassMyCheckBox(QWidget):def__init__(self):super().__init__()#Mark基本使用checkbox=QCheckBox......
  • UnicheckBox左侧选择框显示问题!!!
    UnicheckBox左侧选择框有时显示、有时不显示,是一个BUG啊。试了后发现,改变一下程序uses列表顺序,可解决这个问题:unitabcc;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,DateUtils,uniPanel,uniGUIBaseClasses,uniGUIFrame,uni......
  • Excel批量插入checkbox的宏代码
    来源网络,作为个人记录使用手动在excel中添加勾选框不复杂,但是添加多个的时候会很麻烦,特别是在做数据分析时,选择框属性应该绑定在对应单元格下,使用普通的填充方式无法到达要求,因此使用VBA宏命令批量添加.1Sub添加复选框()2'标题'3Application.ScreenUpdating=f......