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

React中如何将导航栏下拉菜单的值传递给其他组件

如何将导航栏下拉菜单的选中值传递给页面组件

核心思路:使用React Context共享状态

你的导航栏(NavBar)在BrowserRouter外部,没法直接通过路由props传递状态,最简洁的方式是用React Context来跨组件共享选中的用户状态,所有需要这个值的组件都能直接获取。

步骤1:创建用户状态Context

新建UserContext.js文件,封装状态和上下文:

import { createContext, useContext, useState, useEffect } from 'react';

const UserContext = createContext();

// 提供状态的Provider组件
export function UserProvider({ children }) {
  // 初始化状态,可选从localStorage读取解决页面重置问题
  const [selectedUserId, setSelectedUserId] = useState(() => {
    return localStorage.getItem('selectedUserId') || 'user1';
  });

  // 可选:同步状态到localStorage,解决页面切换/刷新重置
  useEffect(() => {
    localStorage.setItem('selectedUserId', selectedUserId);
  }, [selectedUserId]);

  return (
    <UserContext.Provider value={{ selectedUserId, setSelectedUserId }}>
      {children}
    </UserContext.Provider>
  );
}

// 自定义Hook,简化Context调用
export function useUser() {
  return useContext(UserContext);
}

步骤2:在App中包裹Provider

修改App.js,用UserProvider包裹整个应用,让所有组件都能访问Context:

import { UserProvider } from './UserContext';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import NavBar from './NavBar';
import Home from './Home';
import Buckets from './Buckets';
import Tables from './Tables';

function App() {
  return (
    <UserProvider>
      <div className="App">
        <NavBar />
        <BrowserRouter>
          <Routes>
            <Route path='/' element={<Home />} />
            <Route path='/Buckets' element={<Buckets />} />
            <Route path='/Tables' element={<Tables />} />
          </Routes>
        </BrowserRouter>
      </div>
    </UserProvider>
  );
}

export default App;

步骤3:修改UserList组件使用Context状态

去掉UserList自己的useState,改用Context提供的状态和设置方法:

import { useUser } from './UserContext';

const UserList = ({ Users }) => {
  const { selectedUserId, setSelectedUserId } = useUser();

  const optionTemplate = Users.map(v => (
    <option key={v.id} value={v.id}>{v.user}</option>
  ));

  function handleClick() {
    console.log('模拟登录用户ID:', selectedUserId);
    // 这里可以添加模拟登录的逻辑,比如更新全局token等
  }

  return (
    <div className="dropdown">
      <label className='label'>
        Account: 
        <select 
          value={selectedUserId} 
          onChange={(e) => setSelectedUserId(e.target.value)}
        >
          {optionTemplate}
        </select>
      </label>
      <button onClick={handleClick}>Login</button>
    </div>
  );
};

export default UserList;

步骤4:在Buckets组件中获取选中用户并发起请求

在需要使用选中用户的页面组件中,通过useUserHook获取状态,然后在useEffect中发起请求:

import { useUser } from './UserContext';
import { useEffect, useState } from 'react';

const Buckets = () => {
  const { selectedUserId } = useUser();
  const [buckets, setBuckets] = useState([]);

  // 当选中用户变化时,重新请求数据
  useEffect(() => {
    fetch(`http://localhost:8000/Buckets?userId=${selectedUserId}`)
      .then(res => res.json())
      .then(data => setBuckets(data))
      .catch(err => console.error('获取Buckets数据失败:', err));
  }, [selectedUserId]);

  return (
    <div>
      <h2>Buckets (当前模拟用户: {selectedUserId})</h2>
      <ul>
        {buckets.map(bucket => (
          <li key={bucket.id}>{bucket.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default Buckets;

为什么不用props传递?

因为你的NavBar在BrowserRouter外面,页面组件是BrowserRouter的子元素,属于不同的组件分支,用props传递需要层层透传,非常繁琐,Context是最适合这种跨组件分支共享状态的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:33:22