react-实现一个简单的页面转跳路由

简单实现一个react-router

核心步骤如下:

  • 先把URL解析path出来
  • 然后匹配routes数组,找到path相同,返回出去即可
  • 这时候会有一个问题,页面没法更新数据,所以用onhashchange监听
  • 重新渲染
  • 提供执行钩子,也就是写路由文件的时候,页面设置成一个函数,然后方便执行到的时候,进行数据更新等处理

最终代码

const Main = (root: HTMLElement | null) => {
   let getPath = (url: string): string => {
      let href = url.split('#')[1]
      return href ? href.split('?')[0] : '/'
   }
   let getView = (urlPath: string) => {
      let pageInfo = routes.find((route: Troute) => route.path === urlPath)
      let pagePath = pageInfo ? pageInfo.path : ''
      return <div>
         {
            routes.map(e => {
               let view: ReactElement | Boolean
               if (e.path === pagePath) {
                  view = e.page()
               } else {
                  view = false
               }
               return view
            }).filter(e => e)
         }
      </div>
   }
   window.onhashchange = (e: HashChangeEvent) => {
      ReactDOM.render(getView(getPath(e.newURL)), root)
   }
   ReactDOM.render(getView(getPath(location.href)), root)
}

Main(
   document.getElementById('root')
)

类型

import { ReactElement } from 'react'
export interface Troute {
    path: string,
    page: () => ReactElement
}

Main函数的代码可以优化下

const Main = (root: HTMLElement | null) => {
   let getPath = (url: string): string => {
      let href = url.split('#')[1]
      return href ? href.split('?')[0] : '/'
   }
   let getView = (urlPath: string) => {
      let pageInfo = routes.find((route: Troute) => route.path === urlPath)
      return <div>{pageInfo && pageInfo.page()}</div>
   }
   window.onhashchange = (e: HashChangeEvent) => {
      ReactDOM.render(getView(getPath(e.newURL)), root)
   }
   ReactDOM.render(getView(getPath(location.href)), root)
}

具体代码查看我的项目【可视化布局 纯css布局 Layout-UI 】
GITHBU: https://github.com/0123cf/layout-ui
自动化可视化布局官网: http://layoutui.pro/

--END--

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Vue八个生命周期 beforeCreate【创建前】created【创建后】 beforeMount【载入前】 ...
    艾萨克菊花阅读 1,454评论 0 12
  • 读一本书不是解决一个问题,而是一次感受、体验、思考和交流的机会,是一次创作活动。 阅读:语言一内容。材料一一感情、...
    红巧儿阅读 530评论 3 3
  • 看到自家的猫咪躺在椅子上晒太阳,吃了睡睡了吃,过得无忧无虑,什么都不用想也不用干活劳作。想爬树就爬树,想上屋顶就上...
    爱做梦的闲鱼阅读 317评论 0 0
  • 今天是六一儿童节,我忽然想写关于我小时候的事情。 想想看,你们小时候喜欢做什么事情,我小时候就只喜欢做一件事情,还...
    在水一方含阅读 311评论 3 3
  • 本文包括:1、什么是自动登录?2、简书自动登录流程3、实现自动登录4、用户注销 1、什么是自动登录? 就拿简书做例...
    廖少少阅读 6,224评论 1 27

友情链接更多精彩内容