Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
AresnLiang
VueJS_554986
提交
a94d7059
V
VueJS_554986
项目概览
AresnLiang
/
VueJS_554986
与 Fork 源项目一致
Fork自
inscode / VueJS
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
VueJS_554986
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a94d7059
编写于
3月 18, 2024
作者:
View Design
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Mon Mar 18 15:22:00 CST 2024 inscode
上级
61702be5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
73 addition
and
146 deletion
+73
-146
src/App.vue
src/App.vue
+32
-98
src/components/table.vue
src/components/table.vue
+41
-48
未找到文件。
src/App.vue
浏览文件 @
a94d7059
<
template
>
<div>
<
i-table
:data=
"tableData"
:columns=
"tableColumns"
:rowHeight=
"30"
:visibleRowCount=
"10"
/
>
<div
id=
"app"
>
<
VirtualScrollTable
:data=
"data"
:columns=
"columns"
:height=
"height"
></VirtualScrollTable
>
</div>
</
template
>
<
script
>
import
iTable
from
"
./components/table.vue
"
;
import
VirtualScrollTable
from
'
./components/table.vue
'
;
export
default
{
components
:
{
iTable
,
},
data
()
{
return
{
tableData
:
[
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
{
id
:
1
,
name
:
"
John Doe
"
,
age
:
30
},
{
id
:
2
,
name
:
"
Jane Doe
"
,
age
:
25
},
{
id
:
3
,
name
:
"
Bob Smith
"
,
age
:
40
},
{
id
:
4
,
name
:
"
Alice Johnson
"
,
age
:
35
},
{
id
:
5
,
name
:
"
Tom Brown
"
,
age
:
28
},
{
id
:
6
,
name
:
"
Sara Lee
"
,
age
:
32
},
{
id
:
7
,
name
:
"
Mike Smith
"
,
age
:
45
},
{
id
:
8
,
name
:
"
Lucy Chen
"
,
age
:
27
},
{
id
:
9
,
name
:
"
David Wang
"
,
age
:
38
},
{
id
:
10
,
name
:
"
Grace Zhang
"
,
age
:
31
},
{
id
:
11
,
name
:
"
Jack Ma
"
,
age
:
50
},
{
id
:
12
,
name
:
"
Maggie Lee
"
,
age
:
29
},
],
tableColumns
:
[
"
ID
"
,
"
Name
"
,
"
Age
"
],
};
components
:
{
VirtualScrollTable
},
data
:
{
data
:
[],
columns
:
[
{
name
:
'
id
'
,
label
:
'
ID
'
},
{
name
:
'
name
'
,
label
:
'
姓名
'
},
{
name
:
'
age
'
,
label
:
'
年龄
'
}
],
height
:
300
},
};
mounted
()
{
// 模拟生成大量数据
for
(
let
i
=
0
;
i
<
10000
;
i
++
)
{
this
.
data
.
push
({
id
:
i
+
1
,
name
:
'
姓名
'
+
(
i
+
1
),
age
:
Math
.
floor
(
Math
.
random
()
*
100
)
})
}
}
}
</
script
>
src/components/table.vue
浏览文件 @
a94d7059
<
template
>
<div
class=
"
vue-table"
ref=
"tableWrapper"
@
scroll=
"handleScroll
"
>
<table>
<div
class=
"
table-wrapper
"
>
<table
:height=
"height"
ref=
"table"
>
<thead>
<tr>
<th
v-for=
"column in columns"
>
{{
column
}}
</th>
<th
v-for=
"column in columns"
:key=
"column.name"
>
{{
column
.
label
}}
</th>
</tr>
</thead>
<tbody>
<tr
v-for=
"(row, index) in visibleRows"
:key=
"index"
>
<td
v-for=
"(value, key) in row"
>
{{
value
}}
</td>
<tr
v-for=
"item in renderedData"
:key=
"item.id"
>
<td
v-for=
"column in columns"
:key=
"column.name"
>
{{
item
[
column
.
name
]
}}
</td>
</tr>
</tbody>
</table>
...
...
@@ -17,71 +21,60 @@
<
script
>
export
default
{
name
:
'
VirtualScrollTable
'
,
props
:
{
data
:
{
type
:
Array
,
required
:
true
,
required
:
true
},
columns
:
{
type
:
Array
,
required
:
true
,
required
:
true
},
rowH
eight
:
{
h
eight
:
{
type
:
Number
,
required
:
true
,
},
visibleRowCount
:
{
type
:
Number
,
required
:
true
,
},
default
:
300
}
},
data
()
{
data
()
{
return
{
renderedData
:
[],
scrollTop
:
0
,
lastRenderedIndex
:
0
,
};
visibleRowsCount
:
0
,
rowHeight
:
50
}
},
computed
:
{
visibleRows
()
{
const
startIndex
=
Math
.
floor
(
this
.
scrollTop
/
this
.
rowHeight
);
const
endIndex
=
startIndex
+
this
.
visibleRowCount
;
this
.
lastRenderedIndex
=
endIndex
;
return
this
.
data
.
slice
(
startIndex
,
endIndex
);
},
tableHeight
()
{
return
this
.
rowHeight
*
this
.
data
.
length
;
},
wrapperHeight
()
{
return
this
.
rowHeight
*
this
.
visibleRowCount
;
},
watch
:
{
scrollTop
()
{
this
.
updateRenderedData
()
}
},
methods
:
{
handleScroll
(
event
)
{
this
.
scrollTop
=
event
.
target
.
scrollTop
;
},
mounted
()
{
this
.
visibleRowsCount
=
Math
.
ceil
(
this
.
height
/
this
.
rowHeight
)
this
.
updateRenderedData
()
},
};
methods
:
{
updateRenderedData
()
{
const
startIndex
=
Math
.
floor
(
this
.
scrollTop
/
this
.
rowHeight
)
const
endIndex
=
startIndex
+
this
.
visibleRowsCount
this
.
renderedData
=
this
.
data
.
slice
(
startIndex
,
endIndex
)
}
}
}
</
script
>
<
style
>
.vue-table
{
height
:
100%
;
overflow-y
:
scroll
;
.table-wrapper
{
overflow-y
:
auto
;
}
table
{
width
:
100%
;
border-collapse
:
collapse
;
table-layout
:
fixed
;
width
:
100%
;
}
th
,
td
{
padding
:
8px
;
text-align
:
left
;
border-bottom
:
1px
solid
#ddd
;
white-space
:
nowrap
;
overflow
:
hidden
;
text-overflow
:
ellipsis
;
th
,
td
{
border
:
1px
solid
#ddd
;
padding
:
5px
;
}
</
style
>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录