vue3 新增弹窗 多选分页

<el-button :disabled="title == '查看领用单'" type="primary" plain icon="Plus" @click="addItem"

size="default">新增</el-button>

<deviceList ref="devideListRef" @details="changeData"></deviceList>

function addItem() {

if (!form.value.storeroomId) {

proxy.$modal.msgError("请选择库房");

return

}

devideListRef.value.handle(form.value.equipmentList, form.value.deptId, form.value.storeroomId)

}

子组件deviceList中代码

<template>
  <el-dialog v-model="deviceOpen" width="60%" append-to-body>
    <template #header>
      <div style="display: flex;align-items: center;">
        <div class="info-title"></div>
        <span style="font-size: 15px;color: #2d2d2d;">设备明细</span>
      </div>
    </template>
    <el-form :model="devideListQueryParams" ref="queryRef" :inline="true">
      <el-form-item label="设备名称:" prop="equipmentName">
        <template #label>
          <div class="formlabel">设备名称:</div>
        </template>
        <el-input style="width: 240px;" v-model="devideListQueryParams.equipmentName" placeholder="请输入设备名称"
          maxlength="15" />
      </el-form-item>
      <el-form-item label="资源分类" prop="typeCode">
        <template #label>
          <div class="formlabel">资源分类:</div>
        </template>
        <el-select style="width: 240px" v-model="devideListQueryParams.typeCode" placeholder="请选择"
          @change="deviceChange">
          <el-option v-for="(item, index) in typeCodeOpt" :key="index" :label="item.typeName" :value="item.typeCode" />
        </el-select>
      </el-form-item>
      <el-form-item label="资源类型" prop="subCode">
        <template #label>
          <div class="formlabel">资源类型:</div>
        </template>
        <el-select style="width: 240px" @visible-change="deviceVisibleChange()" v-model="devideListQueryParams.subCode"
          placeholder="请选择">
          <el-option v-for="(item, index) in deviceTypeOption" :key="index" :label="item.subName"
            :value="item.subCode" />
        </el-select>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <!-- @select-all="selectAllChange" -->
    <el-table ref="devideDetailRef" :row-key="row => row.id" :data="devideList" :stripe="false" max-height="300"
      size="small" border class="index-table table_thin" @select="handleDetailSelectionChange" :loading="loading"
      @select-all="selectAllChange">
      <el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
      <el-table-column label="序号" width="60" type="index" align="center"></el-table-column>
      <el-table-column label="库房" align="center" prop="storeroomName" min-width="100" :show-overflow-tooltip="true"
        class-name="ellipsis-cell">
        <template #default="scope">
          <span class="tableicon ellipsis">
            {{ scope.row.storeroomName }}
          </span>
        </template>
      </el-table-column>

      <el-table-column label="资源分类" align="center" prop="typeName" min-width="100">
        <template #default="scope">
          {{ scope.row.typeName || '--' }}
        </template>
      </el-table-column>
      <el-table-column label="资源类型" align="center" prop="subName" min-width="100">
        <template #default="scope">
          {{ scope.row.subName || '--' }}
        </template>
      </el-table-column>
      <el-table-column label="设备名称" align="center" prop="equipmentName" min-width="100" :show-overflow-tooltip="true"
        class-name="ellipsis-cell">
        <template #default="scope">
          <span class="tableicon ellipsis">
            {{ scope.row.equipmentName }}
          </span>
        </template>
      </el-table-column>
      <el-table-column label="序列号" align="center" prop="equipmentNo" min-width="100"></el-table-column>
      <el-table-column label="固定资产编号" align="center" prop="propertyNo" min-width="270"></el-table-column>
      <el-table-column label="品牌" align="center" prop="brand" min-width="100"></el-table-column>
      <el-table-column label="型号" align="center" prop="model" min-width="100"></el-table-column>
    </el-table>
    <pagination v-show="detailTotal > 0" :total="detailTotal" v-model:page="devideListQueryParams.pageNum"
      v-model:limit="devideListQueryParams.pageSize" @pagination="getList" />
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="detailSubmitForm" :loading="detailButtonLoading">确 定</el-button>
        <el-button @click="deviceOpen = false">取 消</el-button>
      </div>
    </template>
  </el-dialog>
</template>
<script setup>
import { getEquipmentList } from '@/api/system/receive';
import { ElMessage } from "element-plus";
import { nextTick, ref } from 'vue';
import { listType_info } from "@/api/system/typeInfo"
import { listClass_info } from "@/api/system/classInfo"
import {deepClone} from '@/utils/index'
const emit = defineEmits(['details'])
const selectDataList = ref([])
const { proxy } = getCurrentInstance();
const deviceTypeOption = ref([])
const detailTotal = ref(0);
const devideList = ref([]);
const detailButtonLoading = ref(false);
const selectedDeviceIds = ref([])
const data = reactive({
  devideListQueryParams: {
    pageNum: 1,
    pageSize: 2,
  },
});
const { devideListQueryParams } = toRefs(data);
const storeroomId = ref('')
const loading = false
const typeCodeOpt = ref([])
const deviceOpen = ref(false)
const devideDetailRef = ref(null)
function deviceChange(val) {
  if (val) {
    devideListQueryParams.value.subCode = ''
    listClass_info({ pageNum: 1, pageSize: 10000000, isStop: 0, typeCode: val }).then(res => {
      deviceTypeOption.value = res.rows
    })
  }
}
function handleDetailSelectionChange(row, val) {
  nextTick(() => {
    const v = row.find(v => val.id == v.id)
    if (v) {
      selectDataList.value.push(v)
    } else {
      let selectDataId = selectDataList.value.map(obj => obj.id)
      const obj = selectDataId.indexOf(val.id)
      if (obj != -1) {
        selectDataList.value.splice(obj, 1)
      }
    }
  })

}
function selectAllChange(row) {
  if (row && row.length > 0) {
    let selectDataId = selectDataList.value.map(obj => obj.id)
    row.forEach(ele => {
      if (selectDataId.indexOf(ele.id) == -1) {
        selectDataList.value.push(ele)
      } else {
        const obj = selectDataId.indexOf(ele.id)
        // 如果obj!==-1 包含 
        if (obj != -1) {
          selectDataList.value.splice(obj, 1, ele)
        } else {
          selectDataList.value.splice(obj, 1)
        }
      }
    })
  } else {
    let selectDataId = selectDataList.value.map(obj => obj.id)
    devideList.value.forEach(ele => {
      if (selectDataId.indexOf(ele.id) !== -1) {
        selectDataList.value.splice(ele, 1)
      }
    })
  }
}

function deviceVisibleChange() {
  if (!devideListQueryParams.value.typeCode) {
    ElMessage.error("请选择设备分类");
    return;
  }
}
// 设备明细确定按钮
function detailSubmitForm() {
  if (selectDataList.value.length === 0) return ElMessage.error("请选择出库设备");
  deviceOpen.value = false
  emit('details', JSON.parse(JSON.stringify(selectDataList.value)))
}
// 搜索
function handleQuery() {
  devideListQueryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
function resetQuery() {
  deviceTypeOption.value = []
  selectedDeviceIds.value = []
  proxy.resetForm("queryRef");
  handleQuery();
}

function getListType_info() {
  listType_info({ pageNum: 1, pageSize: 10000000, isStop: 0, category: "0" }).then(res => {
    typeCodeOpt.value = res.rows
  })
}
function getList() {
  nextTick(() => {
    getEquipmentList({ ...devideListQueryParams.value, storeroomId: storeroomId.value }).then(res => {
      devideList.value = res.rows
      detailTotal.value = res.total
      if (selectDataList.value && selectDataList.value.length > 0) {
        const selectDataId = selectDataList.value.map(obj => obj.id)
        devideDetailRef.value.clearSelection();
        nextTick(() => {
          let list = [...selectDataList.value]
          selectDataList.value = [...new Set(list.map(item => JSON.stringify(item)))].map(i => JSON.parse(i))
          devideList.value.forEach(row => {
            if (selectDataId.includes(row.id)) {
              devideDetailRef.value.toggleRowSelection(row);
            }
          });
        })
      } else {
        if (selectDataList.value.length == 0) return devideDetailRef.value.clearSelection();
      }
    })
  })
}
function handle(arr, id, storeId) {
  selectDataList.value = []
  selectDataList.value = deepClone(arr)
  devideListQueryParams.value.pageNum = 1
  getListType_info()
  devideListQueryParams.value.deptId = id
  storeroomId.value = storeId
  deviceOpen.value = true
  getList()
}
defineExpose({
  handle
});
</script>

<style></style>

<think>好的,我现在需要回答用户关于jQuery插件生态的问题。首先,我得回忆一下jQuery的基本情况。jQuery曾经非常流行,它的插件生态丰富,但近年来随着前端框架的发展,可能用户想了解现在的情况还是历史情况。不过用户的问题没有时间限制,应该全面介绍。 首先,jQuery插件的作用是什么?它们扩展了jQuery的功能,比如动画、表单处理、UI组件等。然后需要分几个大类来介绍,比如UI框架、动画、表单、数据可视化、响应式设计、工具类等。每个类别下举几个典型的例子,比如jQuery UI和jQuery Mobile属于UI框架,虽然现在可能不太流行了,但曾经是核心插件。 接下来,动画方面,Velocity.js可能是个例子,比原生动画性能更好。表单验证插件如jQuery Validation Plugin,现在可能还在一些老项目中使用。数据可视化方面,比如图表插件Flot、Chart.js,虽然Chart.js可能不依赖jQuery,但常一起使用。 响应式设计方面,imagesLoaded插件用来检测图片加载,适合响应式布局。工具类插件如Magnific Popup用于灯箱效果,Slick轮播插件,这些在以前很常见。 然后要提到插件生态的特点,比如易用性、社区支持、兼容性,但也要说明随着现代框架的兴起,jQuery的使用在减少,但旧项目仍然依赖这些插件。 需要注意用户的问题可能想知道当前还有哪些流行的插件,或者生态现状,所以应该提到虽然新项目可能少用,但维护中的插件和遗留系统仍然存在。最后给出建议,如果是维护旧项目,这些插件有用,新项目建议使用现代框架。 还要检查是否有遗漏的重要插件类别,比如Ajax相关插件,或者特定的工具插件。确保覆盖主要方面,同时结构清晰,分点说明,让用户容易理解。另外,需要确保提到的插件名称正确,比如确认Slick和Magnific Popup确实是基于jQuery的,避免错误。 最后,总结时要平衡jQuery插件生态的历史贡献和现状,既不过时贬低,也不夸大其当前地位,提供客观的信息帮助用户决策。</think>jQuery的插件生态曾是前端开发的核心组成部分,通过扩展jQuery的功能帮助开发者高效实现复杂需求。以下是其插件生态的主要分类和典型代表: --- ### 一、主要分类及典型插件 1. **UI框架与组件** - **jQuery UI** 提供交互组件(如拖拽、排序)和可视化控件(日期择器、进度条)。 - **jQuery Mobile** 专注于移动端UI,支持响应式布局和触摸事件。 2. **动画与特效** - **Velocity.js** 高性能动画库,支持复杂序列和硬件加速。 - **Animate.css(结合jQuery使用)** 通过添加CSS类实现预定义动画。 3. **表单处理** - **jQuery Validation Plugin** 表单验证插件,支持自定义规则和错误提示。 - **Select2** 增强下拉框功能,支持搜索、和远程数据加载。 4. **数据可视化** - **Flot** 基于Canvas的图表库,适合绘制折线图、柱状图。 - **DataTables** 动态表格插件,支持分页、排序和异步加载数据。 5. **响应式与媒体处理** - **imagesLoaded** 检测图片加载完成,常用于瀑布流布局。 - **Magnific Popup** 轻量级弹窗插件,支持图片、视频和Ajax内容。 6. **工具类插件** - **Slick Carousel** 高度可定制的轮播图组件。 - **LazyLoad** 延迟加载图片或内容,提升页面性能。 --- ### 二、插件生态特点 1. **低门槛与易用性** 通过链式调用和简洁API快速集成,例如: ```javascript $(&#39;#slider&#39;).slick({ autoplay: true }); ``` 2. **社区驱动** - 官方插件库([jQuery Plugin Registry](https://plugins.jquery.com/))曾集中管理数千个插件。 - GitHub等平台提供大量开源解决方案。 3. **兼容性优先** 数插件支持跨浏览器(如IE8+),适合传统项目。 --- ### 三、现状与建议 - **现状**: - 随着React/Vue等框架兴起,jQuery插件新增数量减少,但大量遗留项目仍依赖经典插件。 - 部分插件已停止维护,需谨慎择(如检查GitHub更新时间和Issues)。 - **建议**: - **维护旧项目**:优先使用成熟插件(如DataTables、Select2)。 - **新项目**:建议采用现代框架(React/Vue)+ 专用工具库(如Axios、D3.js)。 --- ### 四、总结 jQuery插件生态通过丰富的工具链降低了早期Web开发的复杂度,虽不再主导前端潮流,但其设计思想仍值得学习。理解其生态有助于维护旧系统和过渡到现代技术栈。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值