diff --git a/src/swipe-item/index.js b/src/swipe-item/index.js
index 7776fbf2f..987147418 100644
--- a/src/swipe-item/index.js
+++ b/src/swipe-item/index.js
@@ -8,8 +8,10 @@ const [createComponent, bem] = createNamespace('swipe-item');
export default createComponent({
setup(props, { slots }) {
+ let rendered;
const state = reactive({
offset: 0,
+ inited: false,
mounted: false,
});
@@ -29,7 +31,9 @@ export default createComponent({
});
const shouldRender = computed(() => {
- if (!parent.props.lazyRender) {
+ const { loop, lazyRender } = parent.props;
+
+ if (!lazyRender || rendered) {
return true;
}
@@ -40,10 +44,11 @@ export default createComponent({
const active = parent.activeIndicator.value;
const maxActive = parent.count.value - 1;
- const prevActive = active === 0 ? maxActive : active - 1;
- const nextActive = active === maxActive ? 0 : active + 1;
+ const prevActive = active === 0 && loop ? maxActive : active - 1;
+ const nextActive = active === maxActive && loop ? 0 : active + 1;
+ rendered = index.value >= prevActive && index.value <= nextActive;
- return index.value >= prevActive || index.value <= nextActive;
+ return rendered;
});
const setOffset = (offset) => {
diff --git a/src/swipe/test/index.legacy.js b/src/swipe/test/index.legacy.js
index ee5b1cb10..bf737c9fd 100644
--- a/src/swipe/test/index.legacy.js
+++ b/src/swipe/test/index.legacy.js
@@ -163,6 +163,7 @@ test('lazy-render prop', async () => {
2
3
4
+ 5
`,
data() {
@@ -175,26 +176,52 @@ test('lazy-render prop', async () => {
await later();
const items = wrapper.findAll('.van-swipe-item');
- expect(items.at(0).contains('span')).toBeTruthy();
- expect(items.at(1).contains('span')).toBeTruthy();
- expect(items.at(2).contains('span')).toBeFalsy();
- expect(items.at(3).contains('span')).toBeTruthy();
+ const expectRender = (results) => {
+ results.forEach((result, index) => {
+ expect(items.at(index).contains('span')).toEqual(result);
+ });
+ };
+
+ expectRender([true, true, false, false, true]);
wrapper.setData({ active: 1 });
- expect(items.at(0).contains('span')).toBeTruthy();
- expect(items.at(1).contains('span')).toBeTruthy();
- expect(items.at(2).contains('span')).toBeTruthy();
- expect(items.at(3).contains('span')).toBeFalsy();
+ expectRender([true, true, true, false, true]);
wrapper.setData({ active: 2 });
- expect(items.at(0).contains('span')).toBeFalsy();
- expect(items.at(1).contains('span')).toBeTruthy();
- expect(items.at(2).contains('span')).toBeTruthy();
- expect(items.at(3).contains('span')).toBeTruthy();
-
- wrapper.setData({ active: 3 });
- expect(items.at(0).contains('span')).toBeTruthy();
- expect(items.at(1).contains('span')).toBeFalsy();
- expect(items.at(2).contains('span')).toBeTruthy();
- expect(items.at(3).contains('span')).toBeTruthy();
+ expectRender([true, true, true, true, true]);
+});
+
+test('lazy-render prop when loop is false', async () => {
+ const wrapper = mount({
+ template: `
+
+ 1
+ 2
+ 3
+ 4
+
+ `,
+ data() {
+ return {
+ active: 0,
+ };
+ },
+ });
+
+ await later();
+ const items = wrapper.findAll('.van-swipe-item');
+
+ const expectRender = (results) => {
+ results.forEach((result, index) => {
+ expect(items.at(index).contains('span')).toEqual(result);
+ });
+ };
+
+ expectRender([true, true, false, false]);
+
+ wrapper.setData({ active: 1 });
+ expectRender([true, true, true, false]);
+
+ wrapper.setData({ active: 2 });
+ expectRender([true, true, true, true]);
});