简体   繁体   English

如何在另一个组件中使用一个组件的常量

[英]How to use const of one component in another component

I'm new to reactjs. I'm trying to implement a toggleTheme action in every page of my project.我是 reactjs 的新手。我正在尝试在项目的每个页面中实施一个 toggleTheme 操作。

So, Instead of declaring it in every component, I thought of creating a toggle theme component itself and import it in all other components.因此,我没有在每个组件中声明它,而是考虑自己创建一个切换主题组件并将其导入所有其他组件。

I don't know why but for some reason it is not working properly.我不知道为什么,但由于某种原因它无法正常工作。

Here is my code... toggletheme.js这是我的代码... toggletheme.js

import Brightness4Icon from '@material-ui/icons/Brightness4';
import Brightness7Icon from '@material-ui/icons/Brightness7';
import React, { useState } from 'react';
import './BasePage.css';

const ToggleTheme = (isLight, setLight) => {
  [isLight, setLight] = useState("true");
  const toggleTheme = () => {
    setLight(!isLight);
  }
  console.log(isLight)
  return (
    <div className="themebtn" onClick={toggleTheme}>
      {isLight ? <Brightness7Icon /> : <Brightness4Icon />}
    </div>
  )
}

export default ToggleTheme

Another component in which I want to import toggletheme component basepage.js我要在其中导入 toggletheme 组件 basepage.js 的另一个组件

import ToggleTheme from './ToggleTheme'
import React, { useState } from 'react';

const Basepage = () => {
  return (
   <div className={isLight ? "light" : "dark"}>
    <div>
      <ToggleTheme />
    </div>
   </div>
  )
}

export default Basepage

basepage.css basepage.css

.light {
  --background: #ffffff;
  --background-color: #f1f1f1;
  --blue: #1b98f5;
  --foreground: #323234;
  --shadow: 4px 4px 4px #aaa;
}

.dark {
  --background: #323234;
  --background-color: #202124;
  --blue: #1b98f5;
  --foreground: #f1f1f1;
  --shadow: 4px 4px 4px #222;
}

I'm getting at isLight in my basepage.js我在我的 basepage.js 中找到了 isLight

I would appreciate some help in rectifying it.我将不胜感激一些帮助来纠正它。 Thank you.谢谢。

It is very simple, because you are using a string "true" to set the initial state of the variable in your file toggletheme.js and remember that a string with characters is always true , that is why in the ternary operator you asked if the variable was true or not, and it returns always true .这非常简单,因为您使用字符串"true"来设置文件 toggletheme.js 中变量的初始值toggletheme.js并记住带有字符的字符串始终为true ,这就是为什么在三元运算符中您询问是否变量是否为真,它总是返回true

Just change this useState("true") to useState(true) .只需将此useState("true")更改为useState(true)即可。

import Brightness4Icon from '@material-ui/icons/Brightness4';
import Brightness7Icon from '@material-ui/icons/Brightness7';
import React, { useState } from 'react';
import './BasePage.css';

const ToggleTheme = (isLight, setLight) => {
  [isLight, setLight] = useState(true);
  const toggleTheme = () => {
    setLight(!isLight);
  }
  console.log(isLight)
  return (
    <div className="themebtn" onClick={toggleTheme}>
      {isLight ? <Brightness7Icon /> : <Brightness4Icon />}
    </div>
  )
}

export default ToggleTheme
const ToggleTheme = ({isLight, setLight}) => {
  const toggleTheme = () => {
    setLight(!isLight);
  }
  console.log(isLight)
  return (
    <div className="themebtn" onClick={toggleTheme}>
      {isLight ? <Brightness7Icon /> : <Brightness4Icon />}
    </div>
  )
}

const Basepage = () => {
  const [isLight, setLight] = React.useState(true);
  return (
   <div className={isLight ? "light" : "dark"}>
    <div>
      <ToggleTheme isLight={isLight} setLight={setLight} />
    </div>
   </div>
  )
}

I have majorly used chakra-ui and I have hated the fact that you can use true and false to set the theme, what if you choose to have a different theme down the road?我主要使用 chakra-ui,我讨厌你可以使用 true 和 false 来设置主题,如果你以后选择不同的主题怎么办?

import Brightness4Icon from '@material-ui/icons/Brightness4';
import Brightness7Icon from '@material-ui/icons/Brightness7';
import { useEffect, useState } from 'react';
const useTheme = () => {
  let themes=['light','dark'];
  let icons =[ <Brightness7Icon /> , <Brightness4Icon />]
  const [icon,setIcon]=useState(<Brightness7Icon />);
  let [theme, setTheme] = useState("light");
  let changeTheme=()=>{
    let index =themes.indexOf(theme)
    if(index==themes.length-1)
    {
      setTheme(themes[0]);
      setIcon(icons[0]);
    }
    else{
      setTheme(themes[index+1]);
      setIcon(icons[index+1]);
    }
  }
  useEffect(()=>{

  },[theme])
  return ([theme,changeTheme,<div onClick={changeTheme}>{icon}</div>])
}

export default useTheme
import useTheme from './toggle'
import React from 'react';

const Basepage = () => {
  let [theme,changeTheme,icon] = useTheme();
  return (
   <div className={theme}>
    <div>
    {icon}
    </div>
   </div>
  )
}
export default Basepage

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM