如何将自定义类添加到某些路由的 body 元素 - nexjts

S.M_Emamian

我想将我的自定义类添加到某些页面。例如

所有页面都必须是此类fixed-header例外,此路由:

/cart/step-1 

/login

此类添加或删除 body 元素。

<body className="bg-gray fixed-header" 

但我不知道如何处理这种情况?

心理学家

在您的页面目录中创建自定义_document.js_app.js

一个用于检查主体上是否存在类的小工具(为了避免重复类,感谢@juliomalves 的建议)

// ./utils/hasClasses
const hasClasses = () =>
  document.body.classList.contains("bg-gray") &&
  document.body.classList.contains("fixed-header");
export default hasClasses;

服务端渲染

在 中_document.js,使用__NEXT_DATA__prop 访问当前页面,检查页面是否在您允许的路径中,并将类添加到 body。

import Document, { Html, Head, Main, NextScript } from "next/document";

class MyDocument extends Document {

  // Add more routes here if you want to use the same classes  
  allowedRoutes = ["/login", "/cart/step-1"];

  getColor() {
    const { page } = this.props?.__NEXT_DATA__;
    if (this.allowedRoutes.includes(page))
      return "bg-gray fixed-header";
    return "";
  }

  render() {
    return (
      <Html>
        <Head />
        <body className={this.getColor()}>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;

上面的代码总是在服务器上运行。类不会附加到客户端导航的正文中。

客户端渲染

要解决上述问题,请_app.js在 a 中使用相同的逻辑useEffect,以便在客户端渲染时添加正确的类。

import { useEffect } from "react";
import { useRouter } from "next/router";
import "../styles.css";
import hasClasses from "./utils/hasClasses";

function MyApp({ Component, pageProps }) {

  const { pathname: page } = useRouter();
  const allowedRoutes = ["/login", "/cart/step-1"];

  useEffect(() => {
    if (!hasClasses() && allowedRoutes.includes(page))
      document.body.className += "bg-gray fixed-header";
    else if (hasClasses()) {
      // Don't want the styles in other pages, remove if exists.
      // Up to your implementation on how you want to handle this.
      document.body.classList.remove("bg-gray");
      document.body.classList.remove("fixed-header");
    }
  });
  return <Component {...pageProps} />;
}

export default MyApp;

这解决了客户端导航在允许的路线上正确应用类的问题。中的代码_document.js确保在服务器呈现页面时,将其发送到下游并应用正确的类,以便不会在客户端上导致不正确的样式闪烁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将自定义元素添加到ngRepeat列表

将自定义元素添加到JPopupMenu

将自定义元素添加到 wordpress 主页

如何将自己的元素(文本等)添加到 Azure AD B2C 语言自定义?

如何使用辅助函数将自定义类名称添加到Handlebars模板中的元素?

将自定义CSS类添加到WFFM表单部分的图例元素

如何在XSD中将自定义属性添加到ComplexType元素?

如何将自定义Form元素助手添加到Zend \ Form \ View \ Helper \ FormElement的类型图中?

无法显示选择字段类型元素。如何将自定义实体表示正确添加到 Sulu 表单?

如何将元素名称添加到自定义javax验证消息

sql server-对于XML Raw-将自定义属性添加到元素

将自定义元素添加到 TYPO3 默认隐藏?

将自定义元素和属性添加到编译器架构

将自定义元素添加到Froala编辑器的特定位置

将自定义元素添加到 sns.kdeplot 图例

将自定义样式规则添加到列表中的偶数元素

将自定义元素添加到 React Table pagination-top

根据视口高度将类添加到body元素

如何在javascript的body元素中添加类?

如何通过JavaScript将事件侦听器添加到body元素?

如何访问 <body> 标签之外的 <div> 元素?

如何从body标签中获取元素的索引?

将类添加到具有匹配的自定义数据属性的元素

如何只处理子DOM元素而不是body元素的滚动?

ZF2将自定义属性添加到选择表单元素中的选项

是否可以将自定义角度元素添加到 index.html 以外的组件 html

如果 DOM 中存在某些元素组合,则给出 body 类

尝试定位类并将类添加到Vue / Nuxt中的html,body和__nuxt元素时出错

如何将自定义类添加到 TinyMCE 中的自定义按钮?