diff --git a/docs/demos/index.js b/docs/demos/index.js index 9976b69d0..2403dd8a1 100644 --- a/docs/demos/index.js +++ b/docs/demos/index.js @@ -44,6 +44,7 @@ export default { 'image-preview': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/image-preview'), 'image-preview')), 'image-preview')), 'layout': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/layout'), 'layout')), 'layout')), 'lazyload': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/lazyload'), 'lazyload')), 'lazyload')), + 'list': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/list'), 'list')), 'list')), 'loading': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/loading'), 'loading')), 'loading')), 'nav-bar': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/nav-bar'), 'nav-bar')), 'nav-bar')), 'notice-bar': asyncWrapper(r => require.ensure([], () => r(componentWrapper(require('./views/notice-bar'), 'notice-bar')), 'notice-bar')), diff --git a/docs/demos/views/list.vue b/docs/demos/views/list.vue new file mode 100644 index 000000000..36f31ee20 --- /dev/null +++ b/docs/demos/views/list.vue @@ -0,0 +1,79 @@ + + + + {{ $t('text') }} + + + + + + + + + + + + diff --git a/docs/demos/views/waterfall.vue b/docs/demos/views/waterfall.vue index 3c63a8213..8e7972a25 100644 --- a/docs/demos/views/waterfall.vue +++ b/docs/demos/views/waterfall.vue @@ -1,5 +1,6 @@ + {{ $t('tips') }} {{ $t('text') }} + + +``` + +```js +export default { + data() { + return { + list: [], + loading: false, + finished: false + }; + }, + + methods: { + onLoad() { + setTimeout(() => { + for (let i = 0; i < 10; i++) { + this.list.push(this.list.length + 1); + } + this.loading = false; + + if (this.list.length >= 40) { + this.finished = true; + } + }, 500); + } + } +} +``` + +### API + +| Attribute | Description | Type | Default | Accepted Values | +|-----------|-----------|-----------|-------------|-------------| +| loading | Whether to show loading info,the `load` event will not be triggered when loading | `Boolean` | `false` | - | +| finished | Whether loading is finished,the `load` event will not be triggered when finished | `Boolean` | `false` | - | +| offset | The load event will be triggered when the distance between the scrollbar and the bottom is less than offset | `Number` | `300` | - | +| loading-text | Loading text | `String` | `Loading...` | - | +| immediate-check | Whether to check loading position immediately after mounted | `Boolean` | `true` | - | + +### Event + +| Event | Description | Arguments | +|-----------|-----------|-----------| +| load | Triggered when the distance between the scrollbar and the bottom is less than offset | - | diff --git a/docs/markdown/en-US/waterfall.md b/docs/markdown/en-US/waterfall.md index 94d4ce24e..5a5e71700 100644 --- a/docs/markdown/en-US/waterfall.md +++ b/docs/markdown/en-US/waterfall.md @@ -1,4 +1,5 @@ ## Waterfall +Note: Waterfall is deprecated and no longer maintained, please use the [List](#/zh-CN/list) component instead. ### Install diff --git a/docs/markdown/index.js b/docs/markdown/index.js index 17f923054..76f0fb952 100644 --- a/docs/markdown/index.js +++ b/docs/markdown/index.js @@ -40,6 +40,7 @@ export default { 'zh-CN/intro': wrapper(r => require.ensure([], () => r(require('./zh-CN/intro.md')), 'zh-CN/intro')), 'zh-CN/layout': wrapper(r => require.ensure([], () => r(require('./zh-CN/layout.md')), 'zh-CN/layout')), 'zh-CN/lazyload': wrapper(r => require.ensure([], () => r(require('./zh-CN/lazyload.md')), 'zh-CN/lazyload')), + 'zh-CN/list': wrapper(r => require.ensure([], () => r(require('./zh-CN/list.md')), 'zh-CN/list')), 'zh-CN/loading': wrapper(r => require.ensure([], () => r(require('./zh-CN/loading.md')), 'zh-CN/loading')), 'zh-CN/nav-bar': wrapper(r => require.ensure([], () => r(require('./zh-CN/nav-bar.md')), 'zh-CN/nav-bar')), 'zh-CN/notice-bar': wrapper(r => require.ensure([], () => r(require('./zh-CN/notice-bar.md')), 'zh-CN/notice-bar')), @@ -95,6 +96,7 @@ export default { 'en-US/intro': wrapper(r => require.ensure([], () => r(require('./en-US/intro.md')), 'en-US/intro')), 'en-US/layout': wrapper(r => require.ensure([], () => r(require('./en-US/layout.md')), 'en-US/layout')), 'en-US/lazyload': wrapper(r => require.ensure([], () => r(require('./en-US/lazyload.md')), 'en-US/lazyload')), + 'en-US/list': wrapper(r => require.ensure([], () => r(require('./en-US/list.md')), 'en-US/list')), 'en-US/loading': wrapper(r => require.ensure([], () => r(require('./en-US/loading.md')), 'en-US/loading')), 'en-US/nav-bar': wrapper(r => require.ensure([], () => r(require('./en-US/nav-bar.md')), 'en-US/nav-bar')), 'en-US/notice-bar': wrapper(r => require.ensure([], () => r(require('./en-US/notice-bar.md')), 'en-US/notice-bar')), diff --git a/docs/markdown/zh-CN/list.md b/docs/markdown/zh-CN/list.md new file mode 100644 index 000000000..85847f1dd --- /dev/null +++ b/docs/markdown/zh-CN/list.md @@ -0,0 +1,66 @@ +## List 列表 +瀑布流滚动加载,用于控制长列表的展示 + +### 使用指南 +``` javascript +import { List } from 'vant'; + +Vue.use(List); +``` + +### 代码演示 + +#### 基础用法 + +```html + + + +``` + +```js +export default { + data() { + return { + list: [], + loading: false, + finished: false + }; + }, + + methods: { + onLoad() { + setTimeout(() => { + for (let i = 0; i < 10; i++) { + this.list.push(this.list.length + 1); + } + this.loading = false; + + if (this.list.length >= 40) { + this.finished = true; + } + }, 500); + } + } +} +``` + +### API + +| 参数 | 说明 | 类型 | 默认值 | 可选值 | +|-----------|-----------|-----------|-------------|-------------| +| loading | 是否显示加载中提示,加载过程中不触发`load`事件 | `Boolean` | `false` | - | +| finished | 是否已加载完成,加载完成后不再触发`load`事件 | `Boolean` | `false` | - | +| offset | 滚动条与底部距离小于 offset 时触发`load`事件 | `Number` | `300` | - | +| loading-text | 加载中提示文案 | `String` | `加载中...` | - | +| immediate-check | 是否在初始化时立即执行滚动位置检查 | `Boolean` | `true` | - | + +### Event + +| 事件名 | 说明 | 参数 | +|-----------|-----------|-----------| +| load | 滚动条与底部距离小于 offset 时触发 | - | diff --git a/docs/markdown/zh-CN/loading.md b/docs/markdown/zh-CN/loading.md index b60c9da49..8d4b5a9b1 100644 --- a/docs/markdown/zh-CN/loading.md +++ b/docs/markdown/zh-CN/loading.md @@ -34,6 +34,6 @@ Vue.use(Loading); | 参数 | 说明 | 类型 | 默认值 | 可选值 | |-----------|-----------|-----------|-------------|-------------| -| color | 颜色 | `String` | `black` | `black` `white` | +| color | 颜色 | `String` | `black` | `white` | | type | 类型 | `String` | `circular` | `spinner` `circle` | | size | 大小 | `String` | `30px` | - | diff --git a/docs/markdown/zh-CN/waterfall.md b/docs/markdown/zh-CN/waterfall.md index 3d400f3e2..a6bd9075f 100644 --- a/docs/markdown/zh-CN/waterfall.md +++ b/docs/markdown/zh-CN/waterfall.md @@ -1,4 +1,5 @@ ## Waterfall 瀑布流 +注意:Waterfall 组件已被废弃且不再维护,请使用 [List](#/zh-CN/list) 组件代替 ### 使用指南 @@ -78,4 +79,3 @@ export default { | v-waterfall-upper | 滚动到顶部, 触发执行的函数 | `Function` | - | - | | waterfall-disabled | 在 vue 对象中表示是否禁止瀑布流触发的 key 值 | `String` | - | - | | waterfall-offset | 触发瀑布流加载的阈值 | `Number` | `300` | - | - diff --git a/docs/src/WapApp.vue b/docs/src/WapApp.vue index 62f238c72..321bb6170 100644 --- a/docs/src/WapApp.vue +++ b/docs/src/WapApp.vue @@ -7,7 +7,9 @@ left-arrow @click-left="onBack" /> - + + + diff --git a/docs/src/doc.config.js b/docs/src/doc.config.js index 334e3d7f9..ab0d46bfb 100644 --- a/docs/src/doc.config.js +++ b/docs/src/doc.config.js @@ -104,6 +104,10 @@ module.exports = { path: '/lazyload', title: 'Lazyload - 图片懒加载' }, + { + path: '/list', + title: 'List - 列表' + }, { path: '/loading', title: 'Loading - 加载' @@ -394,6 +398,10 @@ module.exports = { path: '/lazyload', title: 'Lazyload' }, + { + path: '/list', + title: 'List' + }, { path: '/loading', title: 'Loading' diff --git a/package.json b/package.json index 9d33e151e..cd5b447e1 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "license": "MIT", "dependencies": { "babel-runtime": "6.x", - "vue-lazyload": "^1.2.1" + "vue-lazyload": "^1.2.2" }, "peerDependencies": { "vue": ">= 2.5.0" @@ -54,7 +54,7 @@ "avoriaz": "2.0.0", "babel-cli": "^6.26.0", "babel-core": "^6.26.0", - "babel-loader": "^7.1.3", + "babel-loader": "^7.1.4", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-plugin-transform-runtime": "^6.15.0", "babel-polyfill": "^6.26.0", @@ -71,7 +71,7 @@ "fast-vue-md-loader": "^1.0.3", "friendly-errors-webpack-plugin": "^1.6.1", "gh-pages": "^1.0.0", - "html-webpack-plugin": "^3.0.4", + "html-webpack-plugin": "^3.0.6", "isparta-loader": "^2.0.0", "karma": "^1.7.1", "karma-chrome-launcher": "^2.2.0", @@ -92,16 +92,16 @@ "shelljs": "^0.8.1", "sinon": "^2.4.1", "sinon-chai": "^2.12.0", - "style-loader": "^0.20.2", + "style-loader": "^0.20.3", "uppercamelcase": "^3.0.0", "url-loader": "^1.0.1", "vant-doc": "1.0.4", - "vue": "^2.5.13", - "vue-loader": "^14.1.1", + "vue": "^2.5.15", + "vue-loader": "^14.2.1", "vue-router": "^3.0.1", "vue-sfc-compiler": "^0.0.8", "vue-style-loader": "^4.0.2", - "vue-template-compiler": "^2.5.13", + "vue-template-compiler": "^2.5.15", "vue-template-es2015-compiler": "^1.6.0", "webpack": "^3.11.0", "webpack-dev-server": "2.11.1", diff --git a/packages/index.js b/packages/index.js index 8930ee40d..1fc0b9a57 100644 --- a/packages/index.js +++ b/packages/index.js @@ -30,6 +30,7 @@ import GoodsActionMiniBtn from './goods-action-mini-btn'; import Icon from './icon'; import ImagePreview from './image-preview'; import Lazyload from './lazyload'; +import List from './list'; import Loading from './loading'; import Locale from './locale'; import NavBar from './nav-bar'; @@ -96,6 +97,7 @@ const components = [ GoodsActionBigBtn, GoodsActionMiniBtn, Icon, + List, Loading, NavBar, NoticeBar, @@ -173,6 +175,7 @@ export { Icon, ImagePreview, Lazyload, + List, Loading, Locale, NavBar, diff --git a/packages/list/index.vue b/packages/list/index.vue new file mode 100644 index 000000000..8b3d085b1 --- /dev/null +++ b/packages/list/index.vue @@ -0,0 +1,118 @@ + + + + + + + {{ $t('loadingTip') }} + + + + + + diff --git a/packages/locale/lang/en-US.js b/packages/locale/lang/en-US.js index d3fe13f4c..c99646601 100644 --- a/packages/locale/lang/en-US.js +++ b/packages/locale/lang/en-US.js @@ -3,6 +3,7 @@ export default { cancel: 'Cancel', save: 'Save', complete: 'Complete', + loadingTip: 'Loading...', vanContactCard: { name: 'Name', tel: 'Phone', @@ -31,8 +32,7 @@ export default { }, vanPullRefresh: { pullingText: 'Pull to refresh...', - loosingText: 'Loose to refresh...', - loadingText: 'Loading...' + loosingText: 'Loose to refresh...' }, vanSubmitBar: { label: 'Total:' diff --git a/packages/locale/lang/zh-CN.js b/packages/locale/lang/zh-CN.js index 582b3c79a..6fc73ab27 100644 --- a/packages/locale/lang/zh-CN.js +++ b/packages/locale/lang/zh-CN.js @@ -3,6 +3,7 @@ export default { cancel: '取消', save: '保存', complete: '完成', + loadingTip: '加载中...', vanContactCard: { name: '联系人', tel: '联系电话', @@ -34,8 +35,7 @@ export default { }, vanPullRefresh: { pullingText: '下拉即可刷新...', - loosingText: '释放即可刷新...', - loadingText: '加载中...' + loosingText: '释放即可刷新...' }, vanSubmitBar: { label: '合计:' diff --git a/packages/pull-refresh/index.vue b/packages/pull-refresh/index.vue index 72c1a00d1..c895dcd36 100644 --- a/packages/pull-refresh/index.vue +++ b/packages/pull-refresh/index.vue @@ -19,7 +19,7 @@ - {{ loadingText || $t('loadingText') }} + {{ loadingText || $t('loadingTip') }} diff --git a/packages/vant-css/src/index.css b/packages/vant-css/src/index.css index e66642101..6cd288e97 100644 --- a/packages/vant-css/src/index.css +++ b/packages/vant-css/src/index.css @@ -4,17 +4,18 @@ /* base */ @import './base.css'; +@import './icon.css'; +@import './loading.css'; +@import './button.css'; +@import './cell.css'; /* common components */ -@import './icon.css'; @import './col.css'; @import './row.css'; @import './badge.css'; -@import './button.css'; -@import './cell.css'; @import './circle.css'; @import './collapse.css'; -@import './loading.css'; +@import './list.css'; @import './nav-bar.css'; @import './notice-bar.css'; @import './popup.css'; diff --git a/packages/vant-css/src/list.css b/packages/vant-css/src/list.css new file mode 100644 index 000000000..81a15fd20 --- /dev/null +++ b/packages/vant-css/src/list.css @@ -0,0 +1,25 @@ +@import './common/var.css'; + +.van-list { + &__loading { + text-align: center; + + .van-loading, + &-text { + display: inline-block; + vertical-align: middle; + } + + .van-loading { + width: 16px; + height: 16px; + margin-right: 5px; + } + + &-text { + font-size: 13px; + color: $gray-dark; + line-height: 50px; + } + } +} diff --git a/packages/vant-css/src/pull-refresh.css b/packages/vant-css/src/pull-refresh.css index 4b8833e66..d903d42b4 100644 --- a/packages/vant-css/src/pull-refresh.css +++ b/packages/vant-css/src/pull-refresh.css @@ -25,13 +25,13 @@ .van-loading { width: 16px; height: 16px; - display: inline-block; - margin-right: 10px; + margin-right: 5px; } span, .van-loading { vertical-align: middle; + display: inline-block; } } diff --git a/test/specs/list.spec.js b/test/specs/list.spec.js new file mode 100644 index 000000000..548c96a9c --- /dev/null +++ b/test/specs/list.spec.js @@ -0,0 +1,68 @@ +import List from 'packages/list'; +import { mount } from 'avoriaz'; + +describe('List', () => { + let wrapper; + + afterEach(() => { + wrapper && wrapper.destroy(); + }); + + it('load event', done => { + wrapper = mount(List); + + const spy = sinon.spy(); + wrapper.vm.$on('load', spy); + wrapper.vm.$on('input', val => { + wrapper.vm.loading = val; + }); + + expect(spy.calledOnce).to.be.false; + wrapper.vm.$nextTick(() => { + expect(spy.calledOnce).to.be.true; + done(); + }); + }); + + it('finished', done => { + wrapper = mount(List, { + propsData: { + finished: true + } + }); + + const spy = sinon.spy(); + wrapper.vm.$on('load', spy); + + wrapper.vm.$nextTick(() => { + expect(spy.calledOnce).to.be.false; + + wrapper.vm.finished = false; + + setTimeout(() => { + expect(spy.calledOnce).to.be.true; + done(); + }, 50); + }); + }); + + it('immediate check false', done => { + wrapper = mount(List, { + propsData: { + immediateCheck: false + } + }); + + const spy = sinon.spy(); + wrapper.vm.$on('load', spy); + wrapper.vm.$on('input', val => { + wrapper.vm.loading = val; + }); + + expect(spy.calledOnce).to.be.false; + wrapper.vm.$nextTick(() => { + expect(spy.calledOnce).to.be.false; + done(); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index d7dd16644..f9747a923 100644 --- a/yarn.lock +++ b/yarn.lock @@ -507,9 +507,9 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-loader@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.3.tgz#ff5b440da716e9153abb946251a9ab7670037b16" +babel-loader@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" @@ -3325,9 +3325,9 @@ html-minifier@^3.2.3: relateurl "0.2.x" uglify-js "3.3.x" -html-webpack-plugin@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.0.4.tgz#498c10f40f99a339fbf3d87c5a80acf8cbea8e9b" +html-webpack-plugin@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.0.6.tgz#d35b0452aae129a8a9f3fac44a169a625d8cf3fa" dependencies: html-minifier "^3.2.3" loader-utils "^0.2.16" @@ -6149,6 +6149,13 @@ schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.3: ajv "^5.0.0" ajv-keywords "^2.1.0" +schema-utils@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -6641,12 +6648,12 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -style-loader@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.2.tgz#851b373c187890331776e9cde359eea9c95ecd00" +style-loader@^0.20.3: + version "0.20.3" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.20.3.tgz#ebef06b89dec491bcb1fdb3452e913a6fd1c10c4" dependencies: loader-utils "^1.1.0" - schema-utils "^0.4.3" + schema-utils "^0.4.5" stylus-lookup@^1.0.1: version "1.0.2" @@ -7151,13 +7158,13 @@ vue-hot-reload-api@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.4.tgz#683bd1d026c0d3b3c937d5875679e9a87ec6cd8f" -vue-lazyload@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vue-lazyload/-/vue-lazyload-1.2.1.tgz#baa7356bdc1483777fd16007fbe2dddc16e98298" +vue-lazyload@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/vue-lazyload/-/vue-lazyload-1.2.2.tgz#73335ed32db25264f5957df1a21d277823423743" -vue-loader@^14.1.1: - version "14.1.1" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-14.1.1.tgz#331f197fcea790d6b8662c29b850806e7eb29342" +vue-loader@^14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-14.2.1.tgz#3ace19f98187b1fa9e0709defa963a0a2396b6b3" dependencies: consolidate "^0.14.0" hash-sum "^1.0.2" @@ -7197,9 +7204,9 @@ vue-style-loader@^4.0.2: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.5.13: - version "2.5.13" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.13.tgz#12a2aa0ecd6158ac5e5f14d294b0993f399c3d38" +vue-template-compiler@^2.5.15: + version "2.5.15" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.15.tgz#cc004097e37167be8b85ea22ab2840d8e8cca1c0" dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -7208,9 +7215,9 @@ vue-template-es2015-compiler@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" -vue@^2.5.13: - version "2.5.13" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.13.tgz#95bd31e20efcf7a7f39239c9aa6787ce8cf578e1" +vue@^2.5.15: + version "2.5.15" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.15.tgz#fdb67861dde967cd8d1b53116380f2f269b45202" watchpack@^1.4.0: version "1.4.0"
{{ $t('text') }}