From d992cbefbd9a0f76bee70bf604df7d377a08e97c Mon Sep 17 00:00:00 2001 From: ilikethese Date: Wed, 23 Dec 2020 23:11:56 +0800 Subject: [PATCH] fix(hippy-vue,hippy-react): compatible loadMore and endReached event (#429) * fix(hippy-react,hippy-vue): compatible loadMore and endReached event Android only support loadMore event in listview but ios support endReached event. Compatible loadMore and endReached event in hippy-vue and hippy-react. * feat(hippy-vue): add unit test for pollyfill event Co-authored-by: Zoom Chan --- .../hippy-react/src/components/list-view.tsx | 4 +++ .../renderer/__tests__/element-node.test.js | 29 +++++++++++++++++++ .../hippy-vue/src/renderer/element-node.js | 12 ++++++++ packages/hippy-vue/src/renderer/list-node.js | 23 ++++++++++++++- 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/packages/hippy-react/src/components/list-view.tsx b/packages/hippy-react/src/components/list-view.tsx index bdb717573..1c09e854a 100644 --- a/packages/hippy-react/src/components/list-view.tsx +++ b/packages/hippy-react/src/components/list-view.tsx @@ -406,6 +406,10 @@ class ListView extends React.Component { }; } + if (!nativeProps.onLoadMore && nativeProps.onEndReached) { + nativeProps.onLoadMore = nativeProps.onEndReached; + } + return (
    { this.instance = ref; }} diff --git a/packages/hippy-vue/src/renderer/__tests__/element-node.test.js b/packages/hippy-vue/src/renderer/__tests__/element-node.test.js index 3b9353a41..29f8565fb 100644 --- a/packages/hippy-vue/src/renderer/__tests__/element-node.test.js +++ b/packages/hippy-vue/src/renderer/__tests__/element-node.test.js @@ -6,6 +6,7 @@ import test from 'ava'; import ElementNode from '../element-node'; import DocumentNode from '../document-node'; +import ListNode from '../list-node'; test.before(() => { global.__GLOBAL__ = { @@ -178,3 +179,31 @@ test('Element.setStyle with pre-processed style test', (t) => { t.is(node.style.backgroundCol, 'whi'); t.is(node.style.wid, 100); }); + +test('Element.dispatchEvent with pollyfill event', (t) => { + const node = new ListNode('ul'); + let called = false; + const callback = (event) => { + called = true; + return event; + }; + + t.is(called, false); + t.is(node._emitter, null); + t.is(node.removeEventListener('loadMore', callback), null); + node.addEventListener('loadMore', callback); + t.true(!!node._emitter); + let event = DocumentNode.createEvent('loadMore'); + node.dispatchEvent(event); + t.is(called, true); + node.removeEventListener('loadMore', callback); + t.true(!!node._emitter); + + called = false; + t.is(called, false); + node.addEventListener('endReached', callback); + event = DocumentNode.createEvent('loadMore'); + node.dispatchEvent(event); + t.is(called, true); + node.removeEventListener('endReached', callback); +}); diff --git a/packages/hippy-vue/src/renderer/element-node.js b/packages/hippy-vue/src/renderer/element-node.js index 14c6c4288..fbc059d66 100644 --- a/packages/hippy-vue/src/renderer/element-node.js +++ b/packages/hippy-vue/src/renderer/element-node.js @@ -66,6 +66,9 @@ class ElementNode extends ViewNode { return this._meta; } + get emitter() { + return this._emitter; + } hasAttribute(key) { return !!this.attributes[key]; @@ -283,6 +286,10 @@ class ElementNode extends ViewNode { } } + if (this.polyFillNativeEvents) { + this.polyFillNativeEvents('addEvent', eventNames, callback, options); + } + updateChild(this); } @@ -290,6 +297,11 @@ class ElementNode extends ViewNode { if (!this._emitter) { return null; } + + if (this.polyFillNativeEvents) { + this.polyFillNativeEvents('removeEvent', eventNames, callback, options); + } + return this._emitter.removeEventListener(eventNames, callback, options); } diff --git a/packages/hippy-vue/src/renderer/list-node.js b/packages/hippy-vue/src/renderer/list-node.js index 61089cdb6..12cedbcd4 100644 --- a/packages/hippy-vue/src/renderer/list-node.js +++ b/packages/hippy-vue/src/renderer/list-node.js @@ -18,12 +18,33 @@ class ListNode extends ElementNode { /** * Scroll children to specific position. */ - scrollToPosition(posX = 0, posY = 0, needAnimation = true) { + scrollToPosition(posX = 0, posY = 0, needAnimation = true) { if (typeof posX !== 'number' || typeof posY !== 'number') { return; } Native.callUIFunction(this, 'scrollToContentOffset', [posX, posY, needAnimation]); } + + /** + * Poly fill native event + */ + polyFillNativeEvents(method, eventNames, callback, options) { + if (method === 'addEvent') { + if (eventNames === 'endReached' || eventNames === 'loadMore') { + const name = eventNames === 'endReached' ? 'loadMore' : 'endReached'; + if (this.emitter) { + this.emitter.addEventListener(name, callback, options); + } + } + } else if (method === 'removeEvent') { + if (eventNames === 'endReached' || eventNames === 'loadMore') { + const name = eventNames === 'endReached' ? 'loadMore' : 'endReached'; + if (this.emitter) { + this.emitter.removeEventListener(name, callback, options); + } + } + } + } } export default ListNode;