feat: 基础版本
This commit is contained in:
9
.editorconfig
Normal file
9
.editorconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
1
.eslintignore
Normal file
1
.eslintignore
Normal file
@@ -0,0 +1 @@
|
||||
dist/*
|
||||
30
.eslintrc.js
Normal file
30
.eslintrc.js
Normal file
@@ -0,0 +1,30 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
globals: { wx: true },
|
||||
parser: 'babel-eslint',
|
||||
parserOptions: {
|
||||
sourceType: 'module'
|
||||
},
|
||||
env: {
|
||||
browser: true
|
||||
},
|
||||
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
|
||||
extends: 'standard',
|
||||
// required to lint *.wpy files
|
||||
plugins: [
|
||||
'html'
|
||||
],
|
||||
settings: {
|
||||
'html/html-extensions': ['.html', '.wpy']
|
||||
},
|
||||
// add your custom rules here
|
||||
'rules': {
|
||||
// allow paren-less arrow functions
|
||||
'arrow-parens': 0,
|
||||
// allow async-await
|
||||
'generator-star-spacing': 0,
|
||||
// allow debugger during development
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
||||
'space-before-function-paren': 0
|
||||
}
|
||||
}
|
||||
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
node_modules
|
||||
dist
|
||||
.DS_Store
|
||||
.wepycache
|
||||
3
.prettierrc
Normal file
3
.prettierrc
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"singleQuote": true
|
||||
}
|
||||
4
.wepyignore
Normal file
4
.wepyignore
Normal file
@@ -0,0 +1,4 @@
|
||||
node_modules
|
||||
dist
|
||||
.DS_Store
|
||||
*.wpy___jb_tmp___
|
||||
3464
package-lock.json
generated
Normal file
3464
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
44
package.json
Normal file
44
package.json
Normal file
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"name": "my-table",
|
||||
"version": "0.0.2",
|
||||
"description": "A WePY project",
|
||||
"main": "dist/app.js",
|
||||
"scripts": {
|
||||
"dev": "wepy build --watch",
|
||||
"build": "cross-env NODE_ENV=production wepy build --no-cache",
|
||||
"dev:web": "wepy build --output web",
|
||||
"clean": "find ./dist -maxdepth 1 -not -name 'project.config.json' -not -name 'dist' | xargs rm -rf",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"wepy": {
|
||||
"module-a": false,
|
||||
"./src/components/list": "./src/components/wepy-list.wpy"
|
||||
},
|
||||
"author": "jianchaoliu <jianchaoliu@webot.co>",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"wepy": "^1.7.2",
|
||||
"wepy-async-function": "^1.4.4",
|
||||
"wepy-com-toast": "^1.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-eslint": "^7.2.1",
|
||||
"babel-plugin-transform-class-properties": "^6.24.1",
|
||||
"babel-plugin-transform-decorators-legacy": "^1.3.4",
|
||||
"babel-plugin-transform-export-extensions": "^6.22.0",
|
||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
||||
"babel-preset-env": "^1.6.1",
|
||||
"cross-env": "^5.1.3",
|
||||
"eslint": "^3.18.0",
|
||||
"eslint-config-standard": "^7.1.0",
|
||||
"eslint-friendly-formatter": "^2.0.7",
|
||||
"eslint-plugin-html": "^2.0.1",
|
||||
"eslint-plugin-promise": "^3.5.0",
|
||||
"eslint-plugin-standard": "^2.0.1",
|
||||
"less": "^3.8.1",
|
||||
"wepy-compiler-babel": "^1.5.1",
|
||||
"wepy-compiler-less": "^1.3.10",
|
||||
"wepy-compiler-sass": "^1.3.12",
|
||||
"wepy-eslint": "^1.5.3"
|
||||
}
|
||||
}
|
||||
16
project.config.json
Normal file
16
project.config.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"description": "A WePY project",
|
||||
"setting": {
|
||||
"urlCheck": true,
|
||||
"es6": false,
|
||||
"postcss": false,
|
||||
"minified": false
|
||||
},
|
||||
"compileType": "miniprogram",
|
||||
"appid": "wxd8ee4b9abd4be42c",
|
||||
"projectname": "my-table",
|
||||
"miniprogramRoot": "dist/",
|
||||
"simulatorType": "wechat",
|
||||
"simulatorPluginLibVersion": {},
|
||||
"condition": {}
|
||||
}
|
||||
26
src/app.wpy
Normal file
26
src/app.wpy
Normal file
@@ -0,0 +1,26 @@
|
||||
<script>
|
||||
import wepy from 'wepy'
|
||||
import 'wepy-async-function'
|
||||
|
||||
export default class extends wepy.app {
|
||||
config = {
|
||||
pages: [
|
||||
'pages/index'
|
||||
],
|
||||
window: {
|
||||
backgroundTextStyle: 'light',
|
||||
navigationBarBackgroundColor: '#fff',
|
||||
navigationBarTitleText: 'WeChat',
|
||||
navigationBarTextStyle: 'black'
|
||||
}
|
||||
}
|
||||
|
||||
constructor () {
|
||||
super()
|
||||
this.use('requestfix')
|
||||
}
|
||||
|
||||
onLaunch() {
|
||||
}
|
||||
}
|
||||
</script>
|
||||
195
src/components/table.wpy
Normal file
195
src/components/table.wpy
Normal file
@@ -0,0 +1,195 @@
|
||||
<template>
|
||||
<view class="table-fixed">
|
||||
<!-- S 固定列 -->
|
||||
<view class="table__fixed-columns">
|
||||
<view class="table__fixed-common tr">
|
||||
<view class="fixed-th th"
|
||||
wx:for="{{fixedCols[0]}}"
|
||||
wx:key="{{index}}"
|
||||
style="width: {{colWidths[index]}}rpx;">
|
||||
{{item}}
|
||||
</view>
|
||||
</view>
|
||||
<scroll-view class="table__fixed-others"
|
||||
scroll-y
|
||||
scroll-top="{{scrollTop}}">
|
||||
<view wx:for="{{firstColsOther}}"
|
||||
wx:for-item="row"
|
||||
wx:for-index="rowIndex"
|
||||
wx:key="{{rowIndex}}"
|
||||
class="tr">
|
||||
<view class="td"
|
||||
wx:for="{{row}}"
|
||||
wx:for-item="col"
|
||||
wx:for-index="colIndex"
|
||||
wx:key="{{colIndex}}"
|
||||
style="width: {{colWidths[colIndex]}}rpx;">
|
||||
{{col}}
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<!-- E 固定列 -->
|
||||
<scroll-view class="table"
|
||||
scroll-x>
|
||||
<!-- S 固定表头 -->
|
||||
<view class="thead"
|
||||
style="width: {{totalWidth}}rpx;">
|
||||
<view class="tr">
|
||||
<view class="th"
|
||||
wx:for="{{thead}}"
|
||||
wx:key="{{index}}"
|
||||
style="width: {{colWidths[index]}}rpx;">{{item}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- E 固定表头 -->
|
||||
<scroll-view class="tbody"
|
||||
scroll-y
|
||||
throttle="{{false}}"
|
||||
@scroll="scrollVertical"
|
||||
style="width: {{totalWidth}}rpx;">
|
||||
<view class="tr"
|
||||
wx:for="{{tbody}}"
|
||||
wx:for-item="tr"
|
||||
wx:for-index="trIndex"
|
||||
wx:key="{{trIndex}}">
|
||||
<view class="td"
|
||||
wx:for="{{tr}}"
|
||||
wx:for-item="td"
|
||||
wx:for-index="tdIndex"
|
||||
wx:key="{{tdIndex}}"
|
||||
style="width: {{colWidths[tdIndex]}}rpx;">{{td}}</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import wepy from 'wepy'
|
||||
|
||||
const FAKE_DATA = [
|
||||
['保单年度', '年龄', '当年生存金', '累积生存金', '账户价值', '我是测试']
|
||||
]
|
||||
const count = 100
|
||||
const age = 30
|
||||
for(let i = 0; i < count; i++) {
|
||||
FAKE_DATA.push([
|
||||
i,
|
||||
age + i,
|
||||
400,
|
||||
500,
|
||||
600,
|
||||
700
|
||||
])
|
||||
}
|
||||
|
||||
export default class Table extends wepy.component {
|
||||
data = {
|
||||
table: FAKE_DATA,
|
||||
colWidths: [
|
||||
160, 80, 200, 200, 160, 160
|
||||
],
|
||||
fixedColsNum: 2,
|
||||
scrollTop: 0
|
||||
}
|
||||
computed = {
|
||||
totalWidth () {
|
||||
let result = 0
|
||||
this.colWidths.forEach(item => result += item)
|
||||
return result
|
||||
},
|
||||
fixedCols () {
|
||||
const result = []
|
||||
this.table.forEach(row => {
|
||||
result.push(row
|
||||
.slice(0, this.fixedColsNum)
|
||||
.map(col => col))
|
||||
})
|
||||
return result
|
||||
},
|
||||
firstColsOther () {
|
||||
return this.fixedCols.slice(1)
|
||||
},
|
||||
thead () {
|
||||
return this.table[0]
|
||||
},
|
||||
tbody () {
|
||||
return this.table.slice(1)
|
||||
}
|
||||
}
|
||||
methods = {
|
||||
scrollVertical (event) {
|
||||
const scrollTop = event.detail.scrollTop
|
||||
this.scrollTop = scrollTop
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.table-fixed {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.table__fixed-columns {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
background-color: #fff;
|
||||
z-index: 100;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.table__fixed-others {
|
||||
height: 400rpx;
|
||||
}
|
||||
|
||||
.table {
|
||||
width: 750rpx;
|
||||
}
|
||||
|
||||
.tbody {
|
||||
height: 400rpx;
|
||||
}
|
||||
|
||||
.tr {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
font-size: 0;
|
||||
|
||||
&:nth-child(even) {
|
||||
background-color: #FAFAFA;
|
||||
}
|
||||
}
|
||||
|
||||
$borderColor: #E6E6E6;
|
||||
|
||||
.td,
|
||||
.th {
|
||||
box-sizing: border-box;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
color: #666;
|
||||
border-right: 1px solid $borderColor;
|
||||
border-bottom: 1px solid $borderColor;
|
||||
|
||||
&:first-child {
|
||||
border-left: 1px solid $borderColor;
|
||||
}
|
||||
}
|
||||
|
||||
.th {
|
||||
font-size: 24rpx;
|
||||
line-height: 34rpx;
|
||||
padding: 6rpx 0;
|
||||
border-top: 1px solid $borderColor;
|
||||
}
|
||||
|
||||
.td {
|
||||
font-size: 28rpx;
|
||||
line-height: 40rpx;
|
||||
padding: 16rpx 0;
|
||||
}
|
||||
|
||||
</style>
|
||||
21
src/index.template.html
Normal file
21
src/index.template.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||
<meta content="telephone=no" name="format-detection">
|
||||
|
||||
<title>转 WEB DEMO</title>
|
||||
<style>
|
||||
html, body, #app {height: 100%;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
<router-view></router-view>
|
||||
<script src="./index.js"></script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
21
src/mixins/test.js
Normal file
21
src/mixins/test.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import wepy from 'wepy'
|
||||
|
||||
export default class testMixin extends wepy.mixin {
|
||||
data = {
|
||||
mixin: 'This is mixin data.'
|
||||
}
|
||||
methods = {
|
||||
tap () {
|
||||
this.mixin = 'mixin data was changed'
|
||||
console.log('mixin method tap')
|
||||
}
|
||||
}
|
||||
|
||||
onShow() {
|
||||
console.log('mixin onShow')
|
||||
}
|
||||
|
||||
onLoad() {
|
||||
console.log('mixin onLoad')
|
||||
}
|
||||
}
|
||||
39
src/pages/index.wpy
Normal file
39
src/pages/index.wpy
Normal file
@@ -0,0 +1,39 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<table></table>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import wepy from 'wepy'
|
||||
import table from '../components/table'
|
||||
|
||||
export default class Index extends wepy.page {
|
||||
config = {
|
||||
navigationBarTitleText: 'test'
|
||||
}
|
||||
components = {
|
||||
table
|
||||
}
|
||||
|
||||
mixins = []
|
||||
|
||||
data = {
|
||||
}
|
||||
|
||||
computed = {
|
||||
}
|
||||
|
||||
methods = {
|
||||
|
||||
}
|
||||
|
||||
events = {
|
||||
|
||||
}
|
||||
|
||||
onLoad() {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
73
wepy.config.js
Normal file
73
wepy.config.js
Normal file
@@ -0,0 +1,73 @@
|
||||
const path = require('path')
|
||||
var prod = process.env.NODE_ENV === 'production'
|
||||
|
||||
module.exports = {
|
||||
wpyExt: '.wpy',
|
||||
eslint: true,
|
||||
cliLogs: !prod,
|
||||
build: {
|
||||
web: {
|
||||
htmlTemplate: path.join('src', 'index.template.html'),
|
||||
htmlOutput: path.join('web', 'index.html'),
|
||||
jsOutput: path.join('web', 'index.js')
|
||||
}
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
counter: path.join(__dirname, 'src/components/counter'),
|
||||
'@': path.join(__dirname, 'src')
|
||||
},
|
||||
aliasFields: ['wepy', 'weapp'],
|
||||
modules: ['node_modules']
|
||||
},
|
||||
compilers: {
|
||||
less: {
|
||||
compress: prod
|
||||
},
|
||||
sass: {
|
||||
outputStyle: 'compressed'
|
||||
},
|
||||
babel: {
|
||||
sourceMap: true,
|
||||
presets: [
|
||||
'env'
|
||||
],
|
||||
plugins: [
|
||||
'transform-class-properties',
|
||||
'transform-decorators-legacy',
|
||||
'transform-object-rest-spread',
|
||||
'transform-export-extensions'
|
||||
]
|
||||
}
|
||||
},
|
||||
plugins: {
|
||||
},
|
||||
appConfig: {
|
||||
noPromiseAPI: ['createSelectorQuery']
|
||||
}
|
||||
}
|
||||
|
||||
if (prod) {
|
||||
// 压缩sass
|
||||
// module.exports.compilers['sass'] = {outputStyle: 'compressed'}
|
||||
|
||||
// 压缩js
|
||||
module.exports.plugins = {
|
||||
uglifyjs: {
|
||||
filter: /\.js$/,
|
||||
config: {
|
||||
}
|
||||
},
|
||||
imagemin: {
|
||||
filter: /\.(jpg|png|jpeg)$/,
|
||||
config: {
|
||||
jpg: {
|
||||
quality: 80
|
||||
},
|
||||
png: {
|
||||
quality: 80
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user