首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将useState设置器作为函数参数传递?

如何将useState设置器作为函数参数传递?
EN

Stack Overflow用户
提问于 2021-01-19 06:20:58
回答 2查看 168关注 0票数 0

我有一个代码,在按钮点击时在深色主题和浅色主题之间切换,如下所示:

App.js:

代码语言:javascript
复制
import React, { useState } from "react";
import Card from "./Card";
import { ChangeTheme } from "./functions/ChangeTheme";

export default function App() {
  const [theme, setTheme] = useState("dark-theme");

  const changeTheme = (theme) => {
    return theme === "dark-theme" ? setTheme("") : setTheme("dark-theme");
  };

  return (
    <div className="App">
      <Card theme={theme} changeTheme={() => ChangeTheme(theme)} />
    </div>
  );
}

Card.js:

代码语言:javascript
复制
import React from "react";
import "./Card.scss";

const Card = ({ theme, changeTheme }) => {
  return (
    <>
      <div className={theme}>Card title</div>
      <button onClick={changeTheme}>Click me</button>
    </>
  );
};

export default Card;

Card.scss:

代码语言:javascript
复制
.dark-theme {
  color: green;
}

上面的代码运行良好。此处的工作示例:https://codesandbox.io/s/zealous-water-y1j0o

现在,我想将changeTheme提取到一个单独的函数中。我尝试将themesetTheme作为参数传递给ChangeTheme

ChangeTheme.js

代码语言:javascript
复制
export const ChangeTheme = ({ theme, setTheme }) => {
  return theme === "dark-theme" ? setTheme("") : setTheme("dark-theme");
};

并像这样在App.js中使用它:

代码语言:javascript
复制
import React, { useState } from "react";
import Card from "./Card";
import { ChangeTheme } from "./functions/ChangeTheme";

export default function App() {
  const [theme, setTheme] = useState("dark-theme");

  return (
    <div className="App">
      <Card theme={theme} changeTheme={() => ChangeTheme(theme, setTheme)} />
    </div>
  );
}

我得到了一个错误:setTheme is not a function,你知道为什么和如何解决它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-19 06:42:44

函数有两个参数,而不是一个

使用codesandbox更新:)

https://codesandbox.io/s/holy-thunder-tbgd6

并改进了条件(三元)运算符

代码语言:javascript
复制
export const changeTheme = (theme, setTheme) => {
  setTheme(theme === "dark-theme" ? "" : "dark-theme");
};
票数 4
EN

Stack Overflow用户

发布于 2021-01-19 06:29:41

您需要在App.js中将参数作为对象键传递

代码语言:javascript
复制
// Lacks {}
ChangeTheme(theme, setTheme)

// Change to:
ChangeTheme({theme, setTheme})

因此,App组件变成:

代码语言:javascript
复制
export default function App() {
  const [theme, setTheme] = useState("dark-theme");

  return (
    <div className="App">
      <Card theme={theme} changeTheme={() => ChangeTheme({theme, setTheme})} />
    </div>
  );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65782845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档