最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react+zarm實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼

 更新時(shí)間:2022年05月09日 08:34:13   作者:凱小默:樹上的男爵  
本文主要介紹了react?+?zarm?實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

需要實(shí)現(xiàn)的效果

需要實(shí)現(xiàn)下面欄目固定,并且點(diǎn)擊時(shí)切換到不同頁面路由

實(shí)現(xiàn)過程

1.使用 prop-types 庫進(jìn)行類型檢查

注意:自 React v15.5 起,React.PropTypes 已移入另一個(gè)包中。請(qǐng)使用 prop-types 庫 代替。

PropTypes 提供了使用不同驗(yàn)證器的例子:

import PropTypes from 'prop-types';

MyComponent.propTypes = {
  // 你可以將屬性聲明為 JS 原生類型,默認(rèn)情況下
  // 這些屬性都是可選的。
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,

  // 任何可被渲染的元素(包括數(shù)字、字符串、元素或數(shù)組)
  // (或 Fragment) 也包含這些類型。
  optionalNode: PropTypes.node,

  // 一個(gè) React 元素。
  optionalElement: PropTypes.element,

  // 一個(gè) React 元素類型(即,MyComponent)。
  optionalElementType: PropTypes.elementType,

  // 你也可以聲明 prop 為類的實(shí)例,這里使用
  // JS 的 instanceof 操作符。
  optionalMessage: PropTypes.instanceOf(Message),

  // 你可以讓你的 prop 只能是特定的值,指定它為
  // 枚舉類型。
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),

  // 一個(gè)對(duì)象可以是幾種類型中的任意一個(gè)類型
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),

  // 可以指定一個(gè)數(shù)組由某一類型的元素組成
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

  // 可以指定一個(gè)對(duì)象由某一類型的值組成
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),

  // 可以指定一個(gè)對(duì)象由特定的類型值組成
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),

  // An object with warnings on extra properties
  optionalObjectWithStrictShape: PropTypes.exact({
    name: PropTypes.string,
    quantity: PropTypes.number
  }),

  // 你可以在任何 PropTypes 屬性后面加上 `isRequired` ,確保
  // 這個(gè) prop 沒有被提供時(shí),會(huì)打印警告信息。
  requiredFunc: PropTypes.func.isRequired,

  // 任意類型的必需數(shù)據(jù)
  requiredAny: PropTypes.any.isRequired,

  // 你可以指定一個(gè)自定義驗(yàn)證器。它在驗(yàn)證失敗時(shí)應(yīng)返回一個(gè) Error 對(duì)象。
  // 請(qǐng)不要使用 `console.warn` 或拋出異常,因?yàn)檫@在 `oneOfType` 中不會(huì)起作用。
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },

  // 你也可以提供一個(gè)自定義的 `arrayOf` 或 `objectOf` 驗(yàn)證器。
  // 它應(yīng)該在驗(yàn)證失敗時(shí)返回一個(gè) Error 對(duì)象。
  // 驗(yàn)證器將驗(yàn)證數(shù)組或?qū)ο笾械拿總€(gè)值。驗(yàn)證器的前兩個(gè)參數(shù)
  // 第一個(gè)是數(shù)組或?qū)ο蟊旧?
  // 第二個(gè)是他們當(dāng)前的鍵。
  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

安裝依賴:

npm i prop-types -S

2.使用 useNavigate

v6 用 useNavigate 替代了 useHistory,其返回了一個(gè) navigate (點(diǎn)擊查看用法) 的方法,實(shí)現(xiàn)比較簡單:

  • NavigationContext 拿到 navigator,也就是 history 實(shí)例。
  • 然后根據(jù) to、matches 的每項(xiàng) pathnameBase 以及當(dāng)前 URL pathname 生成最終的路徑 path({pathname, search, hash})
  • 根據(jù)是否指定 replace 來判斷是調(diào)用 replace 還是 push 方法
// v5
import { useHistory } from 'react-router-dom';

function MyButton() {
  let history = useHistory();
  function handleClick() {
    history.push('/home');
  };
  return <button onClick={handleClick}>Submit</button>;
};

現(xiàn)在,history.push() 將替換為 navigation()

// v6
import { useNavigate } from 'react-router-dom';

function MyButton() {
  let navigate = useNavigate();
  function handleClick() {
    navigate('/home');
  };
  return <button onClick={handleClick}>Submit</button>;
};

3.編寫標(biāo)簽欄組件

新建 components/NavBar/index.jsx 文件,用于編寫底部導(dǎo)航欄,代碼如下所示:

import React, { useState } from 'react';
import PropTypes from 'prop-types'
import { TabBar } from 'zarm';
import { useNavigate, useLocation } from 'react-router-dom';
import CustomIcon from '../CustomIcon'
import s from './style.module.less';

const NavBar = ({ showNav }) => {
  const location = useLocation() // 拿到 location 實(shí)例
  const { pathname } = location // 獲取當(dāng)前路徑
  console.log('navbar pathname', pathname)
  const [activeKey, setActiveKey] = useState(pathname);
  const navigate = useNavigate()

  const changeTab = (path) => {
    setActiveKey(path)
    navigate(path)
  }

  return (
    <TabBar visible={showNav} className={s.tab} activeKey={activeKey} onChange={changeTab}>
      <TabBar.Item
        itemKey="/"
        title="賬單"
        icon={<CustomIcon type="zhangdan" />}
      />
      <TabBar.Item
        itemKey="/data"
        title="統(tǒng)計(jì)"
        icon={<CustomIcon type="tongji" />}
      />
      <TabBar.Item
        itemKey="/user"
        title="我的"
        icon={<CustomIcon type="user" />}
      />
    </TabBar>
  );
};

NavBar.propTypes = {
  showNav: PropTypes.bool
}

export default NavBar;

新建 components/NavBar/style.module.less 文件,用于編寫底部導(dǎo)航欄樣式,代碼如下所示:

.tab {
    border-top: 1px solid #e9e9e9;
}

4.使用標(biāo)簽欄組件

打開 App.jsx,添加如下代碼:

import React, { useState, useEffect } from 'react'
import NavBar from '@/components/NavBar';
import { Routes, Route, useLocation, BrowserRouter } from 'react-router-dom'

import { ConfigProvider } from 'zarm';

import routes from '../src/router'

function App() {
  const location = useLocation() // 拿到 location 實(shí)例
  const { pathname } = location // 獲取當(dāng)前路徑
  const needNav = ['/', '/data', '/user'] // 需要底部導(dǎo)航欄的路徑
  const [showNav, setShowNav] = useState(false) // 是否展示 Nav
  useEffect(() => {
    setShowNav(needNav.includes(pathname))
  }, [pathname]) // [] 內(nèi)的參數(shù)若是變化,便會(huì)執(zhí)行上述回調(diào)函數(shù)
  return <BrowserRouter>
    <ConfigProvider primaryColor={'#007fff'}>
      <Routes>
        {
          routes.map(route => <Route key={route.path} path={route.path} element={<route.component />}></Route>)
        }
      </Routes>
    </ConfigProvider>
    <NavBar showNav={showNav} />
  </BrowserRouter>
}

export default App

我們發(fā)現(xiàn)報(bào)錯(cuò)了:Uncaught Error: You cannot render a <Router> inside another <Router>. You should never have more than one in your app.

這是因?yàn)橄胍诤瘮?shù)組件內(nèi)執(zhí)行 useLocation,該組件必須被 Router 高階組件包裹,我們做如下改動(dòng),將 App.jsx 的 BrowserRouter 組件,前移到 main.jsx 內(nèi),如下:

App.jsx 里面

import React, { useState, useEffect } from 'react'
import NavBar from '@/components/NavBar';
import { Routes, Route, useLocation } from 'react-router-dom'

import { ConfigProvider } from 'zarm';

import routes from '../src/router'

function App() {
  const location = useLocation() // 拿到 location 實(shí)例
  const { pathname } = location // 獲取當(dāng)前路徑
  const needNav = ['/', '/data', '/user'] // 需要底部導(dǎo)航欄的路徑
  const [showNav, setShowNav] = useState(false) // 是否展示 Nav
  useEffect(() => {
    setShowNav(needNav.includes(pathname))
  }, [pathname]) // [] 內(nèi)的參數(shù)若是變化,便會(huì)執(zhí)行上述回調(diào)函數(shù)
  return <>
    <ConfigProvider primaryColor={'#007fff'}>
      <Routes>
        {
          routes.map(route => <Route key={route.path} path={route.path} element={<route.component />}></Route>)
        }
      </Routes>
    </ConfigProvider>
    <NavBar showNav={showNav} />
  </>
}

export default App

main.jsx

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter } from 'react-router-dom'

import 'lib-flexible/flexible'

import './index.css'
import App from './App'

ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>,
  document.getElementById('root')
)

5.添加對(duì)應(yīng)的頁面路由

在 container 文件夾里添加下面三個(gè)模塊的頁面

// 賬單
import React from 'react'

const Home = () => {
  return <div>賬單</div>
}

export default Home
// 統(tǒng)計(jì)
import React from 'react'

const Data = () => {
  return <div>統(tǒng)計(jì)</div>
}

export default Data
// 個(gè)人中心
import React from 'react'

const User = () => {
  return <div>個(gè)人中心</div>
}

export default User

然后在 router/index.js 添加路由:

import Login from '@/container/Login'
import Home from '@/container/Home'
import Data from '@/container/Data'
import User from '@/container/User'

const routes = [
  {
    path: "/login",
    component: Login
  },{
    path: "/",
    component: Home
  },{
    path: "/data",
    component: Data
  },{
    path: "/user",
    component: User
  }
];

export default routes

6.效果

我們可以切換到統(tǒng)計(jì),然后刷新,發(fā)現(xiàn)也是沒有問題。

參考資料

 到此這篇關(guān)于react+zarm實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼的文章就介紹到這了,更多相關(guān)react 底部導(dǎo)航欄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解React開發(fā)必不可少的eslint配置

    詳解React開發(fā)必不可少的eslint配置

    本篇文章主要介紹了詳解React開發(fā)必不可少的eslint配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • React表中顯示JSON數(shù)據(jù)demo

    React表中顯示JSON數(shù)據(jù)demo

    這篇文章主要為大家介紹了React表中顯示JSON數(shù)據(jù)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React?SSG實(shí)現(xiàn)Demo詳解

    React?SSG實(shí)現(xiàn)Demo詳解

    這篇文章主要為大家介紹了React?SSG實(shí)現(xiàn)Demo詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-07-07
  • 使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享

    使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享

    在復(fù)雜的React應(yīng)用中,組件之間的數(shù)據(jù)共享是必不可少的,為了解決這個(gè)問題,可以使用React?Redux來管理應(yīng)用的狀態(tài),并實(shí)現(xiàn)組件之間的數(shù)據(jù)共享,在本文中,我們將介紹如何使用React?Redux實(shí)現(xiàn)Count和Person組件之間的數(shù)據(jù)共享,需要的朋友可以參考下
    2024-03-03
  • 如何使用 React Native WebView 實(shí)現(xiàn) App 與 Web 的通訊

    如何使用 React Native WebView 實(shí)現(xiàn) App&nb

    通過 react-native-webview,我們可以輕松實(shí)現(xiàn) App 與 Web 的雙向通訊,這種技術(shù)非常適合需要在移動(dòng)應(yīng)用中嵌入復(fù)雜網(wǎng)頁功能的場景,感興趣的朋友一起看看吧
    2024-12-12
  • React Native實(shí)現(xiàn)進(jìn)度條彈框的示例代碼

    React Native實(shí)現(xiàn)進(jìn)度條彈框的示例代碼

    本篇文章主要介紹了React Native實(shí)現(xiàn)進(jìn)度條彈框的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • React如何通過@craco/craco代理接口

    React如何通過@craco/craco代理接口

    這篇文章主要介紹了React如何通過@craco/craco代理接口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解React中如何獲取真實(shí)的dom

    詳解React中如何獲取真實(shí)的dom

    這篇文章主要為大家詳細(xì)介紹了React中獲取真實(shí)的dom的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • React Native可復(fù)用 UI分離布局組件和狀態(tài)組件技巧

    React Native可復(fù)用 UI分離布局組件和狀態(tài)組件技巧

    這篇文章主要為大家介紹了React Native可復(fù)用 UI分離布局組件和狀態(tài)組件使用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • react mobx 基本用法示例小結(jié)

    react mobx 基本用法示例小結(jié)

    mobx是一個(gè)輕量級(jí)的狀態(tài)管理器,所以很簡單(單一全局?jǐn)?shù)據(jù)使用class)類有g(shù)et 數(shù)據(jù)方法,本文通過示例代碼介紹react mobx 基本用法,感興趣的朋友有一起看看
    2023-11-11

最新評(píng)論

庆阳市| 黄浦区| 同心县| 金阳县| 句容市| 垫江县| 嫩江县| 东方市| 定州市| 阳高县| 楚雄市| 房山区| 辽宁省| 普陀区| 乳山市| 武清区| 石林| 芷江| 廊坊市| 鹤山市| 邹城市| 枣庄市| 光泽县| 冷水江市| 台湾省| 思茅市| 武邑县| 如皋市| 大化| 长春市| 遂川县| 霍山县| 高安市| 神农架林区| 南澳县| 琼结县| 河间市| 武川县| 新平| 库尔勒市| 孟村|