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:
parent
4cdcbee0d6
commit
27772946c2
|
@ -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 {
|
||||||
|
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 {
|
} else {
|
||||||
// tag in the left
|
// the tag's offsetLeft after of nextTag
|
||||||
$scrollWrapper.scrollLeft = $targetLeft - padding
|
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) {
|
||||||
|
|
Loading…
Reference in New Issue