【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="元"
/>
相关推荐
yuanyxh4 小时前
Mac 软件推荐
前端·javascript·程序员
万少4 小时前
AtomCode开发微信小程序《谁去呀》 全流程
前端·javascript·后端
某人辛木4 小时前
Web自动化测试
前端·python·pycharm·pytest
Kagol5 小时前
Superpowers GSD gstack AgentSkills深度测评
前端·人工智能
excel6 小时前
JavaScript 字符串与模板字面量:从表象到本质理解
前端
京东云开发者6 小时前
当AI成为导演-如何用AI创作动漫短剧
前端
李白的天不白7 小时前
使用 SmartAdmin 进行前后端开发
java·前端
乘风gg7 小时前
🤡PUA AI Coding 工具 的 10 条终极语录
前端·ai编程·claude
学Linux的语莫7 小时前
Vue 3 入门教程
前端·javascript·vue.js
怕浪猫7 小时前
第一章、Chrome DevTools Protocol (CDP) 详解
前端·javascript·chrome