реквизиты, состояния и другие переменные не определены внутри оператора if — ReactJS

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня есть компонент FormGenerator с рекурсивным вызовом в ReactJS

 import React , {useState} from 'react'
import {CCol,CForm,CFormGroup,CInput,CInputRadio,CLabel,CRow,CButtonGroup, CInputCheckbox} from '@coreui/react'
import { useSelector, useDispatch } from 'react-redux'

const FormGenerator = (props) => {

const dispatch = useDispatch()
const infantStore = useSelector(state => state.infantStore)

const infantInputChangeHandler = (e) => {
    dispatch({ type: "setInfantInput", payload: e.currentTarget.value, name: e.target.name })
}

const infantCheckboxChangeHandler = (e) => {
    dispatch({ type: "setInfantInput", payload: e.currentTarget.value, name: e.target.name })
}

let data = props.data

return (
    <>
    {/* {console.log("props1",props)} */}
        {
            Object.entries(data).map(([key, value]) => {
      
                const correctAnswerId = props.correctAnswerId
                console.log("props_1",props)
                if (value.answers !== undefined amp;amp; value.answers[0] !== undefined amp;amp; (value.answers[0].type === 'boolean' || value.answers[0].type === 'options' || value.answers[0].type === 'bit' || value.answers[0].type === 'multi_options')) {
                    console.log("props_2",props)
                    return (
                        <React.Fragment key={key}>
                            <CCol xs="12" md="6">
                                <CFormGroup row>
                                    <CCol md="5" className="d-flex justify-content-center align-items-center">
                                        <CLabel htmlFor="reAdmissionId" className={value.required === "1" amp;amp; "rl"}>{value.name}</CLabel>
                                    </CCol>
                                    <CCol xs="12" md="7">
                                        <CButtonGroup className="w-100">
                                            {
                                                Object.entries(value.answers).map(([awsnerKey, answerValue], j) => {
                                                    // console.log(answerValue)
                                                    return (
                                                        <>
                                                            {
                                                                value.answers[0].type === 'multi_options' ? <CLabel className="btn btn-light btn_radio">
                                                                    <CInputCheckbox disabled={!(value.parentItemId == null || (value.parentItemId !== null amp;amp; infantStore[`admissionItem${value.parentItemId}`] !== undefined amp;amp; infantStore[`admissionItem${value.parentItemId}`] == correctAnswerId))} value={answerValue.id} name={`admissionItem${value.id}_${answerValue.id}`} className={answerValue.type === "boolean" amp;amp; (answerValue.id == 3 ? "true_option" : "false_option")} /> <span>{answerValue.answer}</span>
                                                                </CLabel>
                                                                    : <CLabel className="btn btn-light btn_radio">
                                                                        <CInputRadio disabled={!(value.parentItemId == null || (value.parentItemId !== null amp;amp; infantStore[`admissionItem${value.parentItemId}`] !== undefined amp;amp; infantStore[`admissionItem${value.parentItemId}`] == correctAnswerId))} checked={infantStore[`admissionItem${value.id}`] == answerValue.id} onChange={infantInputChangeHandler} id={`admissionItem${value.id}`} value={answerValue.id} name={`admissionItem${value.id}`} className={(answerValue.type === "boolean" || answerValue.type === "bit") amp;amp; ((answerValue.id == 3 || answerValue.id == 1) ? "true_option" : "false_option")} /> <span>{answerValue.answer}</span>
                                                                    </CLabel>

                                                            }
                                                        </>
                                                    )

                                                })
                                            }

                                        </CButtonGroup>
                                    </CCol>

                                </CFormGroup>
                            </CCol>
                            {/* {
                                console.log(`admissionItem${value.id}`,infantStore[`admissionItem${value.id}`] !== undefined amp;amp; infantStore[`admissionItem${value.id}`] == value.correctAnswerId)
                            } */}

                            {
                                value.children !== undefined amp;amp; value.children.length > 0 amp;amp; <FormGenerator data={value.children} correctAnswerId={value.correctAnswerId} />
                            }
                        </React.Fragment>


                    )
                } else if (value.answers !== undefined amp;amp; value.answers[0] !== undefined amp;amp; (value.answers[0].type === 'text' || value.answers[0].type === 'number' || value.answers[0].type.startsWith("float_"))) {
                    
                    // console.log(correctAnswerId)
                    
                    return (

                        <React.Fragment>
                            <CCol xs="12" md="6" key={key}>
                                <CFormGroup row>
                                    <CCol md="5" className="d-flex justify-content-center align-items-center">
                                        <CLabel htmlFor={`admissionItem${value.id}`} className={value.required === "1" amp;amp; "rl"}>{value.name}</CLabel>
                                    </CCol>
                                    <CCol xs="12" md="7">
                                        <CInput disabled={!(value.parentItemId == null || (value.parentItemId !== null amp;amp; infantStore[`admissionItem${value.parentItemId}`] !== undefined amp;amp; infantStore[`admissionItem${value.parentItemId}`] == correctAnswerId))} name={`admissionItem${value.id}`} placeholder={value.name} autoComplete="off" />
                                    </CCol>
                                </CFormGroup>
                            </CCol>
                            {
                                value.children !== undefined amp;amp; value.children.length > 0 amp;amp; <FormGenerator data={value.children} correctAnswerId={value.correctAnswerId} />
                            }
                        </React.Fragment>

                    )
                }
            })

        }
    </>
)
}

export default FormGenerator
  

У меня есть некоторые родительские и дочерние входные данные, которые я извлекаю из API в формате Json

Когда я показываю родительские элементы, я вызываю FormGenerator внутри себя и передаю ему дочерние элементы в качестве реквизита

 {
                                value.children !== undefined amp;amp; value.children.length > 0 amp;amp; <FormGenerator data={value.children} correctAnswerId={value.correctAnswerId} />
                            }
  

проблема заключается в props.correctAnswerId всегда не определяется внутри операторов if и else при рендеринге функции

я даже пытался

 let correctAnswerId = props.correctAnswerId
  

перед оператором if, но по-прежнему correctAnswerId не определен

что приведет к тому, что мои реквизиты и переменная не будут определены внутри if и else

но в другой руке реквизит данных

 let data = props.data
  

не имеет проблем!

Примечание: я знаю, что correctAnswerId будет передаваться только в FormGenerator, когда мы получим дочерние элементы

Но я протестировал код, и correctAnswerId работает непосредственно перед операторами if и else , и я получил значение в нужное время, но когда я помещаю correctAnswerId внутри оператора if , он возвращает undefined ….

в моем коде

 console.log("props_1",props)
  

получает ли correctAnswerId

но

  console.log("props_2",props)
  

нет ….

я даже пытался поместить correctAnswerId внутри state и использовать его оттуда, но, несмотря на это, проблема может быть в самом correctAnswerId

потому что для других переменных и реквизитов он работает просто find …

Комментарии:

1. пожалуйста, обратите внимание, что реквизиты неизменяемы и не могут быть изменены внутри компонента, поэтому вам необходимо проверить наличие переданных реквизитов от родительского элемента . кроме того, я предлагаю использовать уничтожение реквизитов для лучшего понимания кода и proptypes для реквизитов debugin.

2. но correctAnswerId является неизменяемым, и я его не меняю, CorrectAnswer — это всегда одно и то же число