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

React项目中如何将下拉组件选中值作为另一组件的筛选值?

问题描述

我有一个从SQL Server数据库获取政策区域列表的下拉组件,选中的政策区域存入selectedPolicyArea的useState(已将状态提升至父组件,可通过props在其他组件中使用)。还有一个CurrentPolicyStakeholder组件,需要展示对应政策区域的负责人,且当选政策区域变更时同步更新负责人名称(例如:选中Policy Area 1时显示John Doe,选中Policy Area 8时显示Jane Doe)。

尝试过用if/else和三元运算符做条件渲染,但始终返回Stakeholder表中的全部名称;也考虑过在getCurrentActivePolicyStakeholder的SQL查询WHERE子句中使用模板字符串,但未能成功实现,需要相关帮助与建议。


解决方案

1. 后端修改:支持按政策区域过滤负责人

修改API接口(新增查询参数)

更新/GetStakeholder接口,接收前端传递的政策区域名称作为查询参数:

app.get('/GetStakeholder', async(req,res) =>{
    console.log('stakeholder called');
    // 获取前端传入的政策区域参数
    const policyAreaName = req.query.policyAreaName;
    const stakeholderName = await dbOperations.getCurrentActivePolicyStakeholder(policyAreaName)
    res.send(stakeholderName.recordset)
    console.log('called');
})

修改SQL查询(使用参数化查询避免注入)

更新getCurrentActivePolicyStakeholder方法,添加参数化过滤条件,精准匹配选中的政策区域:

const getCurrentActivePolicyStakeholder = async(policyAreaName) => {
    try {
        let pool = await sql.connect(config);
        let stakeholderName = await pool.request()
        // 定义参数化查询变量,防止SQL注入
        .input('policyAreaName', sql.NVarChar, policyAreaName)
        .query(`SELECT S.[Stakeholder_ID]
                ,S.[Employee_ID]
                ,S.[Employee_Preferred_Full_Name]
                ,S.[Stakeholder_Role_ID]
                ,S.[Stake_Table_Name]
                ,S.[Stake_Table_PrimaryKey_ColName]
                ,S.[Stake_Table_PrimaryKey_ID]
                ,PA.Policy_Area_Name
        
                FROM [LegoTest].[dbo].[Stakeholder] S
                join [LegoTest].[dbo].[Policy_Area] PA  ON PA.Policy_Area_ID = S.Stake_Table_PrimaryKey_ID

                WHERE S.Stake_Table_Name = 'Policy_Area'
                -- 添加政策区域过滤条件
                AND PA.Policy_Area_Name = @policyAreaName`
            )
        return stakeholderName;
    }
    catch(error) {
        console.log(error);
    }
}

2. 前端CurrentPolicyStakeholder组件修改

同步请求逻辑与渲染逻辑

调整组件逻辑,让它在selectedPolicyArea变化时重新请求对应数据,并正确渲染结果:

import React, { useEffect, useState } from 'react';

const CurrentPolicyStakeholder = (props) => {
    const [stakeholder, setStakeholder] = useState([]);

    useEffect(() => {
        // 未选中政策区域时,清空数据
        if (!props.selectedPolicyArea) {
            setStakeholder([]);
            return;
        }

        const fetchStakeholder = async () => {
            try {
                // 传递政策区域参数到后端接口
                const response = await fetch(`/GetStakeholder?policyAreaName=${encodeURIComponent(props.selectedPolicyArea)}`);
                const data = await response.json();
                setStakeholder(data);
            } catch (error) {
                console.error('Error fetching stakeholder:', error);
                setStakeholder([]);
            }
        };
        fetchStakeholder();
    }, [props.selectedPolicyArea]); // 依赖选中的政策区域,值变化时触发请求

    return(
        <div>
            <h3>Current Stakeholder</h3>
            {stakeholder.length === 0 ? (
                <p>请选择一个政策区域</p>
            ) : (
                <ul>
                    {stakeholder.map((item) => (
                        <li key={item.Stakeholder_ID}>
                            {item.Employee_Preferred_Full_Name}
                        </li>
                    ))}
                </ul>
            )}
        </div>
    );
}
    
export default CurrentPolicyStakeholder;

3. 可选优化:下拉组件内部状态简化

由于状态已提升至父组件,下拉组件内部无需维护冗余的selectedPolicyArea状态,直接使用props传递的值即可:

import React, { useState, useEffect } from 'react';

const DropdownGetPolicyArea = (props) => {
 const [policyAreaName, setPolicyAreaName] = useState([]);

 useEffect(() => {
    fetch('/GetPolicyAreaName', {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      }
    })
      .then(res => res.json())
      .then(data => setPolicyAreaName(data))
      .catch(error => console.error('Error fetching data: ', error));
 }, []);

 const handleChange = (event) => {
    props.setSelectedPolicyArea(event.target.value);
 };

 return (
    <div className='DropdownGetPolicyArea'>
      <h2>Policy Area Name</h2>
      <select value={props.selectedPolicyArea} onChange={handleChange}>
        <option value=''>...</option>
        {policyAreaName.map((category) => (
          <option key={category.Policy_Area_ID} value={category.Policy_Area_Name}>
            {category.Policy_Area_Name}
          </option>
        ))}
      </select>
    </div>
 );
};

export default DropdownGetPolicyArea;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:54:53