在 React 中,我从 mongo 调用两个列表到页面,我想单击一个来过滤其他列表中显示的内容

IT技术 javascript reactjs mongodb
2021-04-28 16:00:07

这是我页面的相关部分,希望能让它更清晰

我正在做一个项目,我有 2 个 mongo 集合,集合 A(症状列表)都包含与它们相关的集合 B(条件)中的项目。

    "_id" : ObjectId("5dc4bc92b6523a203423f2fa"),
    "name" : "Cough",
    "symptoms" : [ 
        ObjectId("5dc4bc19299dfc46843a65f0"), 
        ObjectId("5dc4bc19299dfc46843a65f2")
    ]

反之亦然

    "_id" : ObjectId("5dc4bc19299dfc46843a65f0"),
    "name" : "Lung Cancer",
    "description" : "blah blah string",
    "symptoms" : [ 
        ObjectId("5dc4bc92b6523a203423f2fa")
    ]

我调用它们的代码如下所示

class Home extends React.Component {
    state = {
        conditions: [],
        symptoms: [],
    }
    componentDidMount() {
        this.getConditionsMethod();
        this.getSymptomsMethod();
    }
    getConditionsMethod = () => {
        API.getConditions()
            .then(data => {
                console.log(data);
                data.data.sort((a, b) => a.name.localeCompare(b.name));
                this.setState({
                    conditions: data.data
                })
            })
            .catch(err => console.log(err))
    };
    getSymptomsMethod = () => {
        API.getSymptoms()
            .then(data => {
                console.log(data);
                data.data.sort((a, b) => a.name.localeCompare(b.name));
                this.setState({
                    symptoms: data.data
                })
            })
            .catch(err => console.log(err))
    };

和我的相关部分 render() {return (

                    <Col >
                        <Row>
                            <Col className="symp">
                                <div className="doubleCol">
                                    {this.state.symptoms.map(item => (
                                        <ListItem key={item.ObjectID}>
                                            <input
                                                type="radio"
                                                name="selector"
                                                value="option 2"
                                                checked={false}
                                                className="sympCheck"
                                            />
                                            {item.name}
                                        </ListItem>
                                    ))}
                                </div>
                            </Col>
                        </Row>
                        <Row>
                            <Col className="cond">
                                <div className="doubleCol">
                                    {this.state.conditions.map(item => (
                                        <ListItem key={item.ObjectID}>
                                            {item.name}
                                        </ListItem>
                                    ))}
                                </div>
                             </Col>
                        </Row>
                    </Col>

我目前在症状列表上的按钮实际上并没有做任何事情。目标是单击按钮时,条件列表将仅显示具有该症状的那些条件,而不是呈现所有这些条件。我已经想到了一些可能有效但实际上还没有开始试验的方法。任何帮助或将我指向正确的方向都会很棒,这样我就不会在“这可能是一种方法,没有用”的兔子洞中浪费太多时间

2个回答

首先,您发布的第一个代码块中可能有一些拼写错误。咳嗽(一种症状)应该有一系列条件,而不是一系列其他症状,对吗?

无论如何,您可能希望包含一个名为“selectedSymptom”之类的状态属性,每次您选择不同的症状时都会更新该属性。

然后在“条件”部分中,您无需呈现完整的条件列表,而只需筛选在其症状数组中包含 selectedSymptom 的条件即可。  

{this.state.conditions
  .filter(condition => condition.symptoms.includes(this.state.selectedSymptom))
  .map(item => (
    <ListItem key={item.ObjectID}>
       {item.name}
    </ListItem>
  ))
}

你可以有另一个状态变量,比如“selectedSymptom”。然后单击单选按钮,定义一个基本上调用 setState 并更新“selectedSymptom”值的方法。此外,更改地图逻辑

<Col className="cond">
                                <div className="doubleCol">
                                    {this.state.conditions.map(item => (
                                        <ListItem key={item.ObjectID}>
                                            {item.name}
                                        </ListItem>
                                    ))}
                                </div>
                             </Col>

根据选定的症状进行过滤。任何时候设置状态变量时,都会调用重新渲染,它会根据 selectedSymptom 自动过滤列表。希望有帮助。