微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为层或索环中的任何其他组件指定不同的主题变量

如何解决为层或索环中的任何其他组件指定不同的主题变量

我想在一个带有 Layer 背景的地方显示一个 black。所以,我使用以下主题设置:

    layer: {
      overlay: {
        background: 'black'
      }
    }

现在我想添加显示一个Layer,其中背景是transparent。我怎样才能做到这一点?我没有看到将 theme 对象传递给组件以单独更改组件的某些主题参数的方法

问题不限于Layer。同样的事情可能适用于可以使用某些主题设置进行自定义的任何其他组件,但我如何为组件单独指定此类设置。

解决方法

好问题,有几个方法和层次(双关语)可以回答这个问题,我会尽量涵盖所有内容。

拥有主题道具的想法是让您的应用程序在用户体验方面保持统一和一致。因此,通常最好保持您的主题使用的一致性,而不是覆盖它们。

话虽如此,在 Grommet 中,我们知道在某些情况下调用者希望调整每个实例的主题道具,例如使图层的覆盖层大部分为“黑色”,但根据您的建议更改应用程序中每个特定实例的颜色。

在某些情况下,答案是利用组件的 props。内联组件道具将覆盖主题属性,因此只要组件道具可用于覆盖,请尝试利用它们。例如,如果需要覆盖来自主题的容器的背景颜色,您可以通过向组件添加 background="transparent" 属性轻松覆盖它,它就可以解决问题。

对于图层叠加背景颜色的具体问题,该组件没有组件道具来启用覆盖主题道具,因此在这种情况下,您应该使用 ThemeContext,它允许您在应用程序的每个部分切换主题。假设您的应用程序内部页面使用的主题与整个应用程序不同,这里是如何设置样式的想法 具有自己独特主题的页面:

import React,{ useState } from "react";
import { render } from "react-dom";

import { grommet } from "grommet/themes";
import { Box,Button,Layer,ThemeContext,Grommet } from "grommet";

export const App = () => {
  const [show,setShow] = useState();
  return (
    <Grommet theme={grommet} full>
      <Box align="center" justify="center" fill>
        <ThemeContext.Extend
          value={{
            layer: {
              overlay: {
                background: "red"
              }
            }
          }}
        >
          <Button label="show" onClick={() => setShow(true)} />
          {show && (
            <Layer
              onEsc={() => setShow(false)}
              onClickOutside={() => setShow(false)}
            >
              <Button label="close" onClick={() => setShow(false)} />
            </Layer>
          )}
        </ThemeContext.Extend>
      </Box>
    </Grommet>
  );
};

render(<App />,document.getElementById("root"));

在此示例代码中,ThemeContext 内部的代码将使用 ThemeContext 新主题值,ThemeContext 外部的代码将使用分配给 Grommet 主题道具的主题(在本例中为“grommet”主题) ),这允许为应用程序的特定部分分配临时主题。

此解决方案主要适用于您将来想要覆盖的任何主题道具,而不是专门用于图层。为了保持代码和行为清晰,请仅在组件 props 不可用或设计强烈建议更改主题属性时才尝试使用此方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?