| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- <script setup lang="ts">
- import { ref, watch } from "vue";
- import { message } from "@/utils/message";
- import { getKeyList } from "@pureadmin/utils";
- defineOptions({
- name: "CheckButton"
- });
- const spaceSize = ref(20);
- const size = ref("default");
- const dynamicSize = ref();
- const checked = ref(true);
- const radio = ref("wait");
- const radioBox = ref("complete");
- const radioCustom = ref("progress");
- const checkboxGroup = ref(["apple", "tomato"]);
- const checkboxGroupBox = ref(["cucumber", "onion", "blueberry"]);
- const checkboxGroupCustom = ref(["tomato", "watermelon", "strawberry"]);
- /** 单选(可控制间距的按钮样式) */
- const checkTag = ref([
- {
- title: "等待中",
- checked: false
- },
- {
- title: "进行中",
- checked: true
- },
- {
- title: "已完成",
- checked: false
- }
- ]);
- const curTagMap = ref({});
- function onChecked(tag, index) {
- if (size.value === "disabled") return;
- curTagMap.value[index] = Object.assign({
- ...tag,
- checked: !tag.checked
- });
- checkTag.value.map(item => (item.checked = false));
- checkTag.value[index].checked = curTagMap.value[index].checked;
- const { title, checked } = curTagMap.value[index];
- message(checked ? `已选中${title}` : `取消选中${title}`, {
- type: "success"
- });
- }
- /** 多选(可控制间距的按钮样式) */
- const checkGroupTag = ref([
- {
- title: "苹果",
- checked: true
- },
- {
- title: "西红柿",
- checked: true
- },
- {
- title: "香蕉",
- checked: false
- }
- ]);
- const curTagGroupMap = ref({});
- function onGroupChecked(tag, index) {
- if (size.value === "disabled") return;
- curTagGroupMap.value[index] = Object.assign({
- ...tag,
- checked: !tag.checked
- });
- checkGroupTag.value[index].checked = curTagGroupMap.value[index].checked;
- }
- function onSingleChecked() {
- if (size.value === "disabled") return;
- checked.value = !checked.value;
- }
- watch(size, val =>
- val === "disabled"
- ? (dynamicSize.value = "default")
- : (dynamicSize.value = size.value)
- );
- </script>
- <template>
- <el-card shadow="never">
- <template #header>
- <div class="card-header">
- <el-space wrap :size="40">
- <span style="font-size: 16px; font-weight: 800"> 可选按钮 </span>
- <el-radio-group v-model="size">
- <el-radio value="large">大尺寸</el-radio>
- <el-radio value="default">默认尺寸</el-radio>
- <el-radio value="small">小尺寸</el-radio>
- <el-radio value="disabled">禁用</el-radio>
- </el-radio-group>
- </el-space>
- </div>
- <el-link
- class="mt-2"
- href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/check-button.vue"
- target="_blank"
- >
- 代码位置 src/views/components/check-button.vue
- </el-link>
- </template>
- <div class="mb-2">单选(紧凑风格的按钮样式)</div>
- <el-radio-group
- v-model="radio"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-radio-button value="wait">等待中</el-radio-button>
- <el-radio-button value="progress">进行中</el-radio-button>
- <el-radio-button value="complete">已完成</el-radio-button>
- </el-radio-group>
- <el-divider />
- <div class="mb-2">单选(带有边框)</div>
- <el-radio-group
- v-model="radioBox"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-radio value="wait" border>等待中</el-radio>
- <el-radio value="progress" border>进行中</el-radio>
- <el-radio value="complete" border>已完成</el-radio>
- </el-radio-group>
- <el-divider />
- <div class="mb-2">单选(自定义内容)</div>
- <el-radio-group
- v-model="radioCustom"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-radio-button value="wait">
- <span class="flex">
- <IconifyIconOnline icon="ri:progress-8-fill" class="mr-1" />
- 等待中
- </span>
- </el-radio-button>
- <el-radio-button value="progress">
- <span class="flex">
- <IconifyIconOnline icon="ri:progress-6-line" class="mr-1" />
- 进行中
- </span>
- </el-radio-button>
- <el-radio-button value="complete">
- <span class="flex">
- <IconifyIconOnline icon="ri:progress-8-line" class="mr-1" />
- 已完成
- </span>
- </el-radio-button>
- </el-radio-group>
- <el-divider />
- <div class="mb-2">多选(紧凑风格的按钮样式)</div>
- <el-checkbox-group
- v-model="checkboxGroup"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-checkbox-button value="apple">苹果</el-checkbox-button>
- <el-checkbox-button value="tomato">西红柿</el-checkbox-button>
- <el-checkbox-button value="banana">香蕉</el-checkbox-button>
- </el-checkbox-group>
- <el-divider />
- <div class="mb-2">多选(带有边框)</div>
- <el-checkbox-group
- v-model="checkboxGroupBox"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-checkbox value="cucumber" border>黄瓜</el-checkbox>
- <el-checkbox value="onion" border>洋葱</el-checkbox>
- <el-checkbox value="blueberry" border>蓝莓</el-checkbox>
- </el-checkbox-group>
- <el-divider />
- <div class="mb-2">多选(来点不一样的体验)</div>
- <el-checkbox-group
- v-model="checkboxGroupCustom"
- class="pure-checkbox"
- :size="dynamicSize"
- :disabled="size === 'disabled'"
- >
- <el-checkbox-button value="tomato">
- <span class="flex">
- <IconifyIconOnline icon="streamline-emojis:tomato" class="mr-1" />
- 番茄
- </span>
- </el-checkbox-button>
- <el-checkbox-button value="watermelon">
- <span class="flex">
- <IconifyIconOnline
- icon="streamline-emojis:watermelon-1"
- class="mr-1"
- />
- 西瓜
- </span>
- </el-checkbox-button>
- <el-checkbox-button value="strawberry">
- <span class="flex">
- <IconifyIconOnline
- icon="streamline-emojis:strawberry-1"
- class="mr-1"
- />
- 草莓
- </span>
- </el-checkbox-button>
- </el-checkbox-group>
- <el-divider />
- <div>可控制间距的按钮样式</div>
- <el-slider
- v-model="spaceSize"
- class="mb-2 w-[300px]!"
- :show-tooltip="false"
- :disabled="size === 'disabled'"
- />
- <div class="mb-2">单选</div>
- <el-space wrap :size="spaceSize">
- <el-check-tag
- v-for="(tag, index) in checkTag"
- :key="index"
- :class="[
- 'select-none',
- size === 'disabled' && 'tag-disabled',
- tag.checked && 'is-active'
- ]"
- :checked="tag.checked"
- @change="onChecked(tag, index)"
- >
- {{ tag.title }}
- </el-check-tag>
- </el-space>
- <div class="mb-2 mt-4">
- 多选
- {{
- getKeyList(
- checkGroupTag.filter(tag => tag.checked),
- "title"
- )
- }}
- </div>
- <el-space wrap :size="spaceSize">
- <el-check-tag
- v-for="(tag, index) in checkGroupTag"
- :key="index"
- :class="[
- 'select-none',
- size === 'disabled' && 'tag-disabled',
- tag.checked && 'is-active'
- ]"
- :checked="tag.checked"
- @change="onGroupChecked(tag, index)"
- >
- {{ tag.title }}
- </el-check-tag>
- </el-space>
- <el-divider />
- <div class="mb-2">单个可选按钮</div>
- <el-check-tag
- :class="[
- 'select-none',
- size === 'disabled' && 'tag-disabled',
- checked && 'is-active'
- ]"
- :checked="checked"
- @change="onSingleChecked"
- >
- 一个人也要努力 😊
- </el-check-tag>
- </el-card>
- </template>
- <style lang="scss" scoped>
- :deep(.el-divider--horizontal) {
- margin: 17px 0;
- }
- :deep(.pure-checkbox) {
- .el-checkbox-button {
- /* 选中时的自定义样式 */
- &.is-checked {
- .el-checkbox-button__inner {
- color: var(--el-color-primary);
- background-color: var(--el-color-primary-light-8);
- border-color: transparent;
- border-left-color: #fff;
- }
- }
- /* 禁用时的自定义样式 */
- &.is-disabled {
- .el-checkbox-button__inner {
- color: var(--el-disabled-text-color);
- background-color: var(
- --el-button-disabled-bg-color,
- var(--el-fill-color-blank)
- );
- border-color: var(
- --el-button-disabled-border-color,
- var(--el-border-color-light)
- );
- }
- }
- }
- }
- /** 可控制间距的按钮禁用样式 */
- .tag-disabled {
- color: var(--el-disabled-text-color);
- cursor: not-allowed;
- background-color: var(--el-color-info-light-9);
- &:hover {
- background-color: var(--el-color-info-light-9);
- }
- &.is-active {
- background-color: var(--el-color-primary-light-9);
- }
- }
- </style>
|