You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何将函数传递给组件实现Navbar暗亮模式切换

修改方案

你只需要按以下两步调整代码,即可将切换主题的方法传递到Navbar组件中使用:

1. 调整App.tsx,传递props给Navbar组件

在渲染Navbar的位置,将toggleTheme方法和当前theme状态作为参数传递,调整后代码如下:

import React, { useState } from "react";
import logo from "./assets/logo.png";
import "./App.css";
import Navbar from "./components/Navbar/Navbar";
import "bootstrap/dist/css/bootstrap.min.css";
import { ThemeProvider } from "styled-components";
import { lightTheme, darkTheme } from "./theme";
import { GlobalStyles } from "./global";

function App() {
  
  const [theme, setTheme] = useState("light");

  function toggleTheme() {
    if (theme === "light") {
      setTheme("dark");
    } else {
      setTheme("light");
    }
  };

  return (
    <ThemeProvider theme={theme === "light" ? lightTheme : darkTheme}>
      <GlobalStyles />
      <div className="App">
        {/* 传递toggleTheme和当前theme给Navbar */}
        <Navbar toggleTheme={toggleTheme} currentTheme={theme}/>
        {/* 原app.tsx里的测试切换按钮可以删除 */}
        <div className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1>linusromland.com</h1>
        </div>
      </div>
    </ThemeProvider>
  );
}

export default App;

2. 调整Navbar.tsx,接收并使用传入的props

因为你使用的是类组件,直接通过this.props访问父组件传入的参数,给切换按钮绑定点击事件,同时可以根据当前主题动态切换展示的图标。如果是TypeScript环境,建议先定义Props类型避免类型报错,调整后代码如下:

import React from "react";
import BSNavbar from "react-bootstrap/Navbar";
import Container from "react-bootstrap/Container";
import Nav from "react-bootstrap/Nav";
import Button from "react-bootstrap/Button";
import "./Navbar.css";
import "bootstrap/dist/css/bootstrap.min.css";
import lightmode from "../../assets/lightmode.svg";
import darkmode from "../../assets/darkmode.svg";

// TypeScript下定义props类型,纯js环境可以删掉这部分
interface NavbarProps {
  toggleTheme: () => void;
  currentTheme: 'light' | 'dark';
}

// 类组件继承时传入props类型,纯js环境直接写React.Component即可
class Navbar extends React.Component<NavbarProps> {

  render() {
    return (
      <div className="Navbar" data-testid="Navbar">
        <BSNavbar bg="light" expand="lg">
          <Container className="col-5">
            <BSNavbar.Brand href="/">Linus Romland</BSNavbar.Brand>
            <BSNavbar.Toggle />
            <BSNavbar.Collapse className="justify-content-end">
              <Nav>
                <Nav.Link href="/" className="text-dark">
                  Home
                </Nav.Link>
                <Nav.Link
                  href="https://github.com/linusromland/"
                  className="text-dark"
                >
                  GitHub
                </Nav.Link>
                <Nav.Link href="/about" className="text-dark">
                  About
                </Nav.Link>
                {/* 绑定toggleTheme事件,动态切换图标 */}
                <Button variant="light" onClick={this.props.toggleTheme}>
                  <img 
                    src={this.props.currentTheme === 'light' ? lightmode : darkmode} 
                    alt="Darkmode/Lightmode change" 
                  />
                </Button>
              </Nav>
            </BSNavbar.Collapse>
          </Container>
        </BSNavbar>
      </div>
    );
  }
}

export default Navbar;

调整完成后,点击Navbar里的主题按钮即可正常切换亮/暗模式,同时图标会跟随当前主题自动切换。

内容的提问来源于stack exchange,提问作者Linus Romland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:45:03