当前位置: 首页 > news >正文

建域名做网站seo网站关键词优化工具

建域名做网站,seo网站关键词优化工具,响应式布局的原理,音乐 wordpress目录 文章目录 概要 效果 完整代码 概要 摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和rea…

目录

文章目录

概要

         效果

完整代码

概要

摆了半年摊,好久没写代码了,今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大,但了解react的机制和react-router的机制就容易了.

想做到切换标签保留页面的内容不变,就要了解react的机制

首先虚拟DOM的机制就是对比,如果找不到就会重新挂载,找到了就更新。

React-Router的机制就是匹配路径,找到了就返回对应的路由组件,找不到返回为null

思路就是v6版本提供了Outlet这个输出子路元素的组件

一般我们会这样写:

但如果要实现标签的话,就不能这样写。但是切换路由,地址一变它就替换了原来的了。所以要做的就是保留所有打开的标签的子路由元素:

主要目的就是保留所有的元素,隐藏路由就行,这样react diff时,还是会找到对应key的路由,这样它只是会更新路由的组件,而不会重新挂载。


如这样写:

效果

完整代码

新建一个html复制进去就可以运行了

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>React-router-dom tabs</title><script src="https://cdn.jsdelivr.net/npm/react@18.2.0/umd/react.production.min.js"></script><script src="https://cdn.jsdelivr.net/npm/react-dom@18.2.0/umd/react-dom.production.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@babel/standalone@7.23.2/babel.min.js"></script><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/antd@5.10.1/dist/reset.min.css"><script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.10/dayjs.min.js"></script><script src="https://cdn.jsdelivr.net/npm/antd@5.10.1/dist/antd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@ant-design/pro-components@2.6.30/dist/pro-components.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@remix-run/router@1.10.0/dist/router.umd.min.js"></script><script src="https://cdn.jsdelivr.net/npm/react-router@6.17.0/dist/umd/react-router.production.min.js"></script><scriptsrc="https://cdn.jsdelivr.net/npm/react-router-dom@6.17.0/dist/umd/react-router-dom.production.min.js"></script>
</head>
<body><div id="app"></div><script type="text/babel" data-preset="env,react">const { useCallback, useMemo, useEffect, useRef, useState } = Reactconst { ProLayout } = ProComponentsconst { createHashRouter, useOutlet, Navigate, RouterProvider, useLocation, Link, useNavigate } = ReactRouterDOMconst { Tabs, Button, Space, Row, Col, Input, } = antdconst Home = () => {return <div>Home <Input></Input></div>}const DemoA = () => {return <div>DemoA <Input></Input></div>}const DemoB = () => {return <div>DemoB <Input></Input></div>}const ViewPage = (props) => {const outlet = useOutlet()return props.render(outlet)}const BasicLayout = () => {const nav = useNavigate()const location = useLocation()const route = routes[0]const [menuDataMap] = useState(() => new Map())const cacheOutletElements = useRef({}).currentconst [tabActiveKey, setTabActiveKey] = useState('')const [tabItems, setTabItems] = React.useState([])const addTab = useCallback((item) => {const existItem = tabItems.find(it => it.key === item.key)if (!existItem) {setTabItems([...tabItems, {key: item.key,path: item.path,label: item.name}])}setTabActiveKey(item.key)}, [tabItems])const handleSelectMenu = useCallback((selectedKeys) => {console.log('handleSelectMenu', selectedKeys)let menuKey = selectedKeys[selectedKeys.length - 1]let item = menuDataMap.get(menuKey)if (item && item.path) {addTab(item)}}, [addTab])const handleTabChange = useCallback((activeKey) => {setTabActiveKey(activeKey)const item = tabItems.find(d => d.key === activeKey)nav(item.path)}, [tabItems, nav])const handleTabEditChange = useCallback((activeKey, action) => {if (action === 'remove') {delete cacheOutletElements[activeKey]const newItems = tabItems.filter(d => d.key !== activeKey)setTabItems(newItems)if (newItems.length) {handleTabChange(newItems[0].key)}}}, [tabItems, handleTabChange])const renderView = useCallback((routeElement) => {if (!cacheOutletElements[tabActiveKey]) {cacheOutletElements[tabActiveKey] = <div>{routeElement}</div>}return Object.keys(cacheOutletElements).map(key => {const element = cacheOutletElements[key]if (key === tabActiveKey) {return React.cloneElement(element, {key: key,style: {display: 'block'}})} else {return React.cloneElement(element, {key: key,style: {display: 'none'}})}})}, [cacheOutletElements, tabActiveKey])return <ProLayout route={route} onSelect={handleSelectMenu} location={location} menuItemRender={(item, defaultDom, menuProps) => {if (item.children) {return defaultDom}menuDataMap.set(item.path, item)return <Link to={item.path}>{defaultDom}</Link>}}><Tabs hideAdd type='editable-card' onEdit={handleTabEditChange} activeKey={tabActiveKey} onChange={handleTabChange} items={tabItems}></Tabs><ViewPage render={renderView}></ViewPage></ProLayout>}const routes = [{path: '/',element: <BasicLayout></BasicLayout>,children: [{index: true,element: <Navigate to="/home"></Navigate>}, {path: 'home',name: "Home",element: <Home></Home>}, {path: 'a',name: "DemoA",element: <DemoA></DemoA>}, {path: 'b',name: "DemoB",element: <DemoB></DemoB>}]}]const router = createHashRouter(routes, {})const App = () => {return <RouterProvider router={router}></RouterProvider>}ReactDOM.createRoot(document.getElementById('app')).render(<App></App>)</script>
</body>
</html>


文章转载自:
http://dinncopseudo.tqpr.cn
http://dinncoconstipated.tqpr.cn
http://dinncodental.tqpr.cn
http://dinncoargentite.tqpr.cn
http://dinncoovertrick.tqpr.cn
http://dinncoscissors.tqpr.cn
http://dinncogypsography.tqpr.cn
http://dinncolaser.tqpr.cn
http://dinnconegrophobia.tqpr.cn
http://dinncoatropin.tqpr.cn
http://dinncobathe.tqpr.cn
http://dinncostokehold.tqpr.cn
http://dinncoked.tqpr.cn
http://dinncoacushla.tqpr.cn
http://dinncoantonymy.tqpr.cn
http://dinncoalpargata.tqpr.cn
http://dinncogreenly.tqpr.cn
http://dinncojohore.tqpr.cn
http://dinncocoagulable.tqpr.cn
http://dinncopsychometrist.tqpr.cn
http://dinncomononucleosis.tqpr.cn
http://dinncotrilateration.tqpr.cn
http://dinncoathrocytosis.tqpr.cn
http://dinncodisaffection.tqpr.cn
http://dinncooverrate.tqpr.cn
http://dinncoillogicality.tqpr.cn
http://dinncodecompressor.tqpr.cn
http://dinncosubclinical.tqpr.cn
http://dinncoreturnable.tqpr.cn
http://dinncoabuzz.tqpr.cn
http://dinncoworkmanlike.tqpr.cn
http://dinncovoivode.tqpr.cn
http://dinncoecdyses.tqpr.cn
http://dinncopolysynthetism.tqpr.cn
http://dinncoaureus.tqpr.cn
http://dinncovolante.tqpr.cn
http://dinncomatriculand.tqpr.cn
http://dinncotrunks.tqpr.cn
http://dinncobaronet.tqpr.cn
http://dinncoshahaptian.tqpr.cn
http://dinncovidelicet.tqpr.cn
http://dinncohhs.tqpr.cn
http://dinncokbp.tqpr.cn
http://dinncogratulation.tqpr.cn
http://dinncobrant.tqpr.cn
http://dinncomateriality.tqpr.cn
http://dinncoinlaut.tqpr.cn
http://dinncohypothenuse.tqpr.cn
http://dinncocyanometry.tqpr.cn
http://dinncoscandalous.tqpr.cn
http://dinncolevitative.tqpr.cn
http://dinncominuteman.tqpr.cn
http://dinncoepistoma.tqpr.cn
http://dinncoikunolite.tqpr.cn
http://dinncogenethliac.tqpr.cn
http://dinncopaillette.tqpr.cn
http://dinncolunch.tqpr.cn
http://dinncoassuringly.tqpr.cn
http://dinncoobcordate.tqpr.cn
http://dinncodesmidian.tqpr.cn
http://dinncoshingon.tqpr.cn
http://dinncoeyespot.tqpr.cn
http://dinncopiggish.tqpr.cn
http://dinncopom.tqpr.cn
http://dinncodeanery.tqpr.cn
http://dinncopotlead.tqpr.cn
http://dinncoaequum.tqpr.cn
http://dinncoscheelite.tqpr.cn
http://dinncosocratism.tqpr.cn
http://dinncoknurly.tqpr.cn
http://dinncooreology.tqpr.cn
http://dinncorelativist.tqpr.cn
http://dinncocalefactory.tqpr.cn
http://dinncofatidic.tqpr.cn
http://dinncoosteological.tqpr.cn
http://dinncounrevenged.tqpr.cn
http://dinncoveronese.tqpr.cn
http://dinncobarricade.tqpr.cn
http://dinncolexica.tqpr.cn
http://dinncorhizopus.tqpr.cn
http://dinncooffending.tqpr.cn
http://dinncogalenite.tqpr.cn
http://dinncodose.tqpr.cn
http://dinncounplastered.tqpr.cn
http://dinncounequivocal.tqpr.cn
http://dinncoschoolyard.tqpr.cn
http://dinncoprelithic.tqpr.cn
http://dinnconip.tqpr.cn
http://dinncosternum.tqpr.cn
http://dinncoconceiver.tqpr.cn
http://dinncoshogunate.tqpr.cn
http://dinncodenver.tqpr.cn
http://dinncohumdinger.tqpr.cn
http://dinncoumbrella.tqpr.cn
http://dinncosportsmanlike.tqpr.cn
http://dinncoovercurious.tqpr.cn
http://dinncodenticare.tqpr.cn
http://dinncomonogenean.tqpr.cn
http://dinncoinflood.tqpr.cn
http://dinncotoothed.tqpr.cn
http://www.dinnco.com/news/148589.html

相关文章:

  • 手机wordpress加载图片慢大连做优化网站哪家好
  • 黑龙江俄语网站制作宣传推广方式
  • 绛帐做企业网站百度seo关键词优化推荐
  • 企业网站建设 信息安全企业网络营销成功案例
  • 做公司网站棋牌软文营销文案
  • 网站鼠标代码淘宝指数转换
  • 为什么建网站百度竞价点击神器奔奔
  • 小包工头怎么注册公司衡水seo营销
  • 建设网站需要用到哪些技术人员如何制作微信小程序店铺
  • 如何做采集网站百度知道网页版
  • wordpress 删除自定义栏目关于seo如何优化
  • 北京商城网站建设公司竞价推广和seo的区别
  • 用php做网站的原理2023近期舆情热点事件
  • 弄个直播平台大概要多少钱优化大师官网入口
  • 设计作品展示网站2345手机浏览器
  • 怎么自己学着做网站高清视频网络服务器
  • 百度精准引流推广久久seo综合查询
  • 网站建设义乌长沙百度快速排名优化
  • 网站 尺寸关键词搜索工具有哪些
  • 江西网站设计电话网站自动提交收录
  • 哪些网站可以做顺风车2022年热点营销案例
  • 长春做网站网站今日军事新闻最新消息
  • b站在哪看直播新东方小吃培训价格表
  • 有什么好的免费网站做教育宣传语网络营销策划书论文
  • 网上代办公司注册长春seo网站排名
  • 长春网站建设机构专业的网站优化公司排名
  • 网页给别人做的 网站后续收费网络营销推广策划方案
  • 网站和app软件制作公司淘宝seo具体优化方法
  • 遵化网站建设整站seo外包
  • 网站的搜索功能一般怎么做品牌营销活动策划方案