当前位置: 首页 > 知识库问答 >
问题:

如何通过带有TypeScrips界面的道具发送usestate并作出反应?

常永怡
2023-03-14

我正在尝试做一个浅色/深色的主题。我有两个组件。第一个组件如下所示。我成功地创建了一个布尔值来更改组件中的样式。到目前为止还不错:

js lang-js prettyprint-override">export interface  Props{

  theme:boolean;

}

const Theme: FC<Props> = ({theme}) => {
  const [light,setLightMode]=useState(false);
  return (
    <div>
      <div className="card__theme">
        <div className={light ? "card__light" : "card__light--active"}>Light</div>
        <Switch inputProps={{ "aria-label": "controlled" }} onChange={()=>setLightMode(!light)}/>
        <div className={ light ? "card__Dark" : "card__Dark--active"}>Dark</div>
      </div>
    </div>
  );
};

我现在要做的就是在我的主页上使用这个组件,我想在这里做同样的事情。我想改变我的组件的样式,使2个类名像上面的代码一样具有布尔状态。我面临的问题是,我无法在我的主组件中生成另一个onChange={}函数。首先,我不在接口中发送函数。我想要我的const[light,setLightMode]=useState(false);我的函数onChange={()=

const Home: FC = () => {
  const percentage = 91;
  const [dark,setDark] = useState(false);

  return (
    <div>2
      <div className="Container-body">
        <div className="card">
          <div className={dark ? "card__theme" : "card__theme--active"}>
            <Theme theme={dark} onChange={()=>{setDark(!dark)}}/>
          </div>

所以,让它排序。我只想在我的主组件中使用我的主题组件中的light、setlightTheme布尔状态。我不知道我怎么能用打字稿发送这个道具。。。

这是一个带有我的代码的打印:在这里输入链接描述

共有2个答案

孙昂然
2023-03-14

所以如果我理解正确的话,你只需要提供一个选项来切换明暗模式。从架构的角度来看,您不希望在组件级别执行此操作,因为多个组件可能需要更改。

在我提出正确的解决方案之前,您目前在这一行中犯了一个BEM错误:

 <div className={dark ? 'card__light' : 'card__light--active'}>

修饰符--修饰符只能与实际元素一起存在。因此,在完全输出的超文本标记语言上,这是有效的card__lightcard__light--active,但是在您的示例中,要么是card__light,要么是card__light--active正在呈现。

当切换一个暗/亮主题时,你要么想通过使用像Redux这样的东西使这个值(真或假)在集中状态下可用,要么你可能想在你的根组件上声明它(通常是

我不建议在这个用例中使用prop-drilling,因为从长远来看,它会使代码变得混乱。这是一个非常好的上下文API用例。

✅参见工作示例Playground。

另外,我使用Typescript来获得更好的代码,你可以忽略你不知道的语法。

React文档中有一个确切的示例,您可以看到文档主题切换。

谭越
2023-03-14

我不确定我是否理解正确,但我认为您的目标是将onChange函数从父组件传递给主题组件。如果是这样的话,我希望这个片段可以帮助你。基本上,我在接口中添加了onChange参数作为函数。我还将theme参数重命名为dark。为了使这两个组件协同工作,我删除了主题组件中的useState,并使用dark变量(取自父组件)来管理样式。

export interface Props {
  dark: boolean;
  onChange?: () => void;
}

const Theme: FC<Props> = ({ dark, onChange }) => {
  return (
    <div>
      <div className="card__theme">
        <div className={dark ? 'card__light' : 'card__light--active'}>
          Light
        </div>
        <Switch
          inputProps={{ 'aria-label': 'controlled' }}
          onChange={onChange}
        />
        <div className={!dark ? 'card__Dark' : 'card__Dark--active'}>Dark</div>
      </div>
    </div>
  );
};
 类似资料:
  • 我在通过C#API中的WebClient发送POST请求时遇到问题。该职位要求如下: 我知道如何处理像用户代理等标题。,但是我对边界有一个问题。我不知道怎么把它们放在哪里...

  • 我有许多元素,大小相同,但颜色不同。因此我创建了一个组件'colors.jsx',其中有以下代码 问题是我得到了这些错误: /src/Colors.jsx:意外标记,应为“,”(6:59) 4函数颜色(props){ 5返回( 6 ^7); 8} 9 4函数颜色(props){ 5返回( 6 ^7); 8} 9 分析错误:意外标记,应为“,” 4函数颜色(props){ 5返回( 6 ^7); 8

  • 我想将我的应用程序入口点用作全局状态存储。将信息作为道具传递给孩子们。 使用react-router 4,如何将prop数据发送到渲染的组件。以类似的方式: 我见过一些旧版本react router的简陋变通方法,这些方法似乎已被弃用。 在v4中这样做的正确方法是什么?

  • 我正在使用React&Material-UI为一个项目中的数据表构建一个带有复选框的筛选选项。我不确定哪种方法是实现这一点的最佳方法。 > 是否有使用Material-UI的自定义解决方案? 如果不是,有什么方法来实现这一点?我是一个新手,所以我很难把所有的碎片放在一起。 这是我得到的东西: 复选框组件: 表组件: 您可以在这里找到一个代码示例。 任何帮助在哪种方式构建这个功能将是真正的感激!

  • 我有下面的代码从消息生成嵌入,它现在可以正常工作。我想要的是,在创建嵌入后,bot应该要求用户提到一个频道,在用户提到一个频道后,bot应该将该嵌入发送到那里。我该怎么做?

  • 问题内容: 是否有用于NodeJS的库,用于发送带有附件的邮件? 问题答案: 是的,这非常简单,我使用nodemailer: 然后阅读文件并发送电子邮件: