本帖最后由 Richard.Huang 于 2024-2-4 14:47 编辑
产品:SpreadJS
初始化数据全部展示
而后通过第一个SpreadSheets中的ComboBox对下方的SpreadSheets中数据进行过滤,根据需求所有数据都应保留,因此我选用setRowVisible方法对被过滤的数据进行隐藏和显示的调用。
当我在下拉框选用月度后,即只过滤显示月度的数据,则当前过滤情况如下图:
当我再次在下拉框选择季度过滤项,则会从13行开始展示,即将上一步月度数据所占最后一行的下一行开始展示,如下图:
需要滚轮向上滚动才可以看见被筛选出的数据。
请问这种情况下如何让数据直接从被筛选出的第一条数据的起始行开始展示呢?
附加问题:
选择下拉框后设置存储过滤条件,然后根据过滤条件筛选每个表的数据。当点开下拉框选择条件后页面会卡顿(数据较多情况下,目前60条数据以略显卡顿),会在所有表格重新渲染结束后才会收起下拉框并改变下拉框的值,请问这种问题如何解决呢?
由于加密设置无法上传代码demo,我将代码拷贝下方, 项目为react项目:
入口App.js:
- import React from "react";
- import Header from './components/header'
- import Content from './components/content'
- import { useState } from "react";
- import { testData } from "./utils";
- function App() {
- const [filterInfo, setFilterInfo] = useState({})
- const [detailData, setDetailData] = useState(testData)
- const handleFilter = (val) => {
- setFilterInfo(val)
- console.log(val);
- }
- return (
- <div className="App">
- <Header handleFilter={handleFilter} />
- {
- detailData?.map((item, index) => {
- return <div key={index}>
- <Content data={item} filterInfo={filterInfo} />
- </div>
- })
- }
- </div>
- );
- }
- export default App;
复制代码
头部Header.js:
- import GC from "@grapecity/spread-sheets"
- import { SpreadSheets, Worksheet } from "@grapecity/spread-sheets-react"
- const Header = (props) => {
- const { handleFilter } = props
- const initSheet = (spread) => {
- const sheet = spread.sheets[0]
- sheet.setRowCount(1)
- sheet.setColumnWidth(0, 110)
- sheet.setRowHeight(0, 35)
- let comBox = new GC.Spread.Sheets.CellTypes.ComboBox()
- comBox.items([
- {
- value: 'ALL',
- text: '全部'
- },
- {
- value: 'YEAR',
- text: '年度'
- },
- {
- value: 'SEASON',
- text: '季度'
- },
- {
- value: 'MONTH',
- text: '月度'
- },
- ])
- comBox.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value)
- sheet.getCell(0,0, GC.Spread.Sheets.SheetArea.viewport).cellType(comBox).value('ALL')
- sheet.bind(GC.Spread.Sheets.Events.ValueChanged, (sender, args) => {
- handleFilter({periodCode: args.newValue})
- })
- }
- return <div>
- <SpreadSheets hostStyle={{height: 80}} newTabVisible={false} workbookInitialized={(spread) => initSheet(spread)}>
- <Worksheet></Worksheet>
- </SpreadSheets>
- </div>
- }
- export default Header
复制代码
数据展示模块文件Content.js
- import GC from "@grapecity/spread-sheets"
- import { SpreadSheets, Worksheet } from "@grapecity/spread-sheets-react"
- import { useEffect } from "react"
- import { useState } from "react"
- const Content = (props) => {
- const { data, filterInfo } = props
- const [contentSheet, setContentSheet] = useState()
- const initSheet = (spread) => {
- const sheet = spread.sheets[0]
- setContentSheet(sheet)
- // sheet.setRowCount(1)
- sheet.setColumnWidth(0, 110)
- sheet.setDataSource(new GC.Spread.Sheets.Bindings.CellBindingSource(data))
- let table = sheet.tables.add('table', 0, 0, 1, 5)
- let column1 = new GC.Spread.Sheets.Tables.TableColumn(1, 'periodCode')
- let column2 = new GC.Spread.Sheets.Tables.TableColumn(2, 'periodName')
- table.autoGenerateColumns(false);
- table.bindColumns([column1, column2])
- table.bindingPath('dataSource')
- table.showHeader(false)
- sheet.deleteRows(0, 1)
- }
- const handleFilterData = () => {
- // contentSheet.suspendPaint()
- let dataSource = contentSheet.getDataSource().rT.dataSource
- let tempData = []
- dataSource.forEach((item, index) => {
- if (filterInfo.periodCode !== 'ALL') {
- if (filterInfo.periodCode === item.periodCode) {
- if (item?.filter) {
- contentSheet.setRowVisible(index, true)
- }
- tempData.push({
- ...item,
- filter: false
- })
- } else {
- if (!item?.filter) {
- contentSheet.setRowVisible(index, false)
- }
- tempData.push({
- ...item,
- filter: true
- })
- }
- } else {
- if (item?.filter) {
- contentSheet.setRowVisible(index, true)
- }
- tempData.push({
- ...item,
- filter: false
- })
- }
- });
- contentSheet.setDataSource(new GC.Spread.Sheets.Bindings.CellBindingSource({
- ...data,
- dataSource: tempData
- }))
- contentSheet.resumePaint()
- }
- useEffect(() => {
- if (Object.keys(filterInfo).length !== 0 && contentSheet) {
- handleFilterData()
- }
- }, [filterInfo, contentSheet])
- return <div>
- <SpreadSheets hostStyle={{height: 300}} newTabVisible={false} workbookInitialized={(spread) => initSheet(spread)}>
- <Worksheet></Worksheet>
- </SpreadSheets>
- </div>
- }
- export default Content
复制代码
数据文件util.js
- export const testData = [
- {
- level: 1,
- dataSource: [
- {
- periodCode: 'YEAR',
- periodName: '年度数据',
- id: 1,
- filter: false,
- },
- {
- periodCode: 'YEAR',
- periodName: '年度数据2',
- id: 2,
- filter: false,
- },
- {
- periodCode: 'YEAR',
- periodName: '年度数据3',
- id: 3,
- filter: false,
- },
- {
- periodCode: 'YEAR',
- periodName: '年度数据4',
- id: 4,
- filter: false,
- },
- {
- periodCode: 'SEASON',
- periodName: '季度数据',
- id: 5,
- filter: false,
- },
- {
- periodCode: 'SEASON',
- periodName: '季度数据2',
- id: 6,
- filter: false,
- },
- {
- periodCode: 'SEASON',
- periodName: '季度数据3',
- id: 7,
- filter: false,
- },
- {
- periodCode: 'SEASON',
- periodName: '季度数据4',
- id: 8,
- filter: false,
- },
- {
- periodCode: 'MONTH',
- periodName: '月度数据',
- id: 9,
- filter: false,
- },
- {
- periodCode: 'MONTH',
- periodName: '月度数据2',
- id: 10,
- filter: false,
- },
- {
- periodCode: 'MONTH',
- periodName: '月度数据3',
- id: 11,
- filter: false,
- },
- {
- periodCode: 'MONTH',
- periodName: '月度数据4',
- id: 12,
- filter: false,
- }
- ]
- },
- ]
复制代码
如需多数据测试,可直接复制带level属性的那个对象,多复制几个即可复现卡顿问题
|
|