VUE项目中使用@scroll获取不到事件对象,结果undefined

[解决] VUE项目中使用@scroll获取不到事件对象,结果undefined

考虑为什么获取不到事件对象

原因1:获取或书写的方式有问题
原因2:样式的 overflow: scroll
原因3:没有给父盒子设置固定高度
原因4:浏览器兼容问题

几种解决办法

  1. 兼容scrolltop
    export default {
      methods: {
        changeScroll(e) {
          // 文档的总高度
          const documentScrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight
          // 浏览器窗口的高度
          const getWindowHeight = document.documentElement.clientHeight || document.body.clientHeight
          // 滚动条在y轴上的滚动距离
          const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
        }
      }
    }
    
  2. 设置css
    .overview {
        // 给父元素设置固定高度
        height: 600px;
        // 设置可滚动
        overflow-y: auto;
      }
    
  3. 绑定事件,禁止冒泡
    	window.addEventListener('scroll', (e) => {
          console.log(e)
        }, true)
    

如果只想在页面内进行跳转可使用

Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内。

TYPEparamsdefault
behavior (动画过渡效果)"auto"或 “smooth”"auto"
block (垂直方向的对齐)“start”, “center”, “end”, 或 “nearest”"start"
inline (水平方向的对齐)“start”, “center”, “end”, 或 “nearest”"nearest"

var element = document.getElementById(“box”);

element.scrollIntoView();
element.scrollIntoView(false);
element.scrollIntoView({block: “end”});
element.scrollIntoView({behavior: “smooth”, block: “end”, inline: “nearest”});

为了将文件中的代码从Options API重构为Composition API,并保持Vue 2的支持,我们可以使用`@vue/composition-api`插件。以下是详细的重构步骤和代码: ### 安装依赖 首先,需要安装`@vue/composition-api`插件: ```sh npm install @vue/composition-api ``` ### 主要更改点 1. **引入 Composition API**:在组件中引入`setup`函数和其他Composition API相关的钩子。 2. **状态管理**:使用`reactive`或`ref`来声明响应式数据。 3. **生命周期钩子**:使用相应的Composition API钩子,如`onMounted`、`onCreated`等。 4. **方法提取**:将原有的方法提取到`setup`函数中。 ### 重构后的代码 ```vue <template> <a-spin :spinning="spinning" tip="报表同步中,请稍等"> <a-card :bordered="false"> <!-- 查询区域 --> <div class="table-page-search-wrapper"> <a-form layout="inline" @keyup.enter.native="searchQuery"> <a-row :gutter="24"> <a-col> <my-fast-date-picker :radioList="[{ value: 2, text: &#39;月&#39; }, { value: 3, text: &#39;年&#39; }]" :radioVal="2" :currName="&#39;近半年&#39;" :showRadioGroup="true" :fastTime="fastTime" @change="change" > <template v-slot:text>时间:</template> </my-fast-date-picker> </a-col> <template v-if="toggleSearchStatus"> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="项目编号:"> <a-input placeholder="请输入项目编号" allowClear v-model="queryParam.projectCode" /> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="项目名称"> <a-select allowClear show-search v-model="queryParam.projectName_Code" placeholder="请输入项目名称" style="width: 100%" :show-arrow="false" :filter-option="false" :not-found-content="null" @search="projectCodeSearch" @change="projectCodeChange" > <a-select-option v-for="d in projectNameList" :key="d.id"> {{ d.text }} </a-select-option> </a-select> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="物资"> <a-input placeholder="请输入物资编号/名称" allowClear v-model="queryParam.keyWord" /> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="厂商"> <j-search-select-tag placeholder="请选择厂商" v-model="queryParam.producerId" dict="biz_product_vendor,abbreviation,id,del_flag = 0 and status = 1" /> </a-form-item> </a-col> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <a-form-item label="规格型号"> <a-input placeholder="请输入规格型号" allowClear v-model="queryParam.specification" /> </a-form-item> </a-col> </template> <a-col :xl="6" :lg="7" :md="8" :sm="24"> <span style="float: left; overflow: hidden;" class="table-page-search-submitButtons"> <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> <a @click="handleToggleSearch" style="margin-left: 8px"> {{ toggleSearchStatus ? &#39;收起&#39; : &#39;展开&#39; }} <a-icon :type="toggleSearchStatus ? &#39;up&#39; : &#39;down&#39;" /> </a> </span> </a-col> </a-row> </a-form> </div> <!-- 查询区域-END --> <!-- 操作按钮区域 --> <div class="table-operator"> <div> <a-button type="primary" icon="download" @click="handleExportXlsx()">导出</a-button> </div> </div> <!-- table区域-begin --> <div> <a-table ref="table" size="middle" :scroll="{ x: true }" bordered rowKey="uniqueId" :columns="columns" :dataSource="dataSource" :pagination="ipagination" :loading="loading" class="j-table-force-nowrap" @change="handleTableChange" > <span slot="receivingFreezeAmount"> 领用冻结 <a-tooltip> <template slot="title"> 项目领用申请审核通过后,待出库的数量。 </template> <a-icon type="info-circle" /> </a-tooltip> </span> <span slot="receivingFreezeAmount_title"> 预算余量 <a-tooltip> <template slot="title"> 预算余量=预算总数-领用冻结-领用总数+领用归还 </template> <a-icon type="info-circle" /> </a-tooltip> </span> <span slot="requisitionAmount_title"> 领用总数 <a-tooltip> <template slot="title"> 项目盘盈更新领用余料时,会自动产生领用增补单(不受预算限制),可能导致领用总数超过预算总数。 </template> <a-icon type="info-circle" /> </a-tooltip> </span> <span slot="budgetTotalAmount" slot-scope="text, record"> <a-tooltip> <template slot="title"> <d1v class="tipItem"> <div>预算编号</div> <div>预算数</div> </d1v> <div v-for="(value, key) in record.budgetDetail" class="tipItem" v-show="key !== &#39;小计&#39;"> <div>{{ key }}</div> <div>{{ value }}</div> </div> <div class="tipItem"> <div>小记</div> <div>{{ text }}</div> </div> </template> <span style="color: blue">{{ text }}</span> </a-tooltip> </span> <span slot="budgetSurplusAmount" slot-scope="text, record"> <span :style="{ color: record.budgetSurplusAmount <= projectBudgetMarginWarning ? &#39;red&#39; : &#39;black&#39; }">{{ text }}</span> </span> <span slot="inventoryAmount" slot-scope="text, record"> <span :style="{ color: record.inventoryAmount <= record.budgetSurplusAmount ? &#39;red&#39; : &#39;black&#39; }">{{ text }}</span> </span> </a-table> </div> </a-card> </a-spin> </template> <script> import { createNamespacedHelpers, reactive, computed, watch, onMounted } from &#39;@vue/composition-api&#39;; import MyFastDatePicker from &#39;@/components/date/MyFastDatePicker&#39;; const { mapActions } = createNamespacedHelpers(&#39;someNamespace&#39;); export default { name: &#39;ProjectMaterialStatistics&#39;, setup(props, context) { const state = reactive({ projectNameList: [], projectName_Code: "", projectBudgetMarginWarning: 0, expandedRowKeys: [], workorderProjectList: [], description: &#39;营业报表管理页面&#39;, fastTime: [&#39;本月&#39;, &#39;上月&#39;, &#39;近半年&#39;], noCreate: true, hasUpdateTime: true, configOrderSubTypeList: [], configOrderSubTypeTemp: undefined, allDepartList: [], hallCodeDataList: [], spinning: false, checkFlag: true, updateTime: &#39;&#39;, url: { list: "/web/projectUseMaterial/list", exportXlsxUrl: "/web/projectUseMaterial/export", exportPdfUrl: "/web/bizBusinessRecord/exportpdf", exportDetailUrl: "/web/bizBusinessRecord/exportDetailExcel", }, keyList: [&#39;saleNum&#39;, &#39;saleName&#39;, &#39;terminalTypeName&#39;, &#39;userTypeName&#39;, &#39;configOrderMainTypeName&#39;, &#39;configOrderSubTypeName&#39;], ipagination: { current: 1, pageSize: 20, pageSizeOptions: [&#39;20&#39;, &#39;50&#39;, &#39;80&#39;], showTotal: (total, range) => `${range[0]}-${range[1]} 共 ${total} 条`, showQuickJumper: true, showSizeChanger: true, total: 0 }, columns: [ { title: &#39;项目编号&#39;, align: "center", dataIndex: &#39;projectCode&#39;, customRender: (text, row, index) => renderMergedCells1(text, row, index) }, { title: &#39;项目名称&#39;, align: "center", dataIndex: &#39;projectName&#39;, customRender: (text, row, index) => renderMergedCells(text, row, index) }, { title: &#39;物资编号&#39;, align: "center", dataIndex: &#39;materialCode&#39; }, { title: &#39;物资名称&#39;, align: "center", dataIndex: &#39;materialName&#39; }, { title: &#39;厂商&#39;, align: "center", dataIndex: &#39;producerId_dictText&#39; }, { title: &#39;规格型号&#39;, align: "center", dataIndex: &#39;specification&#39; }, { title: &#39;单位&#39;, align: "center", dataIndex: &#39;unit&#39; }, { title: &#39;预算总数&#39;, align: "center", dataIndex: &#39;budgetTotalAmount&#39;, scopedSlots: { customRender: &#39;budgetTotalAmount&#39; } }, { align: "center", slots: { title: &#39;receivingFreezeAmount&#39; }, dataIndex: &#39;receivingFreezeAmount&#39; }, { align: "center", slots: { title: &#39;requisitionAmount_title&#39; }, dataIndex: &#39;receivingTotalAmount&#39; }, { title: &#39;领用余料&#39;, align: "center", dataIndex: &#39;receivingSurplusAmount&#39; }, { title: &#39;领料使用&#39;, align: "center", dataIndex: &#39;receivingUseAmount&#39; }, { align: "center", dataIndex: &#39;budgetSurplusAmount&#39;, slots: { title: &#39;receivingFreezeAmount_title&#39; }, scopedSlots: { customRender: &#39;budgetSurplusAmount&#39; } }, { title: &#39;库存可用数&#39;, align: "center", dataIndex: &#39;inventoryAmount&#39;, scopedSlots: { customRender: &#39;inventoryAmount&#39; } } ], dataSource: [] }); const { commit } = context; const queryParam = reactive({ projectCode: &#39;&#39;, keyWord: &#39;&#39;, producerId: &#39;&#39;, specification: &#39;&#39;, projectName_Code: &#39;&#39;, projectName: &#39;&#39; }); const loadData = (page) => { // 仿照原逻辑实现 // 示例调用接口 // fetch(state.url.list, { page }) // .then(response => response.json()) // .then(data => { // state.dataSource = data.items; // state.ipagination.total = data.total; // }); }; const renderMergedCells = (value, row, index) => { const obj = { children: value, attrs: {} }; if (index === 0 || row.projectName !== state.dataSource[index - 1].projectName) { let rowSpan = 1; for (let i = index + 1; i < state.dataSource.length; i++) { if (state.dataSource[i].projectName === row.projectName) { rowSpan++; } else { break; } } obj.attrs.rowSpan = rowSpan; } else { obj.attrs.rowSpan = 0; } return obj; }; const renderMergedCells1 = (value, row, index) => { const obj = { children: value, attrs: {} }; if (index === 0 || row.projectCode !== state.dataSource[index - 1].projectCode) { let rowSpan = 1; for (let i = index + 1; i < state.dataSource.length; i++) { if (state.dataSource[i].projectCode === row.projectCode) { rowSpan++; } else { break; } } obj.attrs.rowSpan = rowSpan; } else { obj.attrs.rowSpan = 0; } return obj; }; const projectCodeSearch = (value) => { getAction(&#39;/web/projectRecord/searchMainProject&#39;, { order: &#39;desc&#39;, pageNo: 1, pageSize: 100, keyword: value }) .then(res => { state.projectNameList = res.result.map(item => ({ id: item.id, value: item.projectCode, text: item.projectName })); }); }; const projectCodeChange = (value) => { const obj = state.projectNameList.find(item => item.id === value); queryParam.projectName_Code = value; if (obj) { commit(&#39;setExportParams&#39;, { projectName: obj.text }); queryParam.projectName = obj.text; } else { commit(&#39;setExportParams&#39;, { projectName: &#39;&#39; }); queryParam.projectName = &#39;&#39;; } }; const change = (val1, val2, val3) => { state.exportParams.dateTpye = val3 === 2 ? 1 : 2; queryParam.beginDate = val1; queryParam.endDate = val2; queryParam.hiddenZeroTotalAmountFlag = state.checkFlag ? 1 : 0; // loadData(1); }; const handelChange = () => { state.configOrderSubTypeTemp = undefined; queryParam.configOrderSubType = undefined; queryParam.incomeExpenseType = &#39;&#39;; getConfigOrderSubTypeList(); }; const getConfigOrderSubTypeList = () => { if (queryParam.configOrderMainType) { getAction(&#39;/web/bizTransactionOrder/getOrderSubType&#39;, { configOrderMainType: queryParam.configOrderMainType }) .then(res => { if (res.code === 200) { switch (queryParam.configOrderMainType) { case &#39;1&#39;: const arr = []; res.result.forEach(v => arr.push([v])); arr.forEach(v => v.push({ value: v[0].value, label: v[0].label + &#39;(退)&#39; })); state.configOrderSubTypeList = arr.flat().filter(v => ![96, 98].includes(Number(v.value))); break; case &#39;2&#39;: state.configOrderSubTypeList = res.result.filter(v => [1, 2, 3, 4, 5, 6, 7, 15, 16, 20, 21].includes(Number(v.value))); break; case &#39;3&#39;: state.configOrderSubTypeList = res.result.filter(v => ![7, 8, 10, 12, 14, 16].includes(Number(v.value))); break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值