广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >react如何实现侧边栏联动头部导航栏效果
  • 381
分享到

react如何实现侧边栏联动头部导航栏效果

react侧边栏react侧边栏联动react头部导航栏效果 2023-03-12 14:03:25 381人浏览 独家记忆
摘要

目录实现思路路由表侧边栏渲染容器组件(侧边栏)store头部导航栏容器组件UI组件总结项目中使用React+antd design+redux+react-reouter-dom 实

项目中使用React+antd design+redux+react-reouter-dom

实现思路

编写路由表=》循环遍历路由表=》渲染侧边栏=》单击侧边栏获取相应的标签数据=》存入redux=》遍历循环redux数据渲染头部导航栏

路由表

const RouterTree = [
    {
        key: 'num_one',
        title: {
            icon: '',
            text: 'text'
        },
        children: [
            {
                key: '1',
                text: 'options1',
                path: '/option1',
                component: '',
                isOutSide: true,
            }
        ]

    },
    {
        key: 'num_two',
        title: {
            icon: '',
            text: 'text'
        },
        children: [
            {
                key: '2',
                text: 'text',
                path: '/option1',
                component: '',
                isOutSide: false
            }
        ]

    },
    {
        key: 'num_three',
        title: {
            icon: '',
            text: 'text'
        },
        children: [
            {
                key: '3',
                text: 'text',
                path: '/option1',
                component: '',
                isOutSide: false
            }
        ]

    },
]
export default RouterTree

侧边栏渲染

引入路由表,循环遍历渲染侧边栏

import React, { Component } from 'react'
import { Menu } from 'antd';
import { NavLink as Link, withRouter } from 'react-router-dom'
import RouterTree from '@/modules/route.js'

 render() {
        const { activityKey } = this.state || {}
        return (
            <div>
                <Menu
                    onClick={this.handleClick}
                    defaultSelectedKeys={['1']}
                    defaultOpenKeys={['sub1']}
                    selectedKeys={activityKey}
                    mode="inline"
                    inlineCollapsed={isToggle}
                >
                    {RouterTree.map((item, index) => {
                        return (
                            <SubMenu
                                key={item.key}
                                title={item.title.text}
                                index={index}
                            >
                                {item.children && item.children.map((menuItem, menuIndex) => {
                                    return (<Menu.Item
                                        key={menuItem.key}
                                        index={menuIndex}
                                    >
                                        {menuItem.isOutSide ? <a href='Http://www.baidu.com' rel="noopener noreferrer">baidu</a> : <Link to={menuItem.path}>{menuItem.text}</Link>}
                                    </Menu.Item>)
                                })}
                            </SubMenu>)
                    })}
                </Menu>
            </div>
        )

由于单独使用redux不便,项目中引用react-redux,redux-thunk。

这里将侧边栏拆分为两个文件,一个是容器组件,一个为UI组件(以上的为UI组件)

容器组件(侧边栏)

容器组件为导出的组件,在容器组件中引入UI组件slide

import { connect } from 'react-redux'
import { business } from '@/tools/index.js'
import Slide from './slide'

const { processedArr } = business

const mapStoreToProps = (state) => {
    const { dynamicJump,activityKey} = state || {}
    let responseRoute = processedArr(dynamicJump)
    return {
        dynamicJump: [...responseRoute],
        activityKey:activityKey
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        updateRouter(item) {
            dispatch((dispatch) => {
                dispatch({
                    type: 'UPDATED_ROUTING', item: { ...item }
                })
            })
        },
        activityKeys(key){
            dispatch((dispatch)=>{
                dispatch({
                    type:'ACTIVITY_KEY',key:key
                })
            })
        }
    }
}

export default connect(mapStoreToProps, mapDispatchToProps)(Slide)

store

在src下新建一个store文件

import { createStore, applyMiddleware } from 'redux'
import thunk from 'redux-thunk';
import { routerMiddleware } from 'react-router-redux'

let createHistory = require('history').createBrowserHistory
let history = createHistory()
let routerWare = routerMiddleware(history)

const dynamicJump = {
    dynamicJump: '这里设置默认值'(一般存放在session中),
    activityKey: '这里设置默认值',
}

const reducers = function (state = dynamicJump, action) {
    switch (action.type) {
        case 'UPDATED_ROUTING':
            state.dynamicJump =action.item
            break;
        case 'ACTIVITY_KEY':
            if (action.key !== undefined) {
                state.activityKey = action.key
            }
            break;
        default:
            break;
    }
    return { ...state }
}

const store = createStore(reducers, applyMiddleware(thunk, routerWare))

// 订阅事件
store.subscribe(() => {
    let state = store.getState();
    sessionStorage.setItem('dynamicJump',JSON.stringify(state.dynamicJump))
    sessionStorage.setItem('activityKey',JSON.stringify(state.activityKey))
})

export default store

在根目录下将其注入进去(注意文件的引入位置)

import {Provider} from 'react-redux'
import store from './store/index.js'

ReactDOM.render(
  <Provider store={store}><App /></Provider>,
  document.getElementById('root')
);

头部导航栏

容器组件

import { connect } from 'react-redux'
import { push } from 'react-router-redux'
import { business } from '@/tools/index.js'
import Header from './head.jsx'

const { processedArr } = business

const mapStoreToProps = (state) => {
    const { dynamicJump, activityKey } = state
    let newRouteArr = processedArr(dynamicJump)
    return {
        dynamicJump: [...newRouteArr],
        activityKey: activityKey
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        removeKey(itemKey) {
            dispatch((dispatch, getStore) => {
                const { dynamicJump } = getStore() || {}
                let removeArr = processedArr(dynamicJump)
                const indexes = removeArr.findIndex((item) => item.key === itemKey)
                // 点击头部导航条的删除(即删除保存在redux的数组元素即可)
                if (removeArr.length > 1) {
                    removeArr.splice(indexes, 1)
                }
                // 删除之后跳转到删除元素的前一个元素的路由地址
                let path = removeArr[indexes - 1] ? removeArr[indexes - 1].path : '/option1'
                let keys = removeArr[indexes - 1] ? removeArr[indexes - 1].key : 0
                if(keys===0){
                    keys=removeArr[0].key
                }
                dispatch({
                    type: 'UPDATED_ROUTING', item: { ...removeArr },
                })
                dispatch({
                    type: 'ACTIVITY_KEY', key: keys
                })
                // 这里进行跳转
                dispatch(push(path))
            })
        },
        changeActiveKey(key) {
            dispatch((dispatch) => {
                dispatch({
                    type: 'ACTIVITY_KEY', key: key
                })
            })
        }
    }
}


export default connect(mapStoreToProps, mapDispatchToProps)(Header)

这里存在着:如果删除头部组件的其中一个导航,那么需要跳转到该导航(删除的)的前一个路由地址,而这个操作在UI组件中是不方便的,这里我采取的方法是引入“history”模块(详细代码请移步到store.js),然后在容器组件中使用dispatch(push(path))跳转,也可以使用更为简单的方法,直接在容器组件中引入react-router的withRouter,包裹在最外层即:export default withRouter(connect(mapStoreToProps, mapDispatchToProps)(Header))

UI组件

render(){
   const { dynamicJump } = this.props || {}
   const { activeKey } = this.state || {}
    <Tabs
             hideadd
             onChange={this.onChange}
             activeKey={activeKey}
             type="line"
             onEdit={this.onEdit}
             className='tabs'
     >
                  { dynamicJump.map((item) => (
                            <Tabpane tab={<Link to={item.path}>{item.text}</Link>} key={item.key} />
                    ))}
    </Tabs>
}

对于key值,可以使用react新增的钩子函数:getDerivedStateFromProps进行判断是否更行

static getDerivedStateFromProps(nextProps, preState) {
        const { activityKey, dynamicJump } = nextProps || {}
        const { activeKey } = preState || {}
        if (activityKey !== activeKey) {
            return {
                activeKey: activityKey
            }
        }
        return { allRoute: dynamicJump }
 }
 
 remove = targeTKEy => {
        this.removeKey(targetKey)
   }
  removeKey(key) {
        this.props.removeKey(key)
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: react如何实现侧边栏联动头部导航栏效果

本文链接: https://www.lsjlt.com/news/199443.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • react如何实现侧边栏联动头部导航栏效果
    目录实现思路路由表侧边栏渲染容器组件(侧边栏)store头部导航栏容器组件UI组件总结项目中使用react+antd design+redux+react-reouter-dom 实...
    99+
    2023-03-12
    react侧边栏 react侧边栏联动 react头部导航栏效果
  • react怎么实现侧边栏联动头部导航栏效果
    本文小编为大家详细介绍“react怎么实现侧边栏联动头部导航栏效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“react怎么实现侧边栏联动头部导航栏效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。项目中使用...
    99+
    2023-07-05
  • jquery如何模拟京东实现侧边栏导航效果
    小编给大家分享一下jquery如何模拟京东实现侧边栏导航效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!样式代码<sty...
    99+
    2022-10-19
  • Vue如何实现侧边导航栏于Tab页关联
    这篇文章主要为大家展示了“Vue如何实现侧边导航栏于Tab页关联”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue如何实现侧边导航栏于Tab页关联”这篇文章吧。技术栈侧边栏用Antdtab使用...
    99+
    2023-06-25
  • jQuery实现侧边导航栏及滑动电梯效果(仿淘宝)
    效果图 实现代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=...
    99+
    2022-11-13
  • react如何实现导航栏二级联动
    这篇文章给大家分享的是有关react如何实现导航栏二级联动的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果图js代码import { Component } ...
    99+
    2023-06-29
  • 微信小程序如何实现侧边导航栏
    今天小编给大家分享一下微信小程序如何实现侧边导航栏的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。效果图wxml<vie...
    99+
    2023-07-02
  • js如何实现电商侧边导航效果
    这篇文章给大家分享的是有关js如何实现电商侧边导航效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。知识要点实现原理:1.点击楼层跳相应楼层,用的是锚点定位电梯:<a hr...
    99+
    2022-10-19
  • 微信小程序如何实现今日头条导航栏滚动效果
    这篇文章给大家分享的是有关微信小程序如何实现今日头条导航栏滚动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目需要,做一个和今日头条一样的导航栏,可以横行滚动,幸好再weu...
    99+
    2022-10-19
  • 微信小程序如何实现顶部导航栏滑动tab效果
    这篇文章将为大家详细讲解有关微信小程序如何实现顶部导航栏滑动tab效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下效果图:首先是滑动的效果:<scro...
    99+
    2022-10-19
  • 微信小程序如何实现侧边栏二级联动
    今天小编给大家分享一下微信小程序如何实现侧边栏二级联动的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现效果如下实现步骤样式...
    99+
    2023-07-02
  • vue如何实现拖动左侧导航栏变大变小
    这篇文章给大家分享的是有关vue如何实现拖动左侧导航栏变大变小的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下<template>  <div> &...
    99+
    2023-06-29
  • Android应用中怎实现一个顶部导航栏滑动效果
    本篇文章给大家分享的是有关Android应用中怎实现一个顶部导航栏滑动效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。向app Module中的build.gradle中添加...
    99+
    2023-05-31
    android roi
  • 如何使用HTML和CSS实现一个固定侧边导航栏布局
    如何使用HTML和CSS实现一个固定侧边导航栏布局导航栏是网页布局中非常重要的一部分,固定侧边导航栏布局是一种常见的设计模式。本文将介绍如何使用HTML和CSS来实现一个简单的固定侧边导航栏布局,并提供具体的代码示例。HTML结构首先,我们...
    99+
    2023-10-28
    CSS html 固定导航栏
  • js如何实现导航栏中英文切换效果
    这篇文章主要为大家展示了“js如何实现导航栏中英文切换效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何实现导航栏中英文切换效果”这篇文章吧。思路:ul...
    99+
    2022-10-19
  • Android实现简单底部导航栏 Android仿微信滑动切换效果
    Android仿微信滑动切换最终实现效果:大体思路: 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标;2. 底部导航栏的设置方法类似于TabLayout的关联,View...
    99+
    2023-05-30
    android 导航栏
  • Html+Css+Jquery如何实现左侧滑动拉伸导航菜单栏
    这篇文章主要介绍了Html+Css+Jquery如何实现左侧滑动拉伸导航菜单栏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PC端移动端代码<!DOCTYPE ...
    99+
    2023-06-09
  • 如何使用html+css+js实现导航栏滚动渐变效果
    本篇内容主要讲解“如何使用html+css+js实现导航栏滚动渐变效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用html+css+js实现导航栏滚动渐变效果”吧!实现:1.定义导航栏...
    99+
    2023-07-05
  • JS如何实现侧边栏鼠标经过弹出框+缓冲效果
    这篇文章主要为大家展示了“JS如何实现侧边栏鼠标经过弹出框+缓冲效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何实现侧边栏鼠标经过弹出框+缓冲效果”这...
    99+
    2022-10-19
  • Android实现顶部导航栏可点击可滑动效果(仿微信仿豆瓣网)
     使用ViewPager,PagerSlidingTabStrip,SwipeRefreshLayout打造一款可以点击可以侧滑的顶部导航栏。 先简单介绍一下所用的...
    99+
    2022-06-06
    仿微信 豆瓣 动效 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作