next.js刷新页面时二级菜单展开状态判断

在 Next.js 中保持二级菜单刷新后展开状态的解决方案

在 Next.js 应用中,当页面刷新时保持二级菜单的展开状态,可以通过以下几种方法实现:

方法1:使用 URL 参数保存状态(推荐)

import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';const MenuComponent = () => {const router = useRouter();const { query } = router;const [expandedMenu, setExpandedMenu] = useState<string | null>(null);// 从URL参数初始化菜单状态useEffect(() => {if (query.expandedMenu) {setExpandedMenu(query.expandedMenu as string);}}, [query.expandedMenu]);const toggleMenu = (menuId: string) => {const newState = expandedMenu === menuId ? null : menuId;setExpandedMenu(newState);// 更新URL但不触发页面刷新router.push({pathname: router.pathname,query: { ...query, expandedMenu: newState }}, undefined, { shallow: true });};return (<div><div onClick={() => toggleMenu('menu1')}>主菜单1</div>{expandedMenu === 'menu1' && (<div className="submenu"><div>子菜单1</div><div>子菜单2</div></div>)}</div>);
};

方法2:使用 localStorage 保存状态

import { useEffect, useState } from 'react';const MenuComponent = () => {const [expandedMenu, setExpandedMenu] = useState<string | null>(null);// 从localStorage初始化菜单状态useEffect(() => {const savedState = typeof window !== 'undefined' ? localStorage.getItem('expandedMenu') : null;if (savedState) {setExpandedMenu(savedState);}}, []);const toggleMenu = (menuId: string) => {const newState = expandedMenu === menuId ? null : menuId;setExpandedMenu(newState);localStorage.setItem('expandedMenu', newState || '');};// 渲染逻辑同上
};

方法3:使用状态管理库(如 Zustand)

// store/menuStore.ts
import create from 'zustand';
import { persist } from 'zustand/middleware';interface MenuState {expandedMenu: string | null;toggleMenu: (menuId: string) => void;
}export const useMenuStore = create<MenuState>()(persist((set) => ({expandedMenu: null,toggleMenu: (menuId) => set((state) => ({expandedMenu: state.expandedMenu === menuId ? null : menuId})),}),{name: 'menu-storage', // localStorage的key})
);// 组件中使用
const MenuComponent = () => {const { expandedMenu, toggleMenu } = useMenuStore();// 渲染逻辑
};

方法4:使用 Cookie(服务端可获取)

import { useState } from 'react';
import { setCookie, parseCookies } from 'nookies';export const getServerSideProps = (ctx) => {const cookies = parseCookies(ctx);return {props: {initialExpandedMenu: cookies.expandedMenu || null}};
};const MenuComponent = ({ initialExpandedMenu }) => {const [expandedMenu, setExpandedMenu] = useState(initialExpandedMenu);const toggleMenu = (menuId: string) => {const newState = expandedMenu === menuId ? null : menuId;setExpandedMenu(newState);setCookie(null, 'expandedMenu', newState || '', {path: '/',maxAge: 30 * 24 * 60 * 60, // 30天});};// 渲染逻辑
};

最佳实践建议

  1. 简单场景:使用 URL 参数方法(方法1),既保持状态又方便分享链接
  2. 复杂应用:使用 Zustand 等状态管理库(方法3),特别是需要跨组件共享状态时
  3. SEO相关:如果菜单状态影响内容展示,考虑服务端方案(方法4)
  4. 用户体验:添加过渡动画使菜单展开/收起更平滑

注意事项

  1. 服务端渲染兼容性:在 useEffect 中访问 localStorage/window 等客户端 API
  2. 状态同步:确保 URL、存储和组件状态保持一致
  3. 安全考虑:不要用这些方法存储敏感信息
  4. 性能优化:对于大型菜单,考虑虚拟滚动等技术

以上方法都可以在 Next.js 应用中有效保持二级菜单的展开状态,即使在页面刷新后也能恢复之前的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89960.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络基础DAY13-NAT技术

NAT技术internet接入方式&#xff1a;ADLS技术&#xff1a;能够将不同设备的不同信号通过分离器进行打包之后再internet中传输&#xff0c;到另一端的分离器之后再进行分离。传输到不同的设备中去。常见光纤接入方式internet接入认证方式&#xff1a;PPPoE&#xff1a;先认证再…

HBuilderX中设置 DevEco Studio路径,但是一直提示未安装

前言&#xff1a; HBuilderX中设置 DevEco Studio路径&#xff0c;但是一直提示未安装。 报错信息&#xff1a; 检测到鸿蒙工具链&#xff0c;请在菜单“工具->设置->运行配置”中设置鸿蒙开发者工具路径为 DevEco Studio 的安装路径&#xff0c;请参考 报错原因…

什么是GNN?——聚合、更新与循环

在传统的深度学习中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;擅长处理网格结构数据&#xff08;如图像&#xff09;&#xff0c;循环神经网络&#xff08;RNN&#xff09;擅长处理序列数据&#xff08;如文本&#xff09;。但当数据以图的形式存在时&#xff08;如…

深入解析 Django REST Framework 的 APIView 核心方法

在 Python 3 中&#xff0c;Django 的 APIView 类是 Django REST Framework&#xff08;DRF&#xff09;中用于构建 API 视图的核心基类。它提供了一个灵活的框架来处理 HTTP 请求&#xff0c;并通过一系列方法支持认证、权限检查和请求限制等功能。self.perform_authenticatio…

神经网络——卷积层

目录 卷积层介绍 Conv2d 卷积动画演示 卷积代码演示 综合代码案例 卷积层介绍 卷积层是卷积神经网络&#xff08;CNN&#xff09;的核心组件&#xff0c;它通过卷积运算提取输入数据的特征。 基本原理 卷积层通过卷积核&#xff08;过滤器&#xff09;在输入数据&…

神经网络——线性层

在机器学习中&#xff0c;线性层&#xff08;Linear Layer&#xff09; 是一种基础的神经网络组件&#xff0c;也称为全连接层&#xff08;Fully Connected Layer&#xff09; 或密集层&#xff08;Dense Layer&#xff09;。 其严格的数学定义为&#xff1a;对输入数据执行线…

大模型高效适配:软提示调优 Prompt Tuning

The Power of Scale for Parameter-Efficient Prompt Tuning ruatishi 软提示向量 具体是什么 《The Power of Scale for Parameter-Efficient Prompt Tuning》中增加的部分是“软提示(soft prompts)”,这是一种针对特定下游任务,添加到输入文本中的可调参数序列。它与传统…

https正向代理 GoProxy

背景&#xff1a; 在安全隔离的内网环境中&#xff0c;部署于内网的应用如需调用公网第三方接口&#xff08;如支付、短信&#xff09;&#xff0c;可通过正向代理服务实现访问。 GoProxy 下载&#xff1a; https://github.com/snail007/goproxy/releases 使用文档&#xff…

Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践

一、字节流与字符流&#xff1a;如何选择&#xff1f; 1.1 核心区别特性字节流字符流处理单位字节&#xff08;8位&#xff09;字符&#xff08;16位Unicode&#xff09;适用场景二进制文件&#xff08;图片/视频&#xff09;文本文件&#xff08;TXT/CSV&#xff09;编码处理需…

QT6 源,七章对话框与多窗体(5) 文件对话框 QFileDialog 篇二:源码带注释

&#xff08;13&#xff09;本源代码定义于头文件 qfiledialog . h &#xff1a; #ifndef QFILEDIALOG_H #define QFILEDIALOG_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtCore/qdir.h> #include <QtCore/qstring.h> #include <QtCore/qurl.h…

关于Ajax的学习笔记

Ajax概念&#xff1a;是一门使用了js语言&#xff0c;可以使用于Javaweb&#xff0c;实现前端代码和后端代码连结的的一种异步同步&#xff08;不需要等待服务器相应&#xff0c;就能够发送第二次请求&#xff09;的一种技术&#xff0c;它主要用于网页内容的局部刷新&#xff…

The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(三)

文章目录The Missing Semester of Your CS Education 学习笔记以及一些拓展知识Vim编辑器笔记部分程序员常用的编辑器Vim的模式Vim的普通模式Vim的插入模式Vim的可视模式Vim的替换模式Vim的命令行模式Vim的高级功能文本对象宏寄存器缓冲区标记代码折叠Vim的常用配置Vim的常用插…

PyTorch常用的简单数学运算

一、基础算术运算1. 逐元素运算a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6])# 加减乘除 a b # [5, 7, 9] a - b # [-3, -3, -3] a * b # [4, 10, 18] a / b # [0.25, 0.4, 0.5]# 幂运算、平方根 a ** 2 # [1, 4, 9] torch.sqrt(a) # [1.0, 1.414, 1.732]2. 标…

C++ Lambda 表达式详解:从基础到实战

Lambda 表达式是 C11 引入的重要特性&#xff0c;它允许我们在代码中定义匿名函数&#xff0c;极大地简化了代码编写&#xff0c;尤其是在使用 STL 算法和多线程编程时。本文将详细介绍 Lambda 表达式的语法、特性及实际应用场景。什么是 Lambda 表达式&#xff1f;Lambda 表达…

Spring Boot注解详解

文章目录前言1. 核心启动注解SpringBootApplicationEnableAutoConfigurationSpringBootConfiguration2. 组件注解Component及其衍生注解ComponentServiceRepositoryControllerRestController3. 依赖注入注解AutowiredQualifierPrimary4. Web相关注解请求映射注解RequestMapping…

Web开发:ABP框架12——中间件Middleware的创建和使用

一、简介中间件可以用于鉴权、日志&#xff0c;拦截器可以用于指定方法或url的业务逻辑处理&#xff0c;两者分工不同&#xff0c;实现效果相似&#xff0c;先执行中间件&#xff0c;后执行拦截器&#xff0c;再到WebAPI接口。二、示例一个Token验证中间件三、代码1.Startup.cs…

京东商品评论如何获取?API接口实战指南

一、API接入准备1. 注册开发者账号访问京东开放平台&#xff1a;前往京东开放平台注册账号&#xff0c;完成企业或个人实名认证。创建应用&#xff1a;在控制台创建应用&#xff0c;获取App Key和App Secret&#xff08;用于签名认证&#xff09;。2. 申请API权限搜索接口&…

leetcode-sql-627变更性别

题目&#xff1a; Salary 表&#xff1a; --------------------- | Column Name | Type | --------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | --------------------- id 是这个表的主键…

【学习路线】C#企业级开发之路:从基础语法到云原生应用

一、C#基础入门&#xff08;1-2个月&#xff09; &#xff08;一&#xff09;开发环境搭建Visual Studio安装配置 Visual Studio Community&#xff1a;免费版本&#xff0c;功能完整Visual Studio Code&#xff1a;轻量级&#xff0c;跨平台支持JetBrains Rider&#xff1a;专…

Planning Agent:基于大模型的动态规划与ReAct机制,实现复杂问题自适应执行求解

引言 在当今数据驱动的商业环境中&#xff0c;企业面临着日益复杂的决策问题。传统的数据分析工具往往难以应对多步骤、多依赖的复杂问题求解。例如&#xff0c;当企业需要分析"北美市场 Q1-Q2 主要产品的销售增长趋势并识别关键驱动因素"时&#xff0c;传统工具可能…