【问题标题】:useColorMode imported from Theme UI plugin in React-based GatsbyJS doesn't work due to "InvalidCharacterError: String contains an invalid character"由于“InvalidCharacterError:字符串包含无效字符”,从基于 React 的 GatsbyJS 中的主题 UI 插件导入的 useColorMode 不起作用
【发布时间】:2020-08-16 19:59:11
【问题描述】:

编译后收到两个错误:

  • TypeError: setMode is not a function;
  • InvalidCharacterError: String contains an invalid character:

检查我的整个代码:

/** @jsx jsx */

import { jsx, Styled, useColorMode } from 'theme-ui'
import { Context } from '../../common'
import SelectLanguage from './SelectLanguage'
import { Navegador, Input, Label, Submenu, StyledHeader } from './styles'

function Header() 
{
  const themes = ['deep', 'funk', 'future', 'swiss'];
  const modes = ['default', 'dark'];
  const [mode, setMode, setTheme, theme] = useColorMode()
  
  return (

    <Styled.root>
      <Context.Consumer>
        {({ toggleLanguage, lang }) => (
          <StyledHeader>
            <Navegador id="menu">
              <li>
                  <SelectLanguage lang={lang} toggleLanguage={toggleLanguage} />
              </li>

              <li>
                <Input id="modes" type="checkbox" name="menu"/>
                <Label for="modes">Modes</Label>
                <Submenu className="submenu">
                  <li onClick={e => setMode("default")}> Light </li>
                  <li onClick={e => setMode("dark")}> Dark </li>
                </Submenu>
              </li>

              <li>
                <Input id="themes" type="checkbox" name="menu"/>
                <Label for="themes">Themes</Label>
                <Submenu className="submenu">
                  <li onClick={e => setTheme("deep")}> Deep </li>
                  <li onClick={e => setTheme("funk")}> Funk </li>
                  <li onClick={e => setTheme("future")}> Futuristic </li>
                  <li onClick={e => setTheme("swiss")}> Swiss </li>
                </Submenu>
              </li>
              
            </Navegador>
          </StyledHeader>
        )}
      </Context.Consumer>
    </Styled.root>
  )
}

export default Header

【问题讨论】:

    标签: javascript reactjs jsx gatsby theme-ui


    【解决方案1】:

    查看您提供的文档链接,useThemeUI 挂钩返回值似乎包含 themecomponentscolorModesetColorMode 属性。您可以使用该钩子而不是 useColorMode 钩子。并将您的modesetMode 变量分别更改为colorModesetColorMode。这可以解决 “setMode 不是函数” 问题,同时仍然允许您访问主题属性。

    同样的setMode 问题可能是您遇到的invalidCharacterError 的根本原因。因此,解决该问题也可能导致此错误消失。否则请查看您应该使用的字符集。这些天最常见的是utf8。如果您的应用程序包含变音符号、变音符号、象形文字等,您可能必须为该用例使用适当的字符集。

    还要验证setThemeuseThemeUI 挂钩返回值的有效属性。很像setMode,您提供的文档中没有提到它。它可能不存在。

    【讨论】:

    • 我很抱歉我的缺席,仍然为我的错误。我犯了一个错误,因为我忘记更新文件链接,因为该网站已过期共享链接。我切换到谷歌云端硬盘。请再次检查链接。实际上,setColorModesetMode 是变量。一个用于颜色切换器,另一个用于深色和浅色模式。
    • 别担心,你能把它加载到codesandbox.io吗?如果需要,以这种方式复制和调试会更容易。
    • 应用程序未加载。 Codesandbox 产生此错误:“无法获取依赖项,请在几秒钟后重试:无法读取未定义的属性‘名称’”。您是否碰巧知道它们可能是哪些依赖项?
    • 我选择了错误的沙箱,因为它是基于 React 的。我分叉了基于 Gatsby 的沙箱,它工作了。奇怪的是,它在 CodeSandbox 上工作,因为它显示它是setTheme。你是对的。我将setTheme 更改为setMode。有效。但它在本地不起作用,它给出了同样的错误。我把codesandbox.io/s/i81n-smakosh-gatsby-7q476留给你。我认为最好在本地进行测试和发现。
    猜你喜欢
    • 2020-12-10
    • 2019-06-01
    • 2019-09-16
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    相关资源
    最近更新 更多