【问题标题】:How to switch between global CSS onclick in Gatsby?如何在 Gatsby 中的全局 CSS onclick 之间切换?
【发布时间】:2021-02-14 21:42:50
【问题描述】:

我正在盖茨比建立一个作品集网站,随着我在插图和设计方面的工作越来越多,我希望根据用户通过点击进行的选择提供多种设计选项来展示该作品。我发现了一些类似的问题,但没有一个是专门针对 Gatsby 的。

我正在使用样式化组件来创建布局,所以在我看来,只需通过一个按钮在多个全局样式表(带有字体、颜色等)之间进行交换就可以了,因此布局保持不变,但老实说,我不知道该怎么做,因为我在 Gatsby 和 Javascript 方面都是初学者。

提前致谢!

【问题讨论】:

  • 我不是 gatsby,但一种简单的方法是在 body 元素上使用不同的类。将类属性绑定到某种选择器(按钮、选择、单选……)。然后,您可以将该类添加到您想要更改的任何 CSS 选择器中。这对您有帮助吗?
  • 我知道你要去哪里,我可能会那样去那里,但对于 gatsby/react 用例,我认为下面@Ferran 建议的答案会更简洁,有助于保持以主题分隔的所有样式

标签: javascript css gatsby


【解决方案1】:

给定一个简单的<Layout> 结构,例如:

import React from "react"
import { createGlobalStyle } from "styled-components"

const GlobalStyle = createGlobalStyle`
  body {
    color: ${props => (props.theme === "purple" ? "purple" : "white")};
  }
`
export default function Layout({ children }) {
  return (
    <React.Fragment>
      <GlobalStyle theme="purple" />
      {children}
    </React.Fragment>
  )
}

您可以通过添加布尔运算符来切换&lt;GlobalStyle&gt;,轻松地将onClick 事件附加到children,例如:

export default function somePage(){
   const [defaultStyles, setDefaultStyles]=useState(false);

   const handleChange=()=>setDefaultStyles(!defaultStyles)
   
   return <Layout defaultStyles={defaultStyles}>
      <h1 onClick={handleChange}> Click me to toggle the global styles</h1>
   </Layout>

}

基本上,您正在创建一个布尔状态(最初设置为false)以在默认样式之间进行更改。该状态的结果(通过单击&lt;h1&gt; 进行切换)将向上发送到您的&lt;Layout&gt;,因此:

import React from "react"
import { createGlobalStyle } from "styled-components"

const GlobalStyle = createGlobalStyle`
  body {
    color: ${props => (props.theme === "purple" ? "purple" : "white")};
  }
`
export default function Layout({ children, defaultStyles }) {
  return (
    <React.Fragment>
      {defaultStyles && <GlobalStyle theme="purple" />}
      {children}
    </React.Fragment>
  )
}

&amp;&amp; 运算符将仅在 defaultStylestrue 时呈现 &lt;GlobalStyle&gt;。根据您的需要调整它或根据需要添加三元条件。

【讨论】:

  • 是的!这绝对可以工作。实际上,我刚刚了解了 useState() 在构建全屏切换导航菜单方面的知识。如果我只在 2 种样式之间切换,这是非常有意义的,如果我有 3 种或更多样式选项,我可以修改吗?我真的只熟悉切换/布尔上下文中的 useState,但是查看文档,这似乎是可能的?
  • 是的,当然!它始终取决于您的用例和要求,但这种方法完全可行且可扩展
猜你喜欢
  • 2013-12-09
  • 2019-04-25
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多