diff --git a/packages/waterfall/directive.js b/packages/waterfall/directive.js index f10b536ee..c25f53ea3 100644 --- a/packages/waterfall/directive.js +++ b/packages/waterfall/directive.js @@ -32,12 +32,16 @@ function doBindEvent() { function handleScrollEvent() { const element = this.el; const scrollEventTarget = this.scrollEventTarget; - // 已被禁止的滚动处理 if (this.disabled) return; const targetScrollTop = Utils.getScrollTop(scrollEventTarget); - const targetBottom = targetScrollTop + Utils.getVisibleHeight(scrollEventTarget); + const targetVisibleHeight = Utils.getVisibleHeight(scrollEventTarget); + // 滚动元素可视区域下边沿到滚动元素元素最顶上 距离 + const targetBottom = targetScrollTop + targetVisibleHeight; + + // 如果无元素高度,考虑为元素隐藏,直接返回 + if (!targetVisibleHeight) return; // 判断是否到了底 let needLoadMoreToLower = false; @@ -45,7 +49,7 @@ function handleScrollEvent() { needLoadMoreToLower = scrollEventTarget.scrollHeight - targetBottom < this.offset; } else { const elementBottom = Utils.getElementTop(element) - Utils.getElementTop(scrollEventTarget) + Utils.getVisibleHeight(element); - needLoadMoreToLower = elementBottom - Utils.getVisibleHeight(scrollEventTarget) < this.offset; + needLoadMoreToLower = elementBottom - targetVisibleHeight < this.offset; } if (needLoadMoreToLower) { this.cb['lower'] && this.cb['lower']({ target: scrollEventTarget, top: targetScrollTop }); diff --git a/packages/waterfall/index.js b/packages/waterfall/index.js index 02665b9a1..65761ea78 100644 --- a/packages/waterfall/index.js +++ b/packages/waterfall/index.js @@ -1,14 +1,9 @@ import Waterfall from './directive.js'; -import Vue from 'vue'; const install = function(Vue) { Vue.directive('WaterfallLower', Waterfall('lower')); Vue.directive('WaterfallUpper', Waterfall('upper')); }; -if (!Vue.prototype.$isServer) { - Vue.use(install); -} - Waterfall.install = install; export default Waterfall; diff --git a/test/unit/components/waterfall/waterfall-hide.vue b/test/unit/components/waterfall/waterfall-hide.vue new file mode 100644 index 000000000..72bd7d776 --- /dev/null +++ b/test/unit/components/waterfall/waterfall-hide.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/test/unit/get-webpack-conf.js b/test/unit/get-webpack-conf.js index d583169ad..1d7c19094 100644 --- a/test/unit/get-webpack-conf.js +++ b/test/unit/get-webpack-conf.js @@ -58,7 +58,10 @@ function getWebpackConfig(testFileName) { }, { test: /\.(css|pcss)$/, - use: ['style-loader', 'css-loader', 'postcss-loader'] + use: ['style-loader', 'css-loader', { + loader: 'postcss-loader', + options: { sourceMap: true } + }] }, { test: /\.(gif|png|jpe?g)(\?\S*)?$/, @@ -75,13 +78,16 @@ function getWebpackConfig(testFileName) { ] }, { - test: /test\/unit\/components\/.*\.vue$|packages\/swipe\/.*\.vue$/, + test: /test\/unit\/components\/.*\.vue$|packages\/swipe.*\.vue$/, use: [ { loader: 'vue-loader', options: { loaders: { - css: ['style-loader', 'css-loader', 'postcss-loader'] + css: ['style-loader', 'css-loader', { + loader: 'postcss-loader', + options: { sourceMap: true } + }] } } } @@ -89,13 +95,16 @@ function getWebpackConfig(testFileName) { }, { test: /packages\/.*\.vue$/, - exclude: /packages\/swipe\/.*\.vue$/, + exclude: /packages\/swipe.*\.vue$/, use: [ { loader: 'vue-loader', options: { loaders: { - css: ['style-loader', 'css-loader', 'postcss-loader'], + css: ['style-loader', 'css-loader', { + loader: 'postcss-loader', + options: { sourceMap: true } + }], js: ['isparta-loader'] } } diff --git a/test/unit/specs/waterfall.spec.js b/test/unit/specs/waterfall.spec.js index 9fa126a34..5c0295936 100644 --- a/test/unit/specs/waterfall.spec.js +++ b/test/unit/specs/waterfall.spec.js @@ -1,4 +1,5 @@ import Waterfall from '../components/waterfall/waterfall'; +import HiddenWaterfall from '../components/waterfall/waterfall-hide'; import { mount } from 'avoriaz'; describe('Waterfall', () => { @@ -69,4 +70,22 @@ describe('Waterfall', () => { done(); }, 500); }); + + it('test waterfall function after hide', (done) => { + const waterfallLowerSpy = sinon.spy(); + wrapper = mount(HiddenWaterfall, { + attachToDocument: true, + propsData: { + show: false, + disabled: false, + list: [{ id: 10 }], + onWaterfallLower: waterfallLowerSpy + } + }); + + setTimeout(() => { + expect(waterfallLowerSpy.called).to.be.false; + done(); + }, 500); + }); });