perf[tagsView]: refactor the moveToTarget function (#1195)
* fix[tagsView]:fixed visited view move to currentTag * edit the scroll regular friendly * tweak
This commit is contained in:
		| @@ -5,7 +5,7 @@ | |||||||
| </template> | </template> | ||||||
|  |  | ||||||
| <script> | <script> | ||||||
| const padding = 15 // tag's padding | const tagAndTagSpacing = 4 // tagAndTagSpacing | ||||||
|  |  | ||||||
| export default { | export default { | ||||||
|   name: 'ScrollPane', |   name: 'ScrollPane', | ||||||
| @@ -20,18 +20,54 @@ export default { | |||||||
|       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap |       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap | ||||||
|       $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 |       $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 | ||||||
|     }, |     }, | ||||||
|     moveToTarget($target) { |     moveToTarget(currentTag) { | ||||||
|       const $container = this.$refs.scrollContainer.$el |       const $container = this.$refs.scrollContainer.$el | ||||||
|       const $containerWidth = $container.offsetWidth |       const $containerWidth = $container.offsetWidth | ||||||
|       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap |       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap | ||||||
|       const $targetLeft = $target.offsetLeft |       const tagList = this.$parent.$refs.tag | ||||||
|       const $targetWidth = $target.offsetWidth |  | ||||||
|       if ($targetLeft > $containerWidth) { |       let firstTag = null | ||||||
|         // tag in the right |       let lastTag = null | ||||||
|         $scrollWrapper.scrollLeft = $targetLeft - $containerWidth + $targetWidth + padding |       let prevTag = null | ||||||
|  |       let nextTag = null | ||||||
|  |  | ||||||
|  |       // find first tag and last tag | ||||||
|  |       if (tagList.length > 0) { | ||||||
|  |         firstTag = tagList[0] | ||||||
|  |         lastTag = tagList[tagList.length - 1] | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // find preTag and nextTag | ||||||
|  |       for (let i = 0; i < tagList.length; i++) { | ||||||
|  |         if (tagList[i] === currentTag) { | ||||||
|  |           if (i === 0) { | ||||||
|  |             nextTag = tagList[i].length > 1 && tagList[i + 1] | ||||||
|  |           } else if (i === tagList.length - 1) { | ||||||
|  |             prevTag = tagList[i].length > 1 && tagList[i - 1] | ||||||
|           } else { |           } else { | ||||||
|         // tag in the left |             prevTag = tagList[i - 1] | ||||||
|         $scrollWrapper.scrollLeft = $targetLeft - padding |             nextTag = tagList[i + 1] | ||||||
|  |           } | ||||||
|  |           break | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       if (firstTag === currentTag) { | ||||||
|  |         $scrollWrapper.scrollLeft = 0 | ||||||
|  |       } else if (lastTag === currentTag) { | ||||||
|  |         $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth | ||||||
|  |       } else { | ||||||
|  |         // the tag's offsetLeft after of nextTag | ||||||
|  |         const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing | ||||||
|  |  | ||||||
|  |         // the tag's offsetLeft before of prevTag | ||||||
|  |         const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing | ||||||
|  |  | ||||||
|  |         if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { | ||||||
|  |           $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth | ||||||
|  |         } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { | ||||||
|  |           $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -75,8 +75,8 @@ export default { | |||||||
|       const tags = this.$refs.tag |       const tags = this.$refs.tag | ||||||
|       this.$nextTick(() => { |       this.$nextTick(() => { | ||||||
|         for (const tag of tags) { |         for (const tag of tags) { | ||||||
|           if (tag.to.path === this.$route.path) { |           if (tag.to === this.$route.fullPath) { | ||||||
|             this.$refs.scrollPane.moveToTarget(tag.$el) |             this.$refs.scrollPane.moveToTarget(tag) | ||||||
|  |  | ||||||
|             // when query is different then update |             // when query is different then update | ||||||
|             if (tag.to.fullPath !== this.$route.fullPath) { |             if (tag.to.fullPath !== this.$route.fullPath) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user