Commit 8fe474b951718fbf3cba414f676d13dbd9b78037
Committed by
GitHub
Merge pull request #3992 from lison16/anchor
解决anchor组件在页面没有点击锚点时报错的问题
Showing
5 changed files
with
21 additions
and
15 deletions
Show diff stats
examples/routers/anchor.vue
| ... | ... | @@ -7,6 +7,7 @@ |
| 7 | 7 | <AnchorLink v-if="(link - 1) % 30 === 0" v-for="link in 300" :key="`link${link}`" :href="`#title-${link}`" :title="`title-${link}`"> |
| 8 | 8 | <AnchorLink v-if="link === 61" href="#title-child-69" title="title-child-69"/> |
| 9 | 9 | </AnchorLink> |
| 10 | + <AnchorLink href="#lishi" title="李氏专跳"/> | |
| 10 | 11 | <AnchorLink v-if="showNewLink" href="#new-link" title="这是动态添加的连接"/> |
| 11 | 12 | </Anchor> |
| 12 | 13 | </div> |
| ... | ... | @@ -32,6 +33,8 @@ |
| 32 | 33 | </Panel> |
| 33 | 34 | </Collapse> |
| 34 | 35 | </template> |
| 36 | + <h1 id="lishi">李氏专跳</h1> | |
| 37 | + <p v-for="i in 100" :key="`chinese-${i}`">这是信息司大是大非胜多负少的{{i}}</p> | |
| 35 | 38 | <!-- <h1 id="new-link">这是新添加的哦哦哦哦哦 哦 </h1> |
| 36 | 39 | <p v-for="i in 50" :key="`new-${i}`">这是信息司大是大非胜多负少的{{i}}</p> --> |
| 37 | 40 | </div> |
| ... | ... | @@ -58,6 +61,8 @@ |
| 58 | 61 | </template> |
| 59 | 62 | <h1 id="new-link">这是新添加的哦哦哦哦哦 哦 </h1> |
| 60 | 63 | <p v-for="i in 50" :key="`new-${i}`">这是信息司大是大非胜多负少的{{i}}</p> |
| 64 | + <h1 id="lishi">李氏专跳</h1> | |
| 65 | + <p v-for="i in 50" :key="`chinese-${i}`">这是信息司大是大非胜多负少的{{i}}</p> | |
| 61 | 66 | </div> |
| 62 | 67 | |
| 63 | 68 | </div> | ... | ... |
src/components/anchor/anchor-link.vue
| ... | ... | @@ -32,7 +32,14 @@ export default { |
| 32 | 32 | }, |
| 33 | 33 | methods: { |
| 34 | 34 | goAnchor () { |
| 35 | - this.anchorCom.turnTo(this.href); | |
| 35 | + this.currentLink = this.href; | |
| 36 | + this.anchorCom.$emit('on-select', this.href); | |
| 37 | + const isRoute = this.$router; | |
| 38 | + if (isRoute) { | |
| 39 | + this.$router.push(this.href); | |
| 40 | + } else { | |
| 41 | + window.location.href = this.href; | |
| 42 | + } | |
| 36 | 43 | } |
| 37 | 44 | }, |
| 38 | 45 | mounted () { | ... | ... |
src/components/anchor/anchor.vue
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | </component> |
| 12 | 12 | </template> |
| 13 | 13 | <script> |
| 14 | -import { scrollTop, findComponentDownward, findComponentsDownward, sharpMatcherRegx } from '../../utils/assist'; | |
| 14 | +import { scrollTop, findComponentsDownward, sharpMatcherRegx } from '../../utils/assist'; | |
| 15 | 15 | import { on, off } from '../../utils/dom'; |
| 16 | 16 | export default { |
| 17 | 17 | name: 'Anchor', |
| ... | ... | @@ -25,7 +25,6 @@ export default { |
| 25 | 25 | prefix: 'ivu-anchor', |
| 26 | 26 | isAffixed: false, // current affixed state |
| 27 | 27 | inkTop: 0, |
| 28 | - linkHeight: 0, | |
| 29 | 28 | animating: false, // if is scrolling now |
| 30 | 29 | currentLink: '', // current show link => #href -> currentLink = #href |
| 31 | 30 | currentId: '', // current show title id => #href -> currentId = href |
| ... | ... | @@ -83,16 +82,10 @@ export default { |
| 83 | 82 | const scrollTop = document.documentElement.scrollTop || document.body.scrollTop || e.target.scrollTop; |
| 84 | 83 | this.getCurrentScrollAtTitleId(scrollTop); |
| 85 | 84 | }, |
| 86 | - turnTo (href) { | |
| 87 | - this.currentLink = href; | |
| 88 | - this.$router.push({ | |
| 89 | - path: href | |
| 90 | - }); | |
| 91 | - this.$emit('on-select', href); | |
| 92 | - }, | |
| 93 | 85 | handleHashChange () { |
| 94 | 86 | const url = window.location.href; |
| 95 | 87 | const sharpLinkMatch = sharpMatcherRegx.exec(url); |
| 88 | + if (!sharpLinkMatch) return; | |
| 96 | 89 | this.currentLink = sharpLinkMatch[0]; |
| 97 | 90 | this.currentId = sharpLinkMatch[1]; |
| 98 | 91 | }, |
| ... | ... | @@ -158,8 +151,7 @@ export default { |
| 158 | 151 | off(window, 'hashchange', this.handleHashChange); |
| 159 | 152 | }, |
| 160 | 153 | init () { |
| 161 | - const anchorLink = findComponentDownward(this, 'AnchorLink'); | |
| 162 | - this.linkHeight = anchorLink ? anchorLink.$el.getBoundingClientRect().height : 0; | |
| 154 | + // const anchorLink = findComponentDownward(this, 'AnchorLink'); | |
| 163 | 155 | this.handleHashChange(); |
| 164 | 156 | this.$nextTick(() => { |
| 165 | 157 | this.removeListener(); |
| ... | ... | @@ -177,7 +169,9 @@ export default { |
| 177 | 169 | watch: { |
| 178 | 170 | '$route' () { |
| 179 | 171 | this.handleHashChange(); |
| 180 | - this.handleScrollTo(); | |
| 172 | + this.$nextTick(() => { | |
| 173 | + this.handleScrollTo(); | |
| 174 | + }); | |
| 181 | 175 | }, |
| 182 | 176 | container () { |
| 183 | 177 | this.init(); | ... | ... |
src/mixins/link.js