1.需求

最近遇到一个需求,需要从一个页面跳到另一个页面的指定锚点,如果是页面上的锚点还简单,但是那个锚点在页面的组件里面。所以稍微研究了一下

2.跳转锚点的基本方式

2.1 页面内通过点击来跳转

即添加一个a标签,href以#开头,然后在需要跳转的地方添加一个element,id设置为a标签href属性相同的值,只是不要#,就可以了,这是最简单的方式

<a href="#miao">去找喵星人</a>
<h3 id="miao">喵星人基地</h3>

2.2 从A页面跳转到B页面的指定锚点(锚点就在页面上,不在子组件中)

我用的vue,所以在vue路由跳转时只要在path后面加上#锚点就可以了,比如我要跳到B页面id为miao的锚点,那么path=xxxx?#miao,当遇到query参数的情况,将#miao放到url的最后就行了,其他的也一样,反正只要把锚点放在url最后就行了,然后进行跳转即可

this.$router.push({
            path: `/detail?#miao`,
            query: {
              comment: `${commentId}`
            }
          })

注意:因为默认的vue单页使用的是hash模式,以#作为路由分割标识符,就会导致有歧义而无法正常达到需求,如果你又不想使用history模式,那么就使用2.3的方式,使用代码进行锚点跳转

2.3 直接使用代码进行锚点跳转

有的情况,只能使用代码进行锚点跳转,比如从一个页面跳到另一页面子组件内的指定锚点,这与2.2还是有区别的,我已经试过,如果锚点在子组件内,不在当前路由页面中,那么2.2的方式并不会起作用。解决方法:
将锚点作为query属性,或者其他的方式,将锚点的值传给B页面,然后B页面再通过props的方式传给他的子组件,最后在子组件中使用代码进行锚点跳转

// 这是传到组件中的数据
 props: {
      commentId: String
  }
  mounted () {
  // 判断commentId 是否有值,如果没有的话,就不进行跳转,我这里就用'null'来判断了,你们随意
  // document.querySelector用来获取element,有个坑,id值不能全为数字,否则报错,所以我在id值前面加了id,id格式大致是:id123456
  // scrollIntoView就是用来跳转到锚点的函数
        if (this.commentId !== 'null') {
          let inter = setInterval(() => {
            let target = document.querySelector(`#id${this.commentId}`)
            if (target) {
              clearInterval(time)
              target.scrollIntoView()
            }
          },100)
        }
    },