活动介绍

vue3-grid-layout中grid-item中使用component挂在组件,组件内怎么动态获取grid-item的实际高度

时间: 2025-08-27 20:56:21 浏览: 5
<think>我们面对的问题是在vue3-grid-layout的grid-item中使用component挂载组件时,如何动态获取grid-item的实际高度。 首先,我们需要理解vue3-grid-layout是一个用于创建可拖拽和调整大小的网格布局的Vue3组件库。在grid-item中,我们可以使用动态组件(component)来挂载不同的子组件。但是,由于grid-item的大小可能随着用户拖拽或调整而改变,子组件可能需要知道当前grid-item的实际尺寸(特别是高度)来进行自适应布局。 解决思路: 1. 在grid-item内部,我们可以通过监听grid-item的尺寸变化来获取其高度。 2. 由于grid-item本身是一个Vue组件,我们可以使用Vue的ref来获取其DOM元素。 3. 然后,我们可以利用ResizeObserver来监听这个DOM元素的尺寸变化。 4. 将获取到的高度传递给子组件(通过props或事件)。 但是,这里有一个关键点:我们是在grid-item中使用component挂载组件,这意味着子组件是在运行时动态挂载的。因此,我们需要确保在子组件内部能够获取到grid-item的高度。 具体步骤: 步骤1:在grid-item的模板中,使用ref获取其DOM元素。 步骤2:在grid-item组件内部,使用ResizeObserver监听该DOM元素的高度变化。 步骤3:将高度值通过props传递给动态组件(或者使用provide/inject,但考虑到动态组件,props更直接)。 然而,在vue3-grid-layout中,grid-item组件已经封装好了,我们可能不能直接修改其内部代码。因此,我们需要在外部实现这个监听。 另一种思路是在挂载到grid-item内部的子组件中,自己监听父元素(即grid-item)的高度变化。但是,子组件并不知道自己是被挂载在grid-item中的,而且父元素是动态的。 因此,我们可以这样做: 1. 在grid-item中,我们使用一个容器元素包裹动态组件,并给这个容器元素设置ref。 2. 在父组件(使用vue3-grid-layout的组件)中,使用ref获取这个容器元素,然后监听其尺寸变化,并将高度通过props传递给动态组件。 但是,由于动态组件是动态挂载的,我们需要在挂载后获取容器元素,并建立监听。 考虑到这些,我们可以使用以下方法: 方法一:使用自定义指令 我们可以创建一个自定义指令,用于监听元素尺寸变化,并将高度传递给绑定的组件。 步骤: 1. 创建一个自定义指令,例如`v-resize`,该指令使用ResizeObserver监听元素尺寸变化,并在变化时将高度传递给绑定的值(例如一个函数)。 2. 在grid-item内部的容器元素上使用这个指令,并将一个方法传递给它,该方法用于更新动态组件需要的高度值。 方法二:在动态组件内部使用ResizeObserver监听其父元素 在动态组件内部,我们可以使用生命周期钩子(如onMounted)来获取其父元素(即grid-item内部的容器)并监听其尺寸变化。 但是注意:在Vue3中,组件内部的根元素可能有多个(fragment),所以我们需要确保组件内部有一个根元素,然后通过`$el.parentElement`来获取父元素。但这种方法依赖于DOM结构,如果结构改变可能会失效。 考虑到可靠性和封装性,我们采用方法一,即自定义指令。 具体实现: 1. 创建自定义指令: ```javascript // resize.js export default { mounted(el, binding) { const callback = binding.value; const observer = new ResizeObserver(entries => { for (let entry of entries) { // 传递高度和宽度 callback(entry.contentRect); } }); observer.observe(el); // 将observer保存到el上,以便卸载时使用 el._resizeObserver = observer; }, unmounted(el) { if (el._resizeObserver) { el._resizeObserver.disconnect(); } } }; ``` 2. 在main.js中全局注册该指令,或者在组件中局部注册。 3. 在父组件(使用vue3-grid-layout的组件)中,为包裹动态组件的容器元素添加指令,并传递一个处理函数,该函数将更新一个响应式变量(例如height)。 4. 将height作为props传递给动态组件。 示例代码: 父组件(使用vue3-grid-layout): ```vue <template> <grid-layout ...> <grid-item v-for="item in layout" ...> <!-- 使用一个容器元素包裹动态组件,并应用自定义指令 --> <div v-resize="onResize" style="height:100%;"> <component :is="item.component" :height="currentHeight" /> </div> </grid-item> </grid-layout> </template> <script> import { ref } from 'vue'; export default { setup() { const currentHeight = ref(0); function onResize(rect) { currentHeight.value = rect.height; } return { currentHeight, onResize }; } }; </script> ``` 这样,每当容器元素(即grid-item内部)的尺寸发生变化时,就会触发onResize函数,更新currentHeight,然后通过props传递给动态组件。 注意:由于每个grid-item都可能包含一个动态组件,因此我们需要为每个grid-item单独维护高度。上面的示例中,我们只展示了一个grid-item的情况,多个grid-item时,我们需要为每个grid-item分别存储高度(例如使用一个对象,key为grid-item的id)。 优化:在多个grid-item的情况下,我们可以将指令绑定到每个grid-item内部的容器,并在回调中根据grid-item的id更新对应的高度。 但是,在vue3-grid-layout中,每个grid-item通常会有自己的数据(比如i作为唯一标识),我们可以利用这个标识。 示例: ```vue <template> <grid-layout ...> <grid-item v-for="item in layout" :key="item.i" ...> <div v-resize="(rect) => onResize(item.i, rect)" style="height:100%;"> <component :is="item.component" :height="heights[item.i]" /> </div> </grid-item> </grid-layout> </template> <script> import { ref } from 'vue'; export default { setup() { const heights = ref({}); function onResize(id, rect) { heights.value[id] = rect.height; } return { heights, onResize }; } }; </script> ``` 这样,每个动态组件就可以接收到自己所在grid-item的当前高度了。 注意事项: 1. 自定义指令v-resize需要注册(全局或局部)。 2. 确保容器元素设置了高度100%以填充grid-item。 3. 由于ResizeObserver可能会频繁触发,如果对性能敏感,可以添加防抖。 总结:通过自定义指令监听grid-item内部容器的高度变化,并将高度传递给动态组件,从而实现在动态组件内部获取grid-item的实际高度。 相关问题: 1. 在Vue3中如何自定义指令? 2. ResizeObserver的使用方法是什么? 3. 在vue3-grid-layout中如何动态添加和删除grid-item? 4. 如何优化ResizeObserver频繁触发导致的性能问题?</think>在 Vue3-grid-layout 的 grid-item 中使用 component 挂载组件时,动态获取 grid-item 实际高度的方法如下: ### 解决方案步骤 1. **使用 `ResizeObserver` 监听尺寸变化** 在动态组件内部使用 ResizeObserver API 监听父容器(grid-item)的尺寸变化: ```javascript import { onMounted, onBeforeUnmount, ref } from 'vue' export default { setup() { const containerRef = ref(null) const height = ref(0) let observer = null onMounted(() => { // 监听父容器尺寸变化 observer = new ResizeObserver(entries => { for (let entry of entries) { height.value = entry.contentRect.height } }) if (containerRef.value?.parentElement) { observer.observe(containerRef.value.parentElement) } }) onBeforeUnmount(() => { if (observer) observer.disconnect() }) return { containerRef, height } } } ``` 2. **在模板中绑定 ref 并显示高度** ```vue <template> <div ref="containerRef"> <!-- 组件内容 --> <p>当前高度: {{ height }}px</p> </div> </template> ``` 3. **确保 grid-item 正确传递尺寸** (在父组件中) ```vue <grid-layout> <grid-item v-for="item in layout" :key="item.i"> <!-- 使用动态组件 --> <component :is="item.component" /> </grid-item> </grid-layout> ``` ### 关键点说明 1. **`ResizeObserver`**: - 现代浏览器原生支持的 API,专门用于监听元素尺寸变化 - 比通过 `window.resize` + `MutationObserver` 的组合更高效准确 - 监听的是组件的直接父元素(即 grid-item 的容器) 2. **`containerRef.parentElement`**: - 动态组件内部的根元素通过 `ref` 获取 - 其 `parentElement` 就是 grid-item 创建的容器 - 这是获取 grid-item 实际渲染高度的关键 3. **响应式高度值**: - 使用 `height.value` 存储当前高度 - 在模板中可直接绑定使用 - 可在计算属性或 watch 中响应高度变化 ### 优化建议 1. **添加防抖处理**(避免频繁更新): ```javascript import { debounce } from 'lodash-es' onMounted(() => { observer = new ResizeObserver(debounce(entries => { // ...更新逻辑 }, 100)) // 100ms防抖 }) ``` 2. **处理 SSR 兼容**: ```javascript onMounted(() => { if (typeof ResizeObserver === 'undefined') return // ...剩余逻辑 }) ``` 3. **封装为可复用 Hook** (推荐): ```javascript // useParentSize.js import { ref, onMounted, onBeforeUnmount } from 'vue' export default function useParentSize() { const height = ref(0) const width = ref(0) const containerRef = ref(null) let observer = null onMounted(() => { if (!containerRef.value?.parentElement) return observer = new ResizeObserver(entries => { const rect = entries[0].contentRect height.value = rect.height width.value = rect.width }) observer.observe(containerRef.value.parentElement) }) onBeforeUnmount(() => { observer?.disconnect() }) return { containerRef, height, width } } ``` 在组件中使用: ```javascript import useParentSize from './useParentSize' export default { setup() { const { containerRef, height } = useParentSize() return { containerRef, height } } } ``` ### 注意事项 1. **CSS 高度设置**: - 确保 grid-item 设置了 `height: 100%` 样式 - 避免在父容器上设置 `overflow: hidden` 影响尺寸获取 2. **生命周期时机**: - 在 `onMounted` 后开始监听,确保 DOM 已渲染 - 在 `onBeforeUnmount` 时销毁监听,避免内存泄漏 3. **Vue3-grid-layout 版本**: - 确保使用支持 Vue 3 的版本(如 `vue3-grid-layout@next`) - 旧版可能需要额外处理样式穿透 此方案通过直接监听 grid-item 渲染容器的尺寸变化,可准确获取动态调整后的实际高度,适用于拖拽缩放等交互场景[^1]。 --- ### 相关问题 1. **如何在 Vue3 中监听窗口大小变化?** `window.addEventListener('resize', handler)` + `onUnmounted` 移除监听 2. **Vue3 动态组件(component)如何使用 ref?** 使用 `:ref` 绑定函数或通过 `defineExpose` 暴露方法 3. **ResizeObserver 不触发可能的原因?** - 目标元素未渲染 - CSS 尺寸未实际变化 - 元素被设置为 `display: none` 4. **如何在 Vue3 中优雅地使用防抖函数?** 推荐使用 `lodash/debounce` 或 VueUse 的 `useDebounceFn` 5. **Vue3-grid-layout 如何实现响应式布局?** 结合 `grid-layout` 的响应式属性和 CSS 媒体查询 6. **如何在组件间传递尺寸信息?** 可通过 provide/inject 或状态管理库(如 Pinia) [^1]: 参考 Vue 组件生命周期和 DOM 操作实践 [^2]: 基于前端组件库和响应式设计经验 [^3]: 参考 Vue 官方文档关于组合式 API 的使用 [^4]: 参考 Lodash 和 PostCSS 在 Vue 项目中的集成实践
阅读全文

相关推荐

<template> <title>{{$route.name}}</title> {{$route.name}} <aui-form id="editForm"> <aui-form-item label="版本号" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.planId" :op="planIdOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="厂区" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.locationCodeStr" :op="siteCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="部门" label-width="110px"> <aui-dropdown size="small" ref="deptCodeRef" v-model="searchForm.deptNameStr" :op="deptOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="工序" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.workSerctionStr" :op="workSerctionOp"></aui-dropdown> </aui-form-item> <aui-form-item label="产品线" label-width="110px"> <aui-dropdown size="small" ref="prodLineCnNameRef" v-model="searchForm.prodLineCnNameStr" :op="prodLineOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品族" label-width="110px"> <aui-dropdown size="small" ref="prodFamilyEnNameRef" v-model="searchForm.prodFamilyEnNameStr" :op="prodFamilyOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品型号" label-width="110px"> <aui-dropdown size="small" ref="prodModelCodeRef" v-model="searchForm.prodModelCodeStr" :op="prodModelCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="物料编码" label-width="110px"> <aui-input size="small" ref="itemCodeRef" v-model="searchForm.itemCodeStr" placeholder="连续首字母或者字符可模糊匹配"></aui-input> </aui-form-item> <aui-form-item label="类型" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.dataTypeStr" :op="dataTypeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item class="first-field-btn" label-width="0px" style="width: 265px"> <aui-button type="primary" size="mini" round @click="findClick">查询</aui-button> <aui-button type="primary" size="mini" round @click="reset" style="margin-right: 8px">重置</aui-button> <FormTempBtn style="width:100px;" :form-code="formId" :formData="searchForm" @templateChanged="setFormData"></FormTempBtn> </aui-form-item> </aui-form> <aui-grid height="100%" auto-resize ref="grid" :auto-load="false" resizable :row-class-name="rowClassName" :pager="pagerConfig" border :span-method="colspanMethod" :fetch-data="fetchData"> <template #toolbar> <aui-grid-toolbar id="scheduleSupplyDemandGridId" :setting="{ showIndex: true, sortable: Sortable, }" ref="auiToolbar" @remote-setting="remoteSetting" @save-setting="saveSetting"> <template #buttons> <aui-button size="mini" @click="exportData">导出</aui-button> <aui-button size="mini" @click="showBaseLoggerInfo">版本日志</aui-button> </template> </aui-grid-toolbar> </template> <aui-grid-column fixed="left" title="版本" field="planId" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="厂区" field="locationName" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="部门" field="deptName" min-width="120" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品线" field="prodLineCnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品族" field="prodFamilyEnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品型号" field="prodModelCode" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="工序" field="workSerction" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="物料编码" field="itemCode" min-width="90" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="类型" field="dataType" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="库存" field="invQty" min-width="80" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.invQty }} </template> </aui-grid-column> <aui-grid-column fixed="left" title="历史" field="hisQty" min-width="100" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.hisQty }} </template> </aui-grid-column> <aui-grid-column v-for="(item, i) in dateItem" :key="i" :field="item.field" :title="item.title" :renderer="renderFunction" min-width="50" align="center"></aui-grid-column> </aui-grid> <StockDialog v-if="showStock" :rowData="rowData" @changeDialog="changeDialog"></StockDialog> <InProcessWorkOrderSchedule v-if="showInProcess" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></InProcessWorkOrderSchedule> <WorkOrderScheduleHistory v-if="showHistory" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></WorkOrderScheduleHistory> <aui-dialog-box title="版本日志" class="history-Info" v-model="isShowBaseLoggerInfo" width="90%" top="8%" :dragable="true" :modal-closable="false"> <base-logger-info v-bind:apiUrl="getLoggerInfoUrl" v-if="isShowBaseLoggerInfo"></base-logger-info> </aui-dialog-box> </template> <script> import { Form, FormItem, Dropdown, Hae, $, DialogBox } from '@aurora/ui3' import { Grid, GridColumn, Modal, Pager, Button, GridToolbar } from '@aurora/vue3' import { FormTempBtn } from '@mxdesign/ui' import Sortable from 'sortablejs' import { remoteSettingFn, saveSettingFn, getCustomConfigsFn } from '@/utils/personSettings' import StockDialog from '@/components/supplydemandmgt/StockDialog' import InProcessWorkOrderSchedule from '@/components/supplydemandmgt/InProcessWorkOrderSchedule' import WorkOrderScheduleHistory from '@/components/supplydemandmgt/WorkOrderScheduleHistory' import BaseLoggerInfo from '../basedata/BaseLoggerInfo.vue' export default { components: { AuiDialogBox: DialogBox, AuiButton: Button, AuiForm: Form, AuiFormItem: FormItem, AuiDropdown: Dropdown, AuiGrid: Grid, AuiGridColumn: GridColumn, AuiGridToolbar: GridToolbar, FormTempBtn, StockDialog, InProcessWorkOrderSchedule, WorkOrderScheduleHistory, BaseLoggerInfo }, computed: { tableData() { return this.$refs.grid && this.$refs.grid.getTableData() ? this.$refs.grid.getTableData().tableData : [] } }, data() { return { Sortable, isShowBaseLoggerInfo: false, getLoggerInfoUrl: 'services/supplyRequireItemHeadService/getSupplyRequireLogList/page/{{pageSize}}/{{curPage}}', formId: 'scheduleSupplyDemandId', toolBoxShow: false, isShowMore: true, isTriangleIconShow: true, searchForm: { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 }, // 版本号 planIdOp: { multi: false, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, id: 'planId', validation: { required: true }, textField: 'planId', valueField: 'planId', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllPlanIdList' } } }, // 厂区 siteCodeOp: { multi: true, id: 'locationCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'locationName', valueField: 'locationCode', placeHolder: '-----请选择-----', emptyDataMsg: '-----没有数据-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllLocationInfo' } } }, // 部门 deptOp: { multi: true, // 是否多选 id: 'deptCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'deptName', valueField: 'deptName', placeHolder: '-----请选择-----', emptyDataMsg: '-----请选择厂区-----', dataset: { source: { type: 'POST', url: 'services/apsSupplyRequireService/getDeptInfo' } }, cascade: [ { trigger: '#locationCodeId', allowEmpty: false, // 是否允许空值参加级联 name: 'locationCodeStr' } ] }, // 工序 workSerctionOp: { id: 'workSerctionId', multi: true, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, placeHolder: '-----请选择-----', textField: 'valueInfo', valueField: 'valueInfo', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllWorkSerction' } } }, // 产品线 prodLineOp: { multi: true, id: 'prodLineId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodLineCnName', valueField: 'prodLineCnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdLineList' } } }, // 产品族(系列) prodFamilyOp: { multi: true, id: 'prodFamilyId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodSeriesEnName', valueField: 'prodSeriesEnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdSeriesList' } }, cascade: [ { trigger: '#prodLineId', allowEmpty: true, // 是否允许空值参加级联 name: 'prodLineCnNameStr' } ], emptyDataMsg: '-----请选择产品线-----' }, // 产品型号 prodModelCodeOp: { multi: true, id: 'prodModelId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodModelCode', valueField: 'prodModelCode', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllProdModelList' } }, cascade: [ { trigger: '#prodFamilyId', allowEmpty: false, name: 'prodSeriesEnNameStr' } ], emptyDataMsg: '-----请选择产品族-----' }, // 类型 dataTypeOp: { multi: true, id: 'dataTypeId', showClearBtn: true, autoSelect: false, editable: true, textField: 'label', valueField: 'value', placeHolder: '-----请选择-----', dataset: { value: [ { value: '排产', label: '排产' }, { value: '预计供应', label: '预计供应' }, { value: '过站供应', label: '过站供应' }, { value: '排产需求', label: '排产需求' }, { value: '供需匹配', label: '供需匹配' } ] } }, pageFlag: false, pagerConfig: { component: Pager, attrs: { currentPage: 1, pageSize: 15, pageSizes: [15, 30, 50, 100], total: 0, layout: 'total, sizes, prev, pager, next, jumper' } }, dateItem: [], fetchData: { api: this.getData }, clickSearchForm: {}, rowData: {}, showStock: false, showInProcess: false, showHistory: false, settingType: 'scheduleSupplyDemand', setTableColumn: [] } }, methods: { showBaseLoggerInfo() { this.isShowBaseLoggerInfo = true }, // 导出 exportData() { let formData = this.searchForm Hae.ajax({ url: 'services/exportFileUtilService/exportApsSupplyRequire', data: formData, type: 'post', success: () => { Hae.confirm('导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', (bool) => { if (bool) { window.open('#/ListExport') } }) } }) }, // 行合并 colspanMethod({ row, column, rowIndex, columnIndex }) { let fields = ['mergerKey', 'invQty'] // 获取当前行的 mergerKey const currentGroupKey = row.mergerKey // 获取当前列的 prop const columnProp = column.property // 计算相同 mergerKey 的行范围 const groupRows = this.tableData.filter((item) => item.mergerKey === currentGroupKey && currentGroupKey) const firstGroupRowIndex = this.tableData.findIndex( (item) => item.mergerKey === currentGroupKey && currentGroupKey ) const lastGroupRowIndex = firstGroupRowIndex + groupRows.length - 1 // 对于 fields 列,合并相同 mergerKey 的所有行 if (fields.includes(columnProp)) { if (rowIndex === firstGroupRowIndex) { return { rowspan: groupRows.length, colspan: 1 } } else { return { rowspan: 0, colspan: 0 } } } }, // 行渲染 renderFunction(h, { row, column }) { if (String(row[column.property]) && Number(row[column.property]) < 0) { return {row[column.property]} } else { return {row[column.property]} } }, rowClassName({ seq, row, rowIndex, $rowIndex }) { if (row.dataType === '排产') { return 'row__word--remarked' } else { return '' } }, setFormData(data) { let tempArr = Object.keys(data) this.resData = data if (tempArr.length === 0) { return } this.searchForm.planId = data.planId // 版本号 this.searchForm.locationCodeStr = data.locationCodeStr // 厂区 this.searchForm.prodLineCnNameStr = data.prodLineCnNameStr // 产品线 this.searchForm.workSerctionStr = data.workSerctionStr // 工序 this.searchForm.dataTypeStr = data.dataTypeStr // 类型 // 级联关系接口先后执行 setTimeout(() => { this.$refs.deptCodeRef.widget.setValueByField(data.deptNameStr, 'deptName') // 注意: 第二个参数是下拉的value值,不是v-model的值 }, 500) setTimeout(() => { this.$refs.prodFamilyEnNameRef.widget.setValueByField(data.prodFamilyEnNameStr, 'prodSeriesEnName') }, 800) setTimeout(() => { this.$refs.prodModelCodeRef.widget.setValueByField(data.prodModelCodeStr, 'prodModelCode') }, 1500) setTimeout(() => { this.$refs.itemCodeRef.widget.setValueByField(data.itemCodeStr, 'prodItemCode') }, 2000) }, operateRow(row, flag) { this.rowData = row this.rowData.dialogFlag = flag if (flag === 'invQty') { this.showStock = true } else { if (['排产需求'].includes(row.dataType)) { this.showHistory = true } if (['预计供应', '过站供应'].includes(row.dataType)) { this.showInProcess = true } } }, changeDialog() { this.rowData = {} this.showStock = false this.showHistory = false this.showInProcess = false }, reset() { // 清空选择 this.searchForm = { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 } this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) }, // 动态日期列 columnDate() { this.dateItem = [] let params = { ...this.searchForm } this.$service.network.post('services/apsSupplyRequireService/getHeadBucketList', params).then(({ data }) => { this.pageFlag = false if (data && data.length) { data.forEach((element) => { this.dateItem.push({ title: element, field: element }) }) } }) }, findClick() { Hae.validForm($('#editForm'), (valid) => { if (valid) { this.pageFlag = true this.getCustomConfigs() this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) setTimeout(() => { this.$refs.grid.handleFetch() }, 500) } }) }, // 查询 getData({ page }) { let { pageSize } = page if (this.pageFlag) { page.currentPage = 1 } let curPage = page.currentPage return new Promise((resolve, reject) => { let params = { ...this.clickSearchForm } this.$service.network .post(services/apsSupplyRequireService/getApsSupplyRequireList/page/${pageSize}/${curPage}, params) .then(({ data }) => { this.pageFlag = false this.isShowMore = false this.columnDate() let totalRows = data.pageVO && data.pageVO.totalRows ? data.pageVO.totalRows : 0 let result = data.result && data.result.length ? data.result : [] resolve({ result, page: { total: totalRows } }) }) }) }, getCustomConfigs() { let config = { settingType: this.settingType, grid: 'grid', auiToolbar: 'auiToolbar', setTableColumn: 'setTableColumn', dragSort: true } getCustomConfigsFn.call(this, config) }, remoteSetting(settings) { remoteSettingFn.call(this, settings, 'grid') }, saveSetting() { let customConfigs = arguments[0].columns let config = { settingType: this.settingType, customConfigs } saveSettingFn.call(this, config) } }, mounted() { let that = this // 判断是否有更多条件显示隐藏小三角 let editFormHeight = $('.first-field').outerHeight() that.isTriangleIconShow = !(editFormHeight < 38) that.isShowMore = false this.getCustomConfigs() } } </script> <style scoped src="./../unit/css/newModelPublic.css"></style> <style scoped> .first-field { padding-right: 300px !important; } :deep(.table-auto .aui-grid .aui-grid-cell) { width: 100% !important; font-size: 12px; } .table-auto { height: calc(100vh - 140px) !important; } :deep(.table-auto .aui-grid__body-wrapper) { height: calc(100vh - 280px) !important; } :deep(.aui-grid__body-wrapper::-webkit-scrollbar) { height: 12px !important; width: 12px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid-toolbar) { padding: 5px 0; } :deep(.aui-grid-toolbar .aui-grid-custom__wrapper) { height: 24px !important; width: 24px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link_click) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link-red) { color: #fe281f !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link-black) { color:rgb(17, 17, 17) !important; } :deep(.aui-grid.fixed__sticky .row__word--remarked) { --body-background-color: #ebf1de !important; } :deep(.row__word--remarked) { background-color: #ebf1de !important; } :deep(.aui-grid .aui-pager) { padding-top: 6px !important; } </style> <style> /* 隐藏aui3个性化重置按钮 */ .aui-grid-modal__box .aui-grid-custom .aui-grid-custom__footer .aui-button:nth-child(2) { display: none !important; } </style> 总结一下

<template> <title>{{$route.name}}</title> {{$route.name}} <aui-form id="editForm"> <aui-form-item label="版本号" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.planId" :op="planIdOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="厂区" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.locationCodeStr" :op="siteCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="部门" label-width="110px"> <aui-dropdown size="small" ref="deptCodeRef" v-model="searchForm.deptNameStr" :op="deptOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="工序" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.workSerctionStr" :op="workSerctionOp"></aui-dropdown> </aui-form-item> <aui-form-item label="产品线" label-width="110px"> <aui-dropdown size="small" ref="prodLineCnNameRef" v-model="searchForm.prodLineCnNameStr" :op="prodLineOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品族" label-width="110px"> <aui-dropdown size="small" ref="prodFamilyEnNameRef" v-model="searchForm.prodFamilyEnNameStr" :op="prodFamilyOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品型号" label-width="110px"> <aui-dropdown size="small" ref="prodModelCodeRef" v-model="searchForm.prodModelCodeStr" :op="prodModelCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="物料编码" label-width="110px"> <aui-input size="small" ref="itemCodeRef" v-model="searchForm.itemCodeStr" placeholder="连续首字母或者字符可模糊匹配"></aui-input> </aui-form-item> <aui-form-item label="类型" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.dataTypeStr" :op="dataTypeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item class="first-field-btn" label-width="0px" style="width: 265px"> <aui-button type="primary" size="mini" round @click="findClick">查询</aui-button> <aui-button type="primary" size="mini" round @click="reset" style="margin-right: 8px">重置</aui-button> <FormTempBtn style="width:100px;" :form-code="formId" :formData="searchForm" @templateChanged="setFormData"></FormTempBtn> </aui-form-item> </aui-form> <aui-grid height="100%" auto-resize ref="grid" :auto-load="false" resizable :row-class-name="rowClassName" :pager="pagerConfig" border :span-method="colspanMethod" :fetch-data="fetchData"> <template #toolbar> <aui-grid-toolbar id="scheduleSupplyDemandGridId" :setting="{ showIndex: true, sortable: Sortable, }" ref="auiToolbar" @remote-setting="remoteSetting" @save-setting="saveSetting"> <template #buttons> <aui-button size="mini" @click="exportData">导出</aui-button> <aui-button size="mini" @click="showBaseLoggerInfo">版本日志</aui-button> </template> </aui-grid-toolbar> </template> <aui-grid-column fixed="left" title="版本" field="planId" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="厂区" field="locationName" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="部门" field="deptName" min-width="120" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品线" field="prodLineCnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品族" field="prodFamilyEnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品型号" field="prodModelCode" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="工序" field="workSerction" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="物料编码" field="itemCode" min-width="90" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="类型" field="dataType" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="库存" field="invQty" min-width="80" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.invQty }} </template> </aui-grid-column> <aui-grid-column fixed="left" title="历史在制/排产" field="hisQty" min-width="100" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.hisQty }} </template> </aui-grid-column> <aui-grid-column v-for="(item, i) in dateItem" :key="i" :field="item.field" :title="item.title" :renderer="renderFunction" min-width="90" align="center"> </aui-grid-column> </aui-grid> <StockDialog v-if="showStock" :rowData="rowData" @changeDialog="changeDialog"></StockDialog> <InProcessWorkOrderSchedule v-if="showInProcess" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></InProcessWorkOrderSchedule> <WorkOrderScheduleHistory v-if="showHistory" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></WorkOrderScheduleHistory> <aui-dialog-box title="版本日志" class="history-Info" v-model="isShowBaseLoggerInfo" width="90%" top="8%" :dragable="true" :modal-closable="false"> <base-logger-info v-bind:apiUrl="getLoggerInfoUrl" v-if="isShowBaseLoggerInfo"></base-logger-info> </aui-dialog-box> </template> <script> import { Form, FormItem, Dropdown, Hae, $, DialogBox } from '@aurora/ui3' import { Grid, GridColumn, Modal, Pager, Button, GridToolbar } from '@aurora/vue3' import { FormTempBtn } from '@mxdesign/ui' import Sortable from 'sortablejs' import { remoteSettingFn, saveSettingFn, getCustomConfigsFn } from '@/utils/personSettings' import StockDialog from '@/components/supplydemandmgt/StockDialog' import InProcessWorkOrderSchedule from '@/components/supplydemandmgt/InProcessWorkOrderSchedule' import WorkOrderScheduleHistory from '@/components/supplydemandmgt/WorkOrderScheduleHistory' import BaseLoggerInfo from '../basedata/BaseLoggerInfo.vue' import { includes } from 'core-js/core/array' export default { components: { AuiDialogBox: DialogBox, AuiButton: Button, AuiForm: Form, AuiFormItem: FormItem, AuiDropdown: Dropdown, AuiGrid: Grid, AuiGridColumn: GridColumn, AuiGridToolbar: GridToolbar, FormTempBtn, StockDialog, InProcessWorkOrderSchedule, WorkOrderScheduleHistory, BaseLoggerInfo }, computed: { tableData() { return this.$refs.grid && this.$refs.grid.getTableData() ? this.$refs.grid.getTableData().tableData : [] } }, data() { return { Sortable, isShowBaseLoggerInfo: false, getLoggerInfoUrl: 'services/supplyRequireItemHeadService/getSupplyRequireLogList/page/{{pageSize}}/{{curPage}}', formId: 'scheduleSupplyDemandId', toolBoxShow: false, isShowMore: true, isTriangleIconShow: true, searchForm: { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 }, // 版本号 planIdOp: { multi: false, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, id: 'planId', validation: { required: true }, textField: 'planId', valueField: 'planId', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllPlanIdList' } } }, // 厂区 siteCodeOp: { multi: true, id: 'locationCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'locationName', valueField: 'locationCode', placeHolder: '-----请选择-----', emptyDataMsg: '-----没有数据-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllLocationInfo' } } }, // 部门 deptOp: { multi: true, // 是否多选 id: 'deptCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'deptName', valueField: 'deptName', placeHolder: '-----请选择-----', emptyDataMsg: '-----请选择厂区-----', dataset: { source: { type: 'POST', url: 'services/apsSupplyRequireService/getDeptInfo' } }, cascade: [ { trigger: '#locationCodeId', allowEmpty: false, // 是否允许空值参加级联 name: 'locationCodeStr' } ] }, // 工序 workSerctionOp: { id: 'workSerctionId', multi: true, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, placeHolder: '-----请选择-----', textField: 'valueInfo', valueField: 'valueInfo', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllWorkSerction' } } }, // 产品线 prodLineOp: { multi: true, id: 'prodLineId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodLineCnName', valueField: 'prodLineCnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdLineList' } } }, // 产品族(系列) prodFamilyOp: { multi: true, id: 'prodFamilyId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodSeriesEnName', valueField: 'prodSeriesEnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdSeriesList' } }, cascade: [ { trigger: '#prodLineId', allowEmpty: true, // 是否允许空值参加级联 name: 'prodLineCnNameStr' } ], emptyDataMsg: '-----请选择产品线-----' }, // 产品型号 prodModelCodeOp: { multi: true, id: 'prodModelId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodModelCode', valueField: 'prodModelCode', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllProdModelList' } }, cascade: [ { trigger: '#prodFamilyId', allowEmpty: false, name: 'prodSeriesEnNameStr' } ], emptyDataMsg: '-----请选择产品族-----' }, // 类型 dataTypeOp: { multi: true, id: 'dataTypeId', showClearBtn: true, autoSelect: false, editable: true, textField: 'label', valueField: 'value', placeHolder: '-----请选择-----', dataset: { value: [ { value: '排产', label: '排产' }, { value: '预计供应', label: '预计供应' }, { value: '过站供应', label: '过站供应' }, { value: '排产需求', label: '排产需求' }, { value: '供需匹配', label: '供需匹配' } ] } }, pageFlag: false, pagerConfig: { component: Pager, attrs: { currentPage: 1, pageSize: 10, pageSizes: [10, 15, 20], total: 0, layout: 'total, sizes, prev, pager, next, jumper' } }, dateItem: [], fetchData: { api: this.getData }, clickSearchForm: {}, rowData: {}, showStock: false, showInProcess: false, showHistory: false, settingType: 'scheduleSupplyDemand', setTableColumn: [] } }, methods: { showBaseLoggerInfo() { this.isShowBaseLoggerInfo = true }, // 导出 exportData() { let formData = this.searchForm Hae.ajax({ url: 'services/exportFileUtilService/exportApsSupplyRequire', data: formData, type: 'post', success: () => { Hae.confirm('导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', (bool) => { if (bool) { window.open('#/ListExport') } }) } }) }, // 行合并 colspanMethod({ row, column, rowIndex, columnIndex }) { let fields = ['mergerKey', 'invQty'] // 获取当前行的 mergerKey const currentGroupKey = row.mergerKey // 获取当前列的 prop const columnProp = column.property // 计算相同 mergerKey 的行范围 const groupRows = this.tableData.filter((item) => item.mergerKey === currentGroupKey && currentGroupKey) const firstGroupRowIndex = this.tableData.findIndex( (item) => item.mergerKey === currentGroupKey && currentGroupKey ) const lastGroupRowIndex = firstGroupRowIndex + groupRows.length - 1 // 对于 fields 列,合并相同 mergerKey 的所有行 if (fields.includes(columnProp)) { if (rowIndex === firstGroupRowIndex) { return { rowspan: groupRows.length, colspan: 1 } } else { return { rowspan: 0, colspan: 0 } } } }, // 行渲染 renderFunction(h, { row, column }) { if (row.dataType === '排产') { return {row[column.property]} } if (String(row[column.property]) && Number(row[column.property]) < 0) { return {row[column.property]} } else { return {row[column.property]} } }, rowClassName({ seq, row, rowIndex, $rowIndex }) { if (row.dataType === '排产') { return 'row__word--remarked' } else { return '' } }, setFormData(data) { let tempArr = Object.keys(data) this.resData = data if (tempArr.length === 0) { return } this.searchForm.planId = data.planId // 版本号 this.searchForm.locationCodeStr = data.locationCodeStr // 厂区 this.searchForm.prodLineCnNameStr = data.prodLineCnNameStr // 产品线 this.searchForm.workSerctionStr = data.workSerctionStr // 工序 this.searchForm.dataTypeStr = data.dataTypeStr // 类型 // 级联关系接口先后执行 setTimeout(() => { this.$refs.deptCodeRef.widget.setValueByField(data.deptNameStr, 'deptName') // 注意: 第二个参数是下拉的value值,不是v-model的值 }, 500) setTimeout(() => { this.$refs.prodFamilyEnNameRef.widget.setValueByField(data.prodFamilyEnNameStr, 'prodSeriesEnName') }, 800) setTimeout(() => { this.$refs.prodModelCodeRef.widget.setValueByField(data.prodModelCodeStr, 'prodModelCode') }, 1500) setTimeout(() => { this.$refs.itemCodeRef.widget.setValueByField(data.itemCodeStr, 'prodItemCode') }, 2000) }, operateRow(row, flag) { this.rowData = row this.rowData.dialogFlag = flag if (flag === 'invQty') { this.showStock = true } else { if (['排产需求'].includes(row.dataType)) { this.showHistory = true } if (['预计供应', '过站供应'].includes(row.dataType)) { this.showInProcess = true } } }, handleProductionClick(row,flag){ this.rowData = row this.rowData.dialogFlag = flag if(['排产需求'].includes(row.dataType)){ this.showHistory=true } }, changeDialog() { this.rowData = {} this.showStock = false this.showHistory = false this.showInProcess = false }, reset() { // 清空选择 this.searchForm = { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 } this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) }, // 动态日期列 columnDate() { this.dateItem = [] let params = { ...this.searchForm } this.$service.network.post('services/apsSupplyRequireService/getHeadBucketList', params).then(({ data }) => { this.pageFlag = false if (data && data.length) { data.forEach((element) => { this.dateItem.push({ title: element, field: element }) }) } }) }, findClick() { Hae.validForm($('#editForm'), (valid) => { if (valid) { this.pageFlag = true this.getCustomConfigs() this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) setTimeout(() => { this.$refs.grid.handleFetch() }, 500) } }) }, // 查询 getData({ page }) { let { pageSize } = page if (this.pageFlag) { page.currentPage = 1 } let curPage = page.currentPage return new Promise((resolve, reject) => { let params = { ...this.clickSearchForm } this.$service.network .post(services/apsSupplyRequireService/getApsSupplyRequireList/page/${pageSize}/${curPage}, params) .then(({ data }) => { this.pageFlag = false this.isShowMore = false this.columnDate() let totalRows = data.pageVO && data.pageVO.totalRows ? data.pageVO.totalRows : 0 let result = data.result && data.result.length ? data.result : [] resolve({ result, page: { total: totalRows } }) }) }) }, getCustomConfigs() { let config = { settingType: this.settingType, grid: 'grid', auiToolbar: 'auiToolbar', setTableColumn: 'setTableColumn', dragSort: true } getCustomConfigsFn.call(this, config) }, remoteSetting(settings) { remoteSettingFn.call(this, settings, 'grid') }, saveSetting() { let customConfigs = arguments[0].columns let config = { settingType: this.settingType, customConfigs } saveSettingFn.call(this, config) } }, mounted() { let that = this // 判断是否有更多条件显示隐藏小三角 let editFormHeight = $('.first-field').outerHeight() that.isTriangleIconShow = !(editFormHeight < 38) that.isShowMore = false this.getCustomConfigs() } } </script> <style scoped src="./../unit/css/newModelPublic.css"></style> <style scoped> .first-field { padding-right: 300px !important; } :deep(.table-auto .aui-grid .aui-grid-cell) { width: 100% !important; font-size: 12px; } .table-auto { height: calc(100vh - 140px) !important; } :deep(.table-auto .aui-grid__body-wrapper) { height: calc(100vh - 280px) !important; } :deep(.aui-grid__body-wrapper::-webkit-scrollbar) { height: 12px !important; width: 12px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid-toolbar) { padding: 5px 0; } :deep(.aui-grid-toolbar .aui-grid-custom__wrapper) { height: 24px !important; width: 24px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link_click) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link-red) { color: #fe281f !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link-black) { color:rgb(17, 17, 17) !important; } :deep(.aui-grid.fixed__sticky .row__word--remarked) { --body-background-color: #ebf1de !important; } :deep(.row__word--remarked) { background-color: #ebf1de !important; } :deep(.aui-grid .aui-pager) { padding-top: 6px !important; } </style> <style> /* 隐藏aui3个性化重置按钮 */ .aui-grid-modal__box .aui-grid-custom .aui-grid-custom__footer .aui-button:nth-child(2) { display: none !important; } </style> 中的日期行的数据中的排产需求,负数修改为显示黑色。

<template> <title>{{$route.name}}</title> {{$route.name}} <aui-form id="editForm"> <aui-form-item label="版本号" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.planId" :op="planIdOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="厂区" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.locationCodeStr" :op="siteCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="部门" label-width="110px"> <aui-dropdown size="small" ref="deptCodeRef" v-model="searchForm.deptNameStr" :op="deptOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="工序" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.workSerctionStr" :op="workSerctionOp"></aui-dropdown> </aui-form-item> <aui-form-item label="产品线" label-width="110px"> <aui-dropdown size="small" ref="prodLineCnNameRef" v-model="searchForm.prodLineCnNameStr" :op="prodLineOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品族" label-width="110px"> <aui-dropdown size="small" ref="prodFamilyEnNameRef" v-model="searchForm.prodFamilyEnNameStr" :op="prodFamilyOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="产品型号" label-width="110px"> <aui-dropdown size="small" ref="prodModelCodeRef" v-model="searchForm.prodModelCodeStr" :op="prodModelCodeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item label="物料编码" label-width="110px"> <aui-input size="small" ref="itemCodeRef" v-model="searchForm.itemCodeStr" placeholder="连续首字母或者字符可模糊匹配"></aui-input> </aui-form-item> <aui-form-item label="类型" label-width="110px"> <aui-dropdown size="small" v-model="searchForm.dataTypeStr" :op="dataTypeOp" place-holder="请选择"></aui-dropdown> </aui-form-item> <aui-form-item class="first-field-btn" label-width="0px" style="width: 265px"> <aui-button type="primary" size="mini" round @click="findClick">查询</aui-button> <aui-button type="primary" size="mini" round @click="reset" style="margin-right: 8px">重置</aui-button> <FormTempBtn style="width:100px;" :form-code="formId" :formData="searchForm" @templateChanged="setFormData"></FormTempBtn> </aui-form-item> </aui-form> <aui-grid height="100%" auto-resize ref="grid" :auto-load="false" resizable :row-class-name="rowClassName" :pager="pagerConfig" border :span-method="colspanMethod" :fetch-data="fetchData"> <template #toolbar> <aui-grid-toolbar id="scheduleSupplyDemandGridId" :setting="{ showIndex: true, sortable: Sortable, }" ref="auiToolbar" @remote-setting="remoteSetting" @save-setting="saveSetting"> <template #buttons> <aui-button size="mini" @click="exportData">导出</aui-button> <aui-button size="mini" @click="showBaseLoggerInfo">版本日志</aui-button> </template> </aui-grid-toolbar> </template> <aui-grid-column fixed="left" title="版本" field="planId" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="厂区" field="locationName" min-width="100" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="部门" field="deptName" min-width="120" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品线" field="prodLineCnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品族" field="prodFamilyEnName" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="产品型号" field="prodModelCode" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="工序" field="workSerction" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="物料编码" field="itemCode" min-width="90" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="类型" field="dataType" min-width="80" show-overflow header-align="center" align="center"></aui-grid-column> <aui-grid-column fixed="left" title="库存" field="invQty" min-width="80" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.invQty }} </template> </aui-grid-column> <aui-grid-column fixed="left" title="历史" field="hisQty" min-width="100" show-overflow header-align="center" align="center"> <template #default="{ row }"> {{ row.hisQty }} </template> </aui-grid-column> <aui-grid-column v-for="(item, i) in dateItem" :key="i" :field="item.field" :title="item.title" :renderer="renderFunction" min-width="50" align="center"> </aui-grid-column> </aui-grid> <StockDialog v-if="showStock" :rowData="rowData" @changeDialog="changeDialog"></StockDialog> <InProcessWorkOrderSchedule v-if="showInProcess" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></InProcessWorkOrderSchedule> <WorkOrderScheduleHistory v-if="showHistory" :rowData="rowData" @changeDialog="changeDialog" :dateItem="dateItem"></WorkOrderScheduleHistory> <aui-dialog-box title="版本日志" class="history-Info" v-model="isShowBaseLoggerInfo" width="90%" top="8%" :dragable="true" :modal-closable="false"> <base-logger-info v-bind:apiUrl="getLoggerInfoUrl" v-if="isShowBaseLoggerInfo"></base-logger-info> </aui-dialog-box> </template> <script> import { Form, FormItem, Dropdown, Hae, $, DialogBox } from '@aurora/ui3' import { Grid, GridColumn, Modal, Pager, Button, GridToolbar } from '@aurora/vue3' import { FormTempBtn } from '@mxdesign/ui' import Sortable from 'sortablejs' import { remoteSettingFn, saveSettingFn, getCustomConfigsFn } from '@/utils/personSettings' import StockDialog from '@/components/supplydemandmgt/StockDialog' import InProcessWorkOrderSchedule from '@/components/supplydemandmgt/InProcessWorkOrderSchedule' import WorkOrderScheduleHistory from '@/components/supplydemandmgt/WorkOrderScheduleHistory' import BaseLoggerInfo from '../basedata/BaseLoggerInfo.vue' export default { components: { AuiDialogBox: DialogBox, AuiButton: Button, AuiForm: Form, AuiFormItem: FormItem, AuiDropdown: Dropdown, AuiGrid: Grid, AuiGridColumn: GridColumn, AuiGridToolbar: GridToolbar, FormTempBtn, StockDialog, InProcessWorkOrderSchedule, WorkOrderScheduleHistory, BaseLoggerInfo }, computed: { tableData() { return this.$refs.grid && this.$refs.grid.getTableData() ? this.$refs.grid.getTableData().tableData : [] } }, data() { return { Sortable, isShowBaseLoggerInfo: false, getLoggerInfoUrl: 'services/supplyRequireItemHeadService/getSupplyRequireLogList/page/{{pageSize}}/{{curPage}}', formId: 'scheduleSupplyDemandId', toolBoxShow: false, isShowMore: true, isTriangleIconShow: true, searchForm: { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 }, // 版本号 planIdOp: { multi: false, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, id: 'planId', validation: { required: true }, textField: 'planId', valueField: 'planId', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllPlanIdList' } } }, // 厂区 siteCodeOp: { multi: true, id: 'locationCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'locationName', valueField: 'locationCode', placeHolder: '-----请选择-----', emptyDataMsg: '-----没有数据-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllLocationInfo' } } }, // 部门 deptOp: { multi: true, // 是否多选 id: 'deptCodeId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'deptName', valueField: 'deptName', placeHolder: '-----请选择-----', emptyDataMsg: '-----请选择厂区-----', dataset: { source: { type: 'POST', url: 'services/apsSupplyRequireService/getDeptInfo' } }, cascade: [ { trigger: '#locationCodeId', allowEmpty: false, // 是否允许空值参加级联 name: 'locationCodeStr' } ] }, // 工序 workSerctionOp: { id: 'workSerctionId', multi: true, showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, placeHolder: '-----请选择-----', textField: 'valueInfo', valueField: 'valueInfo', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllWorkSerction' } } }, // 产品线 prodLineOp: { multi: true, id: 'prodLineId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodLineCnName', valueField: 'prodLineCnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdLineList' } } }, // 产品族(系列) prodFamilyOp: { multi: true, id: 'prodFamilyId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodSeriesEnName', valueField: 'prodSeriesEnName', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getProdSeriesList' } }, cascade: [ { trigger: '#prodLineId', allowEmpty: true, // 是否允许空值参加级联 name: 'prodLineCnNameStr' } ], emptyDataMsg: '-----请选择产品线-----' }, // 产品型号 prodModelCodeOp: { multi: true, id: 'prodModelId', showClearBtn: true, autoSelect: false, alwaysLoad: true, editable: true, textField: 'prodModelCode', valueField: 'prodModelCode', placeHolder: '-----请选择-----', dataset: { source: { type: 'post', url: 'services/apsSupplyRequireService/getAllProdModelList' } }, cascade: [ { trigger: '#prodFamilyId', allowEmpty: false, name: 'prodSeriesEnNameStr' } ], emptyDataMsg: '-----请选择产品族-----' }, // 类型 dataTypeOp: { multi: true, id: 'dataTypeId', showClearBtn: true, autoSelect: false, editable: true, textField: 'label', valueField: 'value', placeHolder: '-----请选择-----', dataset: { value: [ { value: '排产', label: '排产' }, { value: '预计供应', label: '预计供应' }, { value: '过站供应', label: '过站供应' }, { value: '排产需求', label: '排产需求' }, { value: '供需匹配', label: '供需匹配' } ] } }, pageFlag: false, pagerConfig: { component: Pager, attrs: { currentPage: 1, pageSize: 15, pageSizes: [15, 30, 50, 100], total: 0, layout: 'total, sizes, prev, pager, next, jumper' } }, dateItem: [], fetchData: { api: this.getData }, clickSearchForm: {}, rowData: {}, showStock: false, showInProcess: false, showHistory: false, settingType: 'scheduleSupplyDemand', setTableColumn: [] } }, methods: { showBaseLoggerInfo() { this.isShowBaseLoggerInfo = true }, // 导出 exportData() { let formData = this.searchForm Hae.ajax({ url: 'services/exportFileUtilService/exportApsSupplyRequire', data: formData, type: 'post', success: () => { Hae.confirm('导出任务已开始,你可以进入[我的导入导出>导出查询]中查看任务状态并下载导出文件!', (bool) => { if (bool) { window.open('#/ListExport') } }) } }) }, // 行合并 colspanMethod({ row, column, rowIndex, columnIndex }) { let fields = ['mergerKey', 'invQty'] // 获取当前行的 mergerKey const currentGroupKey = row.mergerKey // 获取当前列的 prop const columnProp = column.property // 计算相同 mergerKey 的行范围 const groupRows = this.tableData.filter((item) => item.mergerKey === currentGroupKey && currentGroupKey) const firstGroupRowIndex = this.tableData.findIndex( (item) => item.mergerKey === currentGroupKey && currentGroupKey ) const lastGroupRowIndex = firstGroupRowIndex + groupRows.length - 1 // 对于 fields 列,合并相同 mergerKey 的所有行 if (fields.includes(columnProp)) { if (rowIndex === firstGroupRowIndex) { return { rowspan: groupRows.length, colspan: 1 } } else { return { rowspan: 0, colspan: 0 } } } }, // 行渲染 renderFunction(h, { row, column }) { if (row.dataType === '排产需求'&& Number(row[column.property]) < 0) { return {row[column.property]} } if (String(row[column.property]) && Number(row[column.property]) < 0) { return {row[column.property]} } else { return {row[column.property]} } }, rowClassName({ seq, row, rowIndex, $rowIndex }) { if (row.dataType === '排产') { return 'row__word--remarked' } else { return '' } }, setFormData(data) { let tempArr = Object.keys(data) this.resData = data if (tempArr.length === 0) { return } this.searchForm.planId = data.planId // 版本号 this.searchForm.locationCodeStr = data.locationCodeStr // 厂区 this.searchForm.prodLineCnNameStr = data.prodLineCnNameStr // 产品线 this.searchForm.workSerctionStr = data.workSerctionStr // 工序 this.searchForm.dataTypeStr = data.dataTypeStr // 类型 // 级联关系接口先后执行 setTimeout(() => { this.$refs.deptCodeRef.widget.setValueByField(data.deptNameStr, 'deptName') // 注意: 第二个参数是下拉的value值,不是v-model的值 }, 500) setTimeout(() => { this.$refs.prodFamilyEnNameRef.widget.setValueByField(data.prodFamilyEnNameStr, 'prodSeriesEnName') }, 800) setTimeout(() => { this.$refs.prodModelCodeRef.widget.setValueByField(data.prodModelCodeStr, 'prodModelCode') }, 1500) setTimeout(() => { this.$refs.itemCodeRef.widget.setValueByField(data.itemCodeStr, 'prodItemCode') }, 2000) }, operateRow(row, flag) { this.rowData = row this.rowData.dialogFlag = flag if (flag === 'invQty') { this.showStock = true } else { if (['排产需求'].includes(row.dataType)) { this.showHistory = true } if (['预计供应', '过站供应'].includes(row.dataType)) { this.showInProcess = true } } }, handleProductionClick(row,flag){ this.rowData = row this.rowData.dialogFlag = flag if(['排产需求'].includes(row.dataType)){ this.showHistory=true } }, changeDialog() { this.rowData = {} this.showStock = false this.showHistory = false this.showInProcess = false }, reset() { // 清空选择 this.searchForm = { planId: '', // 版本号 locationCodeStr: '', // 厂区 deptNameStr: '', // 部门 prodLineCnNameStr: '', // 产品线 prodFamilyEnNameStr: '', // 产品族 prodModelCodeStr: '', // 产品型号 workSerctionStr: '', // 工序 itemCodeStr: '', // 编码 dataTypeStr: '' // 类型 } this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) }, // 动态日期列 columnDate() { this.dateItem = [] let params = { ...this.searchForm } this.$service.network.post('services/apsSupplyRequireService/getHeadBucketList', params).then(({ data }) => { this.pageFlag = false if (data && data.length) { data.forEach((element) => { this.dateItem.push({ title: element, field: element }) }) } }) }, findClick() { Hae.validForm($('#editForm'), (valid) => { if (valid) { this.pageFlag = true this.getCustomConfigs() this.clickSearchForm = JSON.parse(JSON.stringify(this.searchForm)) setTimeout(() => { this.$refs.grid.handleFetch() }, 500) } }) }, // 查询 getData({ page }) { let { pageSize } = page if (this.pageFlag) { page.currentPage = 1 } let curPage = page.currentPage return new Promise((resolve, reject) => { let params = { ...this.clickSearchForm } this.$service.network .post(services/apsSupplyRequireService/getApsSupplyRequireList/page/${pageSize}/${curPage}, params) .then(({ data }) => { this.pageFlag = false this.isShowMore = false this.columnDate() let totalRows = data.pageVO && data.pageVO.totalRows ? data.pageVO.totalRows : 0 let result = data.result && data.result.length ? data.result : [] resolve({ result, page: { total: totalRows } }) }) }) }, getCustomConfigs() { let config = { settingType: this.settingType, grid: 'grid', auiToolbar: 'auiToolbar', setTableColumn: 'setTableColumn', dragSort: true } getCustomConfigsFn.call(this, config) }, remoteSetting(settings) { remoteSettingFn.call(this, settings, 'grid') }, saveSetting() { let customConfigs = arguments[0].columns let config = { settingType: this.settingType, customConfigs } saveSettingFn.call(this, config) } }, mounted() { let that = this // 判断是否有更多条件显示隐藏小三角 let editFormHeight = $('.first-field').outerHeight() that.isTriangleIconShow = !(editFormHeight < 38) that.isShowMore = false this.getCustomConfigs() } } </script> <style scoped src="./../unit/css/newModelPublic.css"></style> <style scoped> .first-field { padding-right: 300px !important; } :deep(.table-auto .aui-grid .aui-grid-cell) { width: 100% !important; font-size: 12px; } .table-auto { height: calc(100vh - 140px) !important; } :deep(.table-auto .aui-grid__body-wrapper) { height: calc(100vh - 280px) !important; } :deep(.aui-grid__body-wrapper::-webkit-scrollbar) { height: 12px !important; width: 12px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid-toolbar) { padding: 5px 0; } :deep(.aui-grid-toolbar .aui-grid-custom__wrapper) { height: 24px !important; width: 24px !important; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link_click) { color: #189ff0 !important; cursor: pointer; text-decoration: underline; } :deep(.aui-grid__body .aui-grid-body__column .aui-grid-cell .row-link-red) { color: #fe281f !important; } :deep(.aui-grid.fixed__sticky .row__word--remarked) { --body-background-color: #ebf1de !important; } :deep(.row__word--remarked) { background-color: #ebf1de !important; } :deep(.aui-grid .aui-pager) { padding-top: 6px !important; } </style> <style> /* 隐藏aui3个性化重置按钮 */ .aui-grid-modal__box .aui-grid-custom .aui-grid-custom__footer .aui-button:nth-child(2) { display: none !important; } </style> 中的行和并和渲染是干什么的

<template> <aui-dialog-box :visible="visible" draggable @close="cancel" :close-on-click-modal="false" title="排产需求明细" width="90%"> <aui-grid height="auto" ref="grid" auto-resize :auto-load="false" resizable :pager="pagerConfig" border :fetch-data="fetchData"> <aui-grid-column title="任务令号" field="workorderName" show-overflow header-align="center" align="center" /> <aui-grid-column title="编码" field="itemCode" show-overflow header-align="center" align="center" /> <aui-grid-column title="任务令数量" field="workorderQty" show-overflow header-align="center" align="center" /> <aui-grid-column title="需求编码" field="upperItemCode" show-overflow header-align="center" align="center" /> <aui-grid-column title="需求数量" field="qty" show-overflow header-align="center" align="center" /> <aui-grid-column title="排产上线时间" field="planStartTime" align="center" format-text="date" :format-config="{ dateFormat:'yyyy-MM-dd hh:mm:ss'}" show-overflow header-align="center" /> <aui-grid-column title="排产线体" field="lineDesc" align="center" show-overflow header-align="center" /> <aui-grid-column title="部门" field="deptName" show-overflow header-align="center" align="center" /> </aui-grid> </aui-dialog-box> </template> <script> import { DialogBox, Grid, GridColumn, Pager } from '@aurora/vue3' const SUCCESS_STATUS = '200' export default { components: { AuiDialogBox: DialogBox, AuiGrid: Grid, AuiGridColumn: GridColumn }, props: { rowData: { type: Object, default: () => {} }, dateItem: { type: Array, default: () => [] } }, data() { return { visible: true, fetchData: { api: this.getData }, pagerConfig: { component: Pager, attrs: { currentPage: 1, pageSize: 10, pageSizes: [10, 20, 30], total: 0, layout: 'total, sizes, prev, pager, next, jumper' } } } }, mounted() { this.findClick() }, methods: { cancel() { this.$emit('changeDialog') }, findClick() { setTimeout(() => { this.$refs.grid.handleFetch() }, 0) }, // 查询 getData({ page }) { let { pageSize } = page let curPage = page.currentPage return new Promise((resolve, reject) => { let params = { locationCode: this.rowData.locationCode, deptCode: this.rowData.deptCode, itemCode: this.rowData.itemCode, planId: this.rowData.planId, threeDaysAgoDateStr: this.dateItem.length ? this.dateItem[0].field : '' } this.$service.network .post(services/apsSupplyRequireService/getApsRequireWorkorderList/page/${pageSize}/${curPage}, params) .then(({ data }) => { let totalRows = data.pageVO && data.pageVO.totalRows ? data.pageVO.totalRows : 0 let result = data.result && data.result.length ? data.result : [] resolve({ result, page: { total: totalRows } }) }) }) } } } </script> <style scoped> </style> 中 getData({ page }) { let { pageSize } = page let curPage = page.currentPage return new Promise((resolve, reject) => { let params = { locationCode: this.rowData.locationCode, deptCode: this.rowData.deptCode, itemCode: this.rowData.itemCode, planId: this.rowData.planId, threeDaysAgoDateStr: this.dateItem.length ? this.dateItem[0].field : ‘’ } this. s e r v i c e . n e t w o r k . p o s t ( ‘ s e r v i c e s / a p s S u p p l y R e q u i r e S e r v i c e / g e t A p s R e q u i r e W o r k o r d e r L i s t / p a g e / service.network.post(‘services/apsSupplyRequireService/getApsRequireWorkorderList/page/{pageSize}/${curPage}, params) .then(({ data }) => { let totalRows = data.pageVO && data.pageVO.totalRows ? data.pageVO.totalRows : 0 let result = data.result && data.result.length ? data.result : [] resolve({ result, page: { total: totalRows } }) }) }) }这一段什么意思

<template> <aui-grid :fetch-data="fetchData" seq-serial :pager="pagerConfig"> <aui-grid-column type="index" width="60"></aui-grid-column> <aui-grid-column field="name" title="名称"></aui-grid-column> <aui-grid-column field="area" title="所属区域"></aui-grid-column> <aui-grid-column field="address" title="地址"></aui-grid-column> <aui-grid-column field="introduction" title="公司简介" show-overflow></aui-grid-column> </aui-grid> </template> <script> import { Grid, GridColumn, Pager } from '@aurora/vue' export default { components: { AuiGrid: Grid, AuiGridColumn: GridColumn }, data() { return { pagerConfig: { component: Pager, attrs: { currentPage: 1, pageSize: 5, pageSizes: [5, 10], total: 0, layout: 'total, prev, pager, next, jumper, sizes' } }, fetchData: { api: this.getData }, tableData: [ { id: '1', name: 'GFD科技有限公司', area: '华东区', address: '福州', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '2', name: 'WWWW科技有限公司', area: '华南区', address: '深圳福田区', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '3', name: 'RFV有限责任公司', area: '华南区', address: '中山市', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '4', name: 'TGB有限公司', area: '华北区', address: '梅州', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '5', name: 'YHN科技有限公司', area: '华南区', address: '韶关', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '6', name: '康康物业有限公司', area: '华北区', address: '广州天河区', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '7', name: '深圳市福德宝网络技术有限公司', area: '华南区', address: '清远', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '8', name: '西安门福德宝网络技术有限公司', area: '华东区', address: '厦门', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '9', name: 'WWWW科技股份有限子公司', area: '华南区', address: '韶关', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' }, { id: '10', name: 'WSX科技有限公司', area: '华南区', address: '广州', introduction: '公司技术和研发实力雄厚,是国家863项目的参与者,并被政府认定为“高新技术企业”。' } ] } }, methods: { getData({ page }) { let curPage = page.currentPage let pageSize = page.pageSize let offset = (curPage - 1) * pageSize return new Promise((resolve) => { resolve({ result: this.tableData.slice(offset, offset + pageSize), page: { total: this.tableData.length } }) }) } } } </script> 转成vue3

zip
html
html,css,js,javascript,按钮 # 灵动交互之美:探索按钮点击时的渐隐视觉反馈效果 在现代网页设计中,微小的交互细节往往是提升用户体验的关键。本页面展示的按钮效果看似简单,却蕴含着精心设计的交互逻辑——当用户点击按钮的瞬间,元素会以0.1秒的速度呈现50%的透明度变化,这种即时反馈让操作行为得到明确呼应,既避免了传统按钮"按下无反应"的生硬感,又不会因过渡动画过长干扰操作节奏。 设计上采用了红色系主色调(bg-red-500),在浅灰色背景(bg-gray-100)的衬托下形成鲜明视觉对比,确保按钮在页面中具有足够辨识度。圆角设计(rounded-lg)与适中的内边距(px-6 py-3)平衡了视觉柔和度与点击热区大小,配合中等字重(font-medium)的白色文字,实现了清晰的信息层级。 技术实现上,通过Tailwind CSS构建基础样式,结合自定义CSS的transition属性实现平滑过渡效果,仅用寥寥数行代码就达成了专业级的交互体验。这种轻量级方案既保证了性能优化,又便于开发者根据需求调整参数——无论是修改过渡时长、透明度数值,还是替换颜色方案,都能快速适配不同的设计场景。 对于用户而言,这种即时反馈机制能有效减少操作不确定性,尤其在表单提交、功能触发等关键交互节点,可显著提升操作信心。对于开发者来说,该案例展示了"以小见大"的设计思路:无需复杂动画库,利用基础CSS属性即可打造出既实用又美观的交互细节,为网页增添精致感与专业度。

大家在看

recommend-type

commons-collections4-4.1-bin.zip

commonS操作源码及jar包,没有外部依赖,jar包比较全
recommend-type

松下kxp1121打印机驱动 官方最新版_支持win7

松下kxp1121是一款经典针式打印机,这里给广大网友提供这款机型的官方驱动,支持win7系统,推荐使用此款打印机的用户下载安装。松下kxp1121打印机:松下针式打印机KX-P1121拥有比较简单的操作,并且可以进行双向打印,其打印速度为240字/秒,最高分辨率为360dpi,可,欢迎下载体验
recommend-type

抓取BT-audio音乐音频总结v1.2.docx

Qcom平台抓取蓝牙audio日志;介绍: 如何使用QXDM抓取日志, 如何使用qcap解析isf文件, 解析出来的额pcm数据如何用音频工具差异, 如何判断蓝牙音频问题。
recommend-type

Nature-Scientific-Data-2021

2021年自然科学数据 我们发布了在四个心理图像任务(即手图像,脚图像,减法图像和单词生成图像)期间以1KHz采样频率记录的306通道MEG-BCI数据。 数据集包含使用典型的BCI图像范例在17天健康参与者的不同日子进行的两次MEG记录。 据我们所知,当前数据集将是唯一可公开获得的MEG影像BCI数据集。 该数据集可被科学界用于开发新型模式识别机器学习方法,以使用MEG信号检测与MI和CI任务相关的大脑活动。 我们以两种不同的文件格式提供了MEG BCI数据集: 脑成像数据结构(BIDS) 。 要阅读更多信息,在BIDS格式下以“功能图像文件格式” (.fif)文件获取原始数据。 要了解更多信息, MAT-file是MATLAB (.mat)的数据文件格式。 要了解更多信息, 在此存储库中,我们为以下任务提供了Matlab脚本: Step0_script_fif2bids.m :用
recommend-type

ADS1292rShield_Breakout-master_ADS1292_ADS1292程序_ads1292r_breako

ads1292 R驱动程序

最新推荐

recommend-type

studio_video_1756387311135.mp4

studio_video_1756387311135.mp4
recommend-type

光伏发电MPPT扰动观察法的MatlabSimulink模型实现与优化

内容概要:本文详细解析了基于Matlab/Simulink平台搭建的光伏发电最大功率点跟踪(MPPT)模型,核心采用扰动观察法(P&O)实现。通过自定义S-Function编写MPPT控制算法,结合光伏阵列建模、参数设置及系统调试,深入阐述了电压电流采样、功率计算、步长调节、振荡抑制等关键环节。作者分享了实际仿真中遇到的问题与优化策略,如引入死区阈值减少功率抖动、合理设置采样时间以匹配开关频率,并指出使用Three-Phase V-I Measurement模块提升测量精度的经验。 适合人群:具备Matlab/Simulink基础,从事新能源发电、电力电子或自动控制方向的工程师与高校学生。 使用场景及目标:①学习并实现MPPT中扰动观察法的核心逻辑;②掌握Simulink中光伏系统建模与控制器设计方法;③优化MPPT系统动态响应与稳定性。 阅读建议:建议结合Simulink环境动手复现模型,重点关注控制器代码逻辑与参数调优过程,同时注意环境温度与光照强度对输出特性的影响,加深对MPPT控制策略的理解。
recommend-type

Matlab中基于有限差分法的烧结过程相场模拟及其应用 - Matlab v2.0

利用Matlab和有限差分法进行烧结过程的相场模拟方法。首先解释了相场法的基本概念以及它在材料科学尤其是烧结过程中微观结构演化模拟的优势。接着具体展示了如何将Allen-Cahn方程离散化并应用于二维网格系统中,包括设置合理的初始条件、选择适当的边界条件、定义关键参数如迁移率M、界面能量参数ε等。然后逐步讲解了时间推进过程中三个主要步骤:计算拉普拉斯项、处理非线性项、更新相场变量值的具体实现方式,并提供了相应的Matlab代码片段。此外还讨论了一些实用技巧,比如通过改变初始条件来研究不同的烧结现象,以及针对大规模网格计算时提高程序效率的方法。 适合人群:对材料科学感兴趣的研究人员和技术爱好者,特别是那些希望深入了解相场模型及其在烧结过程中的应用的人群。 使用场景及目标:适用于需要模拟材料内部微观结构变化情况的研究项目,旨在帮助用户掌握如何使用Matlab构建简单的相场模型来进行烧结过程仿真,从而更好地理解相关物理机制。 阅读建议:由于涉及到较多数学公式推导和编程细节,在阅读前最好有一定的物理学背景知识和Matlab编程基础。同时建议跟随文中提供的代码实例动手实践,以便加深理解和记忆。
recommend-type

复合能量管理策略下燃料电池与超级电容的协同优化仿真研究——基于Simulink模型及多策略对比分析

内容概要:本文系统分析了燃料电池、电池与超级电容复合储能系统的能量管理策略,重点介绍了传统PI控制、等效燃油耗最低(ECMS)、等效能耗最低(EEMS)以及分频解耦四种策略的原理与特点,并构建了基于Simulink的仿真模型,用于验证不同策略在能源优化分配中的性能表现。文章还探讨了该技术在城轨交通、电动汽车和微电网等领域的应用场景。 适合人群:从事新能源系统设计、混合储能控制策略研究的工程师与科研人员,具备一定电力电子与控制理论基础的研究生或技术人员。 使用场景及目标:①为混合储能系统设计高效能量管理策略提供理论支持;②通过Simulink仿真模型实现策略验证与性能对比;③推动燃料电池与超级电容协同控制在交通与微网领域的工程应用。 阅读建议:建议结合Simulink仿真实践,深入理解各策略的控制逻辑与优化机制,重点关注ECMS与EEMS在能效优化中的差异,以及分频解耦在动态响应中的优势。
recommend-type

灵动交互之美:探索按钮点击时的渐隐视觉反馈效果,html,css,js,javascript,按钮

html,css,js,javascript,按钮 # 灵动交互之美:探索按钮点击时的渐隐视觉反馈效果 在现代网页设计中,微小的交互细节往往是提升用户体验的关键。本页面展示的按钮效果看似简单,却蕴含着精心设计的交互逻辑——当用户点击按钮的瞬间,元素会以0.1秒的速度呈现50%的透明度变化,这种即时反馈让操作行为得到明确呼应,既避免了传统按钮"按下无反应"的生硬感,又不会因过渡动画过长干扰操作节奏。 设计上采用了红色系主色调(bg-red-500),在浅灰色背景(bg-gray-100)的衬托下形成鲜明视觉对比,确保按钮在页面中具有足够辨识度。圆角设计(rounded-lg)与适中的内边距(px-6 py-3)平衡了视觉柔和度与点击热区大小,配合中等字重(font-medium)的白色文字,实现了清晰的信息层级。 技术实现上,通过Tailwind CSS构建基础样式,结合自定义CSS的transition属性实现平滑过渡效果,仅用寥寥数行代码就达成了专业级的交互体验。这种轻量级方案既保证了性能优化,又便于开发者根据需求调整参数——无论是修改过渡时长、透明度数值,还是替换颜色方案,都能快速适配不同的设计场景。 对于用户而言,这种即时反馈机制能有效减少操作不确定性,尤其在表单提交、功能触发等关键交互节点,可显著提升操作信心。对于开发者来说,该案例展示了"以小见大"的设计思路:无需复杂动画库,利用基础CSS属性即可打造出既实用又美观的交互细节,为网页增添精致感与专业度。
recommend-type

中国风PPT模板:动态水墨画效果展示

在当今的商业演示和教育培训领域,PPT模板扮演着至关重要的角色。它们不仅能够提升演示的专业性,还能通过视觉效果吸引观众的注意力。针对该模板的介绍,我们可以详细讲解以下几个知识点: 1. PPT模板的定义和作用 PPT模板是一套预设的幻灯片格式和设计,可以包括颜色方案、字体样式、背景图案、布局排版等元素。用户可以利用这些模板快速制作出专业和美观的演示文稿,无需从零开始设计。模板的作用主要体现在节省设计时间、保证演示文稿的一致性和专业性,以及提供统一的视觉美感。 2. 中式动态水墨画的特色和意义 中式动态水墨画是融合了中国传统水墨画艺术与现代动态效果的视觉艺术形式。水墨画以其独特的意境、深邃的文化内涵和富有变化的笔触闻名。动态效果的加入,使得传统艺术形式焕发新生,更加生动和吸引人。使用中式动态水墨画作为PPT模板的主题,可以表现出浓厚的中国传统文化气息,同时给观众带来新颖的视觉体验。 3. 动态水墨画在PPT中的应用 在PPT中应用动态水墨画,可以通过以下几种方式体现:使用水墨流动或扩散的动画效果来模拟真实水墨画的创作过程;利用动态背景来增强画面的动感和艺术氛围;设置水墨元素作为过渡动画,使得幻灯片之间的切换更加自然流畅。需要注意的是,动态效果的使用要适度,过多的动态效果可能会分散观众的注意力,影响信息的传递。 4. 安装特定字体的重要性 标题中提到了“注意安装字体:宋徽宗瘦金体”,这指出了使用特定字体对于保持模板设计原貌的重要性。宋徽宗瘦金体是北宋时期的一种书体,具有很高的艺术价值和历史文化价值。在PPT模板设计中,使用这种字体可以传递出独特的古典韵味。为了确保模板在其他计算机上打开时能够保持原样,设计师通常会在说明中提醒用户安装相应的字体。 5. 排版布局的灵活多变性 “排版布局灵活多变”说明该模板在设计上具有很强的可定制性,用户可以根据演示内容的需要,调整文本、图片等元素的位置和大小,以达到最佳的视觉效果。灵活的布局设计往往包括多个不同样式的幻灯片版式,用户可以根据需要进行选择和修改。 6. 实用性的体现 模板的实用性体现在其能够适应不同场合和主题的需要,同时操作简便、易于编辑。对于用户而言,实用的模板可以快速地转化成高质量的演示文稿,满足特定的演示需求,如公司介绍、产品发布、教育培训等。 总结来说,该“创意中式动态水墨画PPT模板”通过结合中国传统艺术与现代设计元素,既展现了深厚的文化底蕴,又满足了现代商业演示的视觉需求。它不仅为设计师和演讲者提供了一个快速制作演示文稿的平台,也传递出一种现代与传统相结合的美学理念。对于需要制作具有中国特色演示文稿的用户来说,是一个不错的选择。
recommend-type

元宇宙中的智能扩展现实:新兴理论与应用探索

# 元宇宙中的智能扩展现实:新兴理论与应用 ## 1. 元宇宙的特征 元宇宙是一个具有多种独特特征的环境,这些特征使其区别于传统的现实世界和虚拟世界。具体如下: - **协作环境**:人们在元宇宙中协作以实现经济、社会和休闲等不同目标。 - **在线空间**:基于三维的在线环境,人们可以沉浸其中。 - **共享世界**:人们能够分享活动、观点和信息,购物也成为一种网络化体验。 - **增强和科技化场所**:借助增强现实技术,人们可以丰富体验,还能通过虚拟元素、技术和互联网进行社交和互动。 - **多用户环境**:人们可以同时使用相同的技术或进行相同的活动,是现实生活的延伸。 - **无限世界
recommend-type

电阻电容选型

<think>好的,我现在需要为用户介绍电阻和电容的选型。首先,我得确定用户的基础,可能是个电子爱好者或者刚入行的工程师,所以需要从基础开始,但又不能太浅显。用户可能需要知道选型时需要考虑哪些关键参数,以及实际应用中的注意事项。 首先,电阻的选型。我应该想到阻值、功率、精度、温度系数、封装这些基本参数。每个参数都需要解释清楚,比如功率要考虑实际功耗,避免过热。温度系数对高精度电路很重要,比如仪表放大器。封装的话,不同功率对应不同尺寸,比如0805、1206这些常见封装。还有特殊类型电阻,像贴片、金属膜、绕线,各自的应用场景,比如高频用金属膜,大功率用绕线。 然后是电容的选型。电容种类更多,
recommend-type

电教管理系统V2.0:高效在线管理教育资源

电教管理系统是一个基于教育单位需求,特别是针对学校电教资料的在线管理而开发的系统。其核心功能包括资料的在线查询与管理,使管理员能够远程控制电教资料的状态,而用户可以随时查看所需资料的可借状态。该系统还提供新到资料的信息介绍,帮助用户获取最新的电教材料。系统的主要特点如下: 1. 在线管理功能:通过网络连接,管理员能够在任何地点进行电教资料的管理工作,包括更新、编辑资料信息,以及监控资料的借阅状态。 2. 用户查询功能:允许用户在线查询资料的详细信息、借阅状态和位置等,便于用户了解所需资料的当前状态,判断是否需要借阅或者是否有其他资料可供选择。 3. 资料截图显示:增加了资料的直观展示,管理员和用户可以通过上传的资料图片更快速地识别资料内容,增强用户体验。 4. 模糊查询功能:系统支持模糊查询,用户可以通过关键字搜索,快速找到相关资料,提高了查询的效率和便捷性。 5. 查询速度优化:系统通过算法改进,加快了资料的查询速度,为管理员和用户提供更流畅的操作体验。 系统使用.NET 2.0平台进行开发,这表明该系统主要针对Windows操作系统环境。由于.NET 2.0是微软公司开发的一个广泛使用的框架,该系统能够保证良好的兼容性和稳定性,同时能够利用.NET框架提供的强大功能来实现丰富的用户界面和后台处理逻辑。 系统的开发语言很可能是C#,因为它是.NET平台上的主要编程语言。此外,系统还可能使用了SQL Server作为后台数据库管理系统,因为SQL Server与.NET框架的整合非常紧密,并且可以方便地处理大量数据。 从标签“.NET源码-信息管理”来看,该系统还可能提供了源代码开放的特点,允许其他开发者查看和修改源代码,从而对系统进行定制化开发和功能的增强。这有助于学校或教育单位根据自身特点和需求对系统进行调整,进一步提升系统的可用性和针对性。 至于提供的文件名称“downcode.com”,这可能是系统帮助文档、源代码、安装程序或其他相关资源的下载链接。用户通过此链接可能下载到系统软件包,包含各种必要的安装文件和系统使用说明,以方便安装和配置电教管理系统。 总而言之,电教管理系统测试版V2.0为教育单位提供了一个现代化的解决方案,用于有效地管理电教资料,并提高资料的利用率和管理效率。该系统的开发和技术选型体现了当前IT领域在教育信息化建设方面的先进理念和实践。
recommend-type

奢侈品时尚零售中的人工智能与扩展现实

# 奢侈品时尚零售中的人工智能与扩展现实 ## 1. 纳米层面的双重关系 在奢侈品时尚零售领域,纳米层面体现了一线员工与奢侈品时尚消费者之间的双重关系。一线员工不仅包括人类,还涵盖了人工智能代理,如聊天机器人和店内机器人。人类一线员工需依据零售组织文化和身份接受培训,同时享有所在国家法律规定的劳动权利和义务,并遵循时尚奢侈品牌的总体政策。 而人工智能代理在知识和情感方面不断进化,最终可能会更清晰地意识到自身存在,甚至开始主张权利,未来还有可能成为消费者。与此同时,融合纳米技术设备或采用增强能力假肢的混合人类,也能同时扮演员工和顾客的双重角色。 在这种情况下,人类与人工智能代理、不同技术水