自定义锚点组件解决在路由为哈希模式下使用antd的anchor组件存在的问题

自定义锚点组件解决在路由为哈希模式下使用antd的anchor组件存在的问题

antd的anchor组件通过修改URL来定位锚点跳转位置,而单页应用中如果使用哈希模式的路由,会导致当前路由没有定义而出现页面空白。

解决方案1——重写antd组件的点击事件

 const handleClick: AnchorProps['onClick'] = (e, link) => {
   e.preventDefault();
   var srcolls = document.getElementById(link.href);
   srcolls.scrollIntoView({block: 'start', behavior: 'smooth'});
 };

解决方案2——自定义组件

话不多说,直接上demo,整个全新的

<template>
  <div>
    <div class="anchor-position">
      <div
        v-for="(item, index) in anchorList"
        :key="index"
        @click="jumpTo(item.id)"
        :class="item.class"
      >
        {{ item.name }}
      </div>
    </div>
    <div id="client" style="height: 500px">客户端 / Delivery</div>
    <div id="message" style="height: 500px">报文</div>
    <div id="session" style="height: 500px">会话</div>
    <div id="api" style="height: 500px">API</div>
  </div>
</template>
<script lang="ts">
  import { defineComponent, ref } from 'vue';
  interface anchorListParams {
    name: string;
    id: string;
    class: string;
  }
  export default defineComponent({
    name: 'Measure',
    components: {},
    setup() {
      const anchorList = ref<anchorListParams[]>([
        {
          id: 'client',
          name: '客户端 / Delivery',
          class: 'anchor-item',
        },
        {
          id: 'message',
          name: '报文',
          class: 'anchor-item',
        },
        {
          id: 'session',
          name: '会话',
          class: 'anchor-item',
        },
        {
          id: 'api',
          name: 'API',
          class: 'anchor-item',
        },
        {
          id: 'number',
          name: '消息数',
          class: 'anchor-item',
        },
        {
          id: 'flow',
          name: '流量收发(字节)',
          class: 'anchor-item',
        },
      ]);
      const jumpTo = (id: string) => {
        anchorList.value.forEach((item: anchorListParams) => {
          item.class = 'anchor-item';
          if (item.id === id) item.class = 'anchor-item item-click';
        });
        let srcolls = document.getElementById(id);
        srcolls?.scrollIntoView({ block: 'start', behavior: 'smooth' });
      };
      return {
        anchorList,
        jumpTo,
      };
    },
  });
</script>
<style scoped lang="less">
  .anchor-position {
    position: fixed;
    right: 35px;
    top: 347px;
    width: 125px;
    border-left: 2px solid #d1deed;
    .anchor-item {
      margin: 7px 0;
      display: flex;
      align-items: center;
      padding-left: 14px;
      cursor: pointer;
      &:hover {
        background: rgba(213, 234, 255, 0.66);
      }
    }
    .item-click {
      color: #2896ff;
      border-left: 4px solid #2896ff;
    }
  }
</style>
要实现antd anchor根据当前浏览器搜索栏中的id自动跳到当前页面相应id位置,你可以使用React Router的HashRouter组件antdAnchor组件相结合,再结合useEffect和useRef钩子函数来实现。具体实现步骤如下: 1. 在React Router的HashRouter组件中包裹需要跳转的页面内容,并将需要跳转的页面内容的id作为路由哈希值。 2. 在antdAnchor组件使用Link组件,并设置href属性为需要跳转的页面内容的id。 3. 在antdAnchor组件中设置Target属性为需要跳转的页面内容的id。 4. 在页面组件使用useRef钩子函数来获取需要跳转的页面内容的DOM节点。 5. 在页面组件使用useEffect钩子函数来监听浏览器搜索栏中的id变化,并根据变化自动跳转到相应的位置。 示例代码如下: ``` import { Anchor } from 'antd'; import { HashRouter, Route, useLocation } from 'react-router-dom'; import { useEffect, useRef } from 'react'; const { Link } = Anchor; function App() { const location = useLocation(); const sectionRef = useRef({}); useEffect(() => { const id = location.hash.slice(1); const section = sectionRef.current[id]; if (section) { section.scrollIntoView(); } }, [location.hash]); return ( <HashRouter> <Anchor targetOffset="64"> <Link href="#section1" title="Section 1" /> <Link href="#section2" title="Section 2" /> <Link href="#section3" title="Section 3" /> </Anchor> <div ref={(el) => sectionRef.current['section1'] = el} id="section1"> // Section 1 content </div> <div ref={(el) => sectionRef.current['section2'] = el} id="section2"> // Section 2 content </div> <div ref={(el) => sectionRef.current['section3'] = el} id="section3"> // Section 3 content </div> </HashRouter> ); } ``` 在这个例子中,当用户在浏览器搜索栏中输入“/#/section2”并按下回车键时,页面就会自动滚动到id为“section2”的位置。注意,这里的Target属性设置为64,是因为Antd的导航栏默认高度为64px。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值