react:我可以基于道具在可重用组件中创建动态数量的状态吗?

fnatzsnv  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(159)

我正在进行一个附带项目,其中我有条件地希望根据用户的回答向他们提出一系列问题。我谨此命令:
步骤1.我询问用户是否拥有特定的帐户/会员资格步骤2.如果是,我将显示一系列问题,如果他们在该帐户/会员资格步骤3中拥有评级。如果是,我将显示一个输入,询问他们特定的评级
为了实现这一点,我有一个父组件来询问初始问题(步骤1)。我有一个可重用的子组件,它有条件地为步骤1(步骤2)中的每个问题显示,并且每个问题都来自于道具。然后我有了第二个可重用组件,该组件在第2步中有条件地显示,它要求评级,并且它的措辞也来源于道具(第3步)
我的挑战是,在第2步中,我希望我的组件有n个状态,其中n是我传递给它的数组的大小,这样我就可以跟踪是否应该在第3步中显示每个问题。是否有方法做到这一点,或者有更优雅的解决方案?理论上,我可以在这个组件树的顶部对每个状态进行硬编码,然后将状态作为道具传递,但我认为有一种更优雅的方法可以做到这一点。
我的代码如下:
初始表格(步骤1)

export default function ChessForm() {
    const [FIDE, setFide] = useState(false)
    const [USCF, setUSCF] = useState(false)
    const [Chesscom, setChesscom] = useState(false)
    const [LiChess, setLiChess] = useState(false)

    return (
        <Form>
            <p>Please fill out the below form</p>
            <Form.Group>
                <Form.Label className='mx-2'>Do you have a FIDE membership?</Form.Label>
                <Form.Check inline label='Yes' value={true} name='FIDE' type='radio' className = 'mx-2' name='FIDE'  onClick = {()=>{setFide(true)}}/>
                <Form.Check inline label='No' value ={false} name='FIDE'  type='radio' className = 'mx-2' defaultChecked  onClick={()=>{setFide(false)}}  />
            </Form.Group>

            {FIDE && <MembershipForm inputs={['standard', 'rapid', 'blitz']} name='FIDE'/>}

            <Form.Group>
                <Form.Label className = 'mx-2'>Do you have a USCF membership?</Form.Label>
                <Form.Check inline label='Yes' name='USCF' type='radio' className = 'mx-2'  onClick={()=>{setUSCF(true)}} />
                <Form.Check inline label='No' name='USCF'  type='radio' className = 'mx-2' defaultChecked onClick={()=>{setUSCF(false)}} />
            </Form.Group>

            {USCF && <MembershipForm inputs={['regular', 'quick', 'blitz']} name='USCF'/>}

            <Form.Group>
                <Form.Label className = 'mx-2'>Do you have a Chess.com account?</Form.Label>
                <Form.Check inline label='Yes' name='Chesscom' type='radio' className = 'mx-2' onClick={()=>{setChesscom(true)}}/>
                <Form.Check inline label='No' name='Chesscom'  type='radio' className = 'mx-2' defaultChecked onClick={()=>{setChesscom(false)}}/>
            </Form.Group>

            {Chesscom && <MembershipForm inputs={['bullet', 'blitz', 'rapid', 'Daily', 'puzzle']} name='USCF'/>}

            <Form.Group>
                <Form.Label className = 'mx-2'>Do you have a LiChess account?</Form.Label>
                <Form.Check inline label='Yes' name='LiChess' type='radio' className = 'mx-2' onClick={()=>{setLiChess(true)}} />
                <Form.Check inline label='No' name='LiChess'  type='radio' className = 'mx-2' defaultChecked onClick={()=>{setLiChess(false)}} />
            </Form.Group>

            {LiChess && <MembershipForm inputs={['bullet', 'blitz', 'rapid', 'Classical', 'Correspondence' , 'puzzle']} name='USCF'/>}
        </Form>
    )
}

步骤2表单(可重用组件)*注意我目前有一个标准、快速和 lightning 的状态。这是问题的症结所在。我希望状态是动态的,基于我传递给这个组件的道具。

import React, {useState} from 'react'
import {Form} from 'react-bootstrap'
import RatingInput from './RatingInput'

export default function MembershipForm({inputs, name}) {
    const [standard, setStandard] = useState(false)
    const [rapid, setRapid] = useState(false)
    const [blitz, setBlitz] = useState(false)

    const questions=inputs.map(input => {
            return (
                <>
                    <Form.Group>
                        <Form.Label className='mx-2'>Do you have a {name} {input} Rating?</Form.Label>
                        <Form.Check inline label='Yes' value={true} name={name+input} type='radio' className = 'mx-2' onClick = {()=>{setStandard(true)}}/>
                        <Form.Check inline label='No' value ={false} name={name+input}  type='radio' className = 'mx-2' defaultChecked onClick = {()=>{setStandard(false)}}  />
                    </Form.Group>
                    {standard && <RatingInput name={input}/>}
                </>
            )
        })
    return (
        <div className='ml-3'>
            {questions}
        </div>
    )
}

步骤3:最后,这是我想根据上述组件的状态有条件地显示的第三个组件

import React from 'react'
import {Form, Container, Row, Col} from 'react-bootstrap'

export default function RatingInput({name}) {
    return (
        <Container>
            <Row>

                <Col><Form.Label inline>What is your {name} rating?</Form.Label></Col>
                <Col><Form.Control type='number' min ={500} max ={3200} className='w-50 h-75' /></Col>
            </Row>
            <Form.Group>

        </Form.Group>
        </Container>

    )
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题