【Vue】element plus Slider小数组件设置顺滑程度

文章目录

Slider滑块

ts 复制代码
<template>
  <div class="simple_slider_container">
    <div v-if="title" :style="{ fontSize: fontSize, width: titleWidth }">{{ prop.title }}</div>
    <el-slider
      v-model="sliderValue"
      :max="prop.max * Math.pow(10, prop.precision)"
      :min="prop.min * Math.pow(10, prop.precision)"
      :format-tooltip="(val) => val / Math.pow(10, prop.precision)"
      style="margin-left: 10px"
    />
    <div :style="{ fontSize: fontSize, minWidth: '45px', textAlign: 'center' }">{{ data }}</div>
    <el-icon v-if="prop.setDefaultButton" class="simple_slider_refresh" @click="setDefault">
      <RefreshRight />
    </el-icon>
  </div>
</template>

<script setup lang="ts">
import { computed } from 'vue'
// 计算属性:转换真实值 ↔ 滑块原始值
import { onMounted } from 'vue'

const sliderValue = computed({
  get() {
    // 真实值 → 滑块值(乘以10)
    return data.value * Math.pow(10, prop.precision)
  },
  set(val) {
    // 滑块值 → 真实值(除以10)
    data.value = val / Math.pow(10, prop.precision)
  },
})

const prop = defineProps({
  defaultValue: {
    type: Number,
    default: 0,
  },
  setDefaultButton: {
    type: Boolean,
    default: true,
  },
  max: {
    type: Number,
    default: 100,
  },
  min: {
    type: Number,
    default: 0,
  },
  name: {
    type: Number,
    default: 0,
  },
  title: String,
  fontSize: {
    type: String,
    default: '16px',
  },
  titleWidth: {
    type: String,
    default: '6rem',
  },
  precision: {
    type: Number,
    default: 0,
  },
})

const data = defineModel()

const setDefault = () => {
  data.value = prop.defaultValue
}

onMounted(() => {
  if (data.value == null) {
    data.value = prop.defaultValue
  }
})
</script>

<style scoped lang="less">
.simple_slider_container {
  width: 100%;
  display: flex;
  align-items: center;
}

.simple_slider_refresh {
}

.simple_slider_refresh:hover {
  cursor: pointer;
}
</style>

Select选择器

ts 复制代码
<template>
  <div class="simple_slider_container">
    <div v-if="title" :style="{ fontSize: fontSize, width: titleWidth }">{{ prop.title }}</div>
    <el-select v-model="data" style="width: 150px">
      <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.value" />
    </el-select>
  </div>
</template>

<script setup lang="ts">
import { onMounted } from 'vue'

const prop = defineProps({
  defaultValue: {
    type: Number,
    default: 0,
  },
  options: {
    type: Array,
    default: () => [],
  },
  title: String,
  fontSize: {
    type: String,
    default: '16px',
  },
  titleWidth: {
    type: String,
    default: '6rem',
  },
})

const data = defineModel()

onMounted(() => {
  if (data.value == null) {
    data.value = prop.defaultValue
  }
})
</script>

<style scoped lang="less">
.simple_slider_container {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
}
</style>

Antd选择

js 复制代码
<template>

  <FormSearch v-model:value="queryParam"
              :columns="boutiqueSolutionSearchArgs"
              @on-search="getList" />

  <a-table
      ref="sTableRef"
      :columns="columns.filter(i=>i.dataIndex !== 'action')"
      :data-source="list"
      :loading="loading"
      :pagination="false"
      :row-selection="rowSelection"
      :rowKey="record => record.solutionId"
      bordered>
    <template #bodyCell="{ column, text }">
      <template v-if="column.dataIndex === 'boutiqueSolutionState'">
        {{ text  === "LAUNCHED" ? "上架" : "下架"  }}
      </template>
    </template>
    <template #footer>
      <div style="display:flex;justify-content: flex-end;">
        <a-pagination v-model:current="pageNum"
                      v-model:page-size="pageSize"
                      :total="total"
                      show-quick-jumper
                      @change="onChange"/>
      </div>
    </template>
  </a-table>
</template>

<script lang="ts" setup>
import {boutiqueSolutionSearchArgs, columns} from "@/views/solution";
import {
  pageSolution
} from "@/api/solution";
import {onMounted, ref} from "vue";
import {FormSearch} from "@/components";
// const emits = defineEmits(["selectSolutionIdList"]);

let sTableRef = ref()
const queryParam = ref<any>({ueVersion: "V5_5"});
let list = ref()
const selectedSolutionIdList = defineModel()
const loading = ref(false)

const rowSelection = ref({
  selectedRowKeys: selectedSolutionIdList,
  onChange: (selectedRowKeys: (string | number)[], selectedRows: any[]) => {
    console.log(selectedRowKeys)
    selectedSolutionIdList.value=selectedRowKeys
    // emits('selectSolutionIdList', selectedSolutionIdList.value)
  },
});

// 获取列表
const getList = async () => {
  const param = {pageNum: pageNum.value, pageSize: pageSize.value, ...queryParam.value};

  const res = await pageSolution(param);
  list.value = res.data.list;
  total.value = res.data.total;
};

const pageNum = ref<number>(1);
const pageSize = ref<number>(10);
const total = ref<number>(0);
const onChange = (pageNumber: number) => {
  loading.value = true
  getList().finally(() => {loading.value=false})
};



onMounted(async () => {
  loading.value = true
  await getList().finally(() => {loading.value=false})
})


</script>


<style lang="less" scoped>

</style>
js 复制代码
<template>

  <FormSearch v-model:value="queryParam"
              :columns="boutiqueSolutionSearchArgs"
              @on-search="getList"/>

  <a-table
      ref="sTableRef"
      :columns="columns.filter(i=>i.dataIndex !== 'action')"
      :data-source="list"
      :loading="loading"
      :pagination="false"
      :row-selection="rowSelection"
      :rowKey="record => record.solutionId"
      bordered>
    <template #bodyCell="{ column, text }">
      <template v-if="column.dataIndex === 'boutiqueSolutionState'">
        {{ text === "LAUNCHED" ? "上架" : "下架" }}
      </template>
    </template>
    <template #footer>
      <div style="display:flex;justify-content: flex-end;">
        <a-pagination v-model:current="pageNum"
                      v-model:page-size="pageSize"
                      :total="total"
                      show-quick-jumper
                      @change="onChange"/>
      </div>
    </template>
  </a-table>
</template>

<script lang="ts" setup>
import {boutiqueSolutionSearchArgs, columns} from "@/views/solution";
import {
  pageSolution
} from "@/api/solution";
import {onMounted, ref} from "vue";
import {FormSearch} from "@/components";
// const emits = defineEmits(["selectSolutionIdList"]);

let sTableRef = ref()
const queryParam = ref<any>({ueVersion: "V5_5"});
let list = ref()
const selectedSolutionIdList = ref()
const selectedSolutionRow = ref([])
const loading = ref(false)

const rowSelection = ref({
  selectedRowKeys: selectedSolutionIdList,
  onChange: (selectedRowKeys: (string | number)[], selectedRows: any[]) => {
    console.log(selectedRowKeys)
    selectedSolutionIdList.value = selectedRowKeys
    // emits('selectSolutionIdList', selectedSolutionIdList.value)
  },
  onSelect: (record: any, selected: boolean, selectedRows: []) => {
    // console.log("==============1",selectedRows);
    selectedSolutionRow.value.push(selectedRows)
  },
  onSelectAll: (selected: boolean, selectedRows: any[], changeRows:  []) => {
    selectedSolutionRow.value.push(selectedRows)
  },
  preserveSelectedRowKeys: true // 关键:否则翻页就清空
});

// 获取列表
const getList = async () => {
  const param = {pageNum: pageNum.value, pageSize: pageSize.value, ...queryParam.value};

  const res = await pageSolution(param);
  list.value = res.data.list;
  total.value = res.data.total;
};

const pageNum = ref<number>(1);
const pageSize = ref<number>(10);
const total = ref<number>(0);
const onChange = (pageNumber: number) => {
  loading.value = true
  getList().finally(() => {
    loading.value = false
  })
};


onMounted(async () => {
  loading.value = true
  await getList().finally(() => {
    loading.value = false
  })
})


</script>


<style lang="less" scoped>

</style>

Antd input 分、元转换

js 复制代码
<a-input-number
    v-model:value="goodsState.price"
    :formatter="(value: number) => value / 100"
    :max="999999"
    :min="0"
    :parser="(value: number) => value * 100"
    :precision="2"
    style="width: 100%"
    suffix="元"
/>
相关推荐
Bigger4 小时前
🔥 一份 Agent 工程岗 JD,暴露了市场真正想要什么样的人
前端·agent·全栈
我头上有犄角ovo4 小时前
我在微信小程序里手搓人脸识别引导,结果被“右转头”和“手遮脸”教育了
前端
David_Xia4 小时前
干爆 11s 提交卡顿!引入 Rust 级 oxlint 彻底拯救团队 Git Commit 噩梦的重构实践
前端
前端环境观察室4 小时前
别急着让 Agent 跑任务,先把浏览器环境上下文建模
前端
Dxy12393102164 小时前
js中Math.min.apply()详解
开发语言·javascript
蝎子莱莱爱打怪4 小时前
零基础用AI写App?兄弟😂 醒醒吧,那只是个玩具罢了!
前端·人工智能·后端
用户1306095607235 小时前
elpis里程碑一的阶段性总结
前端
砍材农夫5 小时前
物联网 基于netty控制报文结构(发布与接收)
java·开发语言·前端·javascript·物联网
光影少年5 小时前
react的Context 跨层传值、优缺点、适用场景
前端·react.js·掘金·金石计划