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> | ||||
|  | ||||
| <script> | ||||
| const padding = 15 // tag's padding | ||||
| const tagAndTagSpacing = 4 // tagAndTagSpacing | ||||
|  | ||||
| export default { | ||||
|   name: 'ScrollPane', | ||||
| @@ -20,18 +20,54 @@ export default { | ||||
|       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap | ||||
|       $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 | ||||
|     }, | ||||
|     moveToTarget($target) { | ||||
|     moveToTarget(currentTag) { | ||||
|       const $container = this.$refs.scrollContainer.$el | ||||
|       const $containerWidth = $container.offsetWidth | ||||
|       const $scrollWrapper = this.$refs.scrollContainer.$refs.wrap | ||||
|       const $targetLeft = $target.offsetLeft | ||||
|       const $targetWidth = $target.offsetWidth | ||||
|       if ($targetLeft > $containerWidth) { | ||||
|         // tag in the right | ||||
|         $scrollWrapper.scrollLeft = $targetLeft - $containerWidth + $targetWidth + padding | ||||
|       const tagList = this.$parent.$refs.tag | ||||
|  | ||||
|       let firstTag = null | ||||
|       let lastTag = null | ||||
|       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 { | ||||
|         // tag in the left | ||||
|         $scrollWrapper.scrollLeft = $targetLeft - padding | ||||
|             prevTag = tagList[i - 1] | ||||
|             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 | ||||
|       this.$nextTick(() => { | ||||
|         for (const tag of tags) { | ||||
|           if (tag.to.path === this.$route.path) { | ||||
|             this.$refs.scrollPane.moveToTarget(tag.$el) | ||||
|           if (tag.to === this.$route.fullPath) { | ||||
|             this.$refs.scrollPane.moveToTarget(tag) | ||||
|  | ||||
|             // when query is different then update | ||||
|             if (tag.to.fullPath !== this.$route.fullPath) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user