首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据传递给两个不同组件中的依赖选择字段的最佳方法

将数据传递给两个不同组件中的依赖选择字段的最佳方法
EN

Stack Overflow用户
提问于 2022-08-09 05:44:48
回答 1查看 59关注 0票数 0

很抱歉最近的所有问题,但我们的志愿者任务是在12月和我有很多工作要做,这些初步的问题将帮助我完成剩下的工作!

现在,我正在寻找填充select字段的最佳方法,该方法基于初始select字段之后的API响应。

在下面的图像中,我想要完成的是,一旦用户选择了一个Province,我希望将所选的prov_id传递给另一个组件,以便对我的MongoDB进行API调用,并根据选定的省份检索相关的区域。

这两种选择中的每一种都是独立的组件,因为我将在我正在构建的病人平台的其他表单中使用它们。

Select in displayProvinces.js

Select in displayDistricts.js

我确实有省选择工作,我可以调用地区API,而我把它们作为一个组件,但是现在我想把它们分成子组件,我正在寻找最好的方法将prov_iddisplayProvinces.js传递到displayDistricts.js,这样我就可以调用API并填充区域选择选项。

含金量

代码语言:javascript
复制
import {React, useMemo} from 'react';
import GetProvincesAPI from '@/utils/services/GetProvincesAPI';
import {Field, useFormikContext } from 'formik';
import {useTranslation} from 'react-i18next';

export default function DisplayProvinces(props){
  
  const [ provinces ] = GetProvincesAPI();
  const {setFieldValue, errors, touched} = useFormikContext();
  const { t, i18n } = useTranslation();
  
  function handleSelectedProvince(pr){
    console.log('Fired')
    console.log('Selected Province = ' +pr)
    // Want to send 'pr' to displayDistricts.js in order to pull the appropriate Districts
  }
  
  return (
    <>
      <Field
        as="select"
        id="pxProvince"
        name="pxProvince"
        onChange={(e)=> {
          handleSelectedProvince(e.target.value)
          setFieldValue('pxProvince', e.target.value)
        }}
        className="mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md"
      >
        {!provinces ? provinces : provinces.map((p, i) => (
          <option key={i} value={p.prov_id}>{p.prov_name}</option>
        ))}
      </Field>
      {props.onError &&
        <p className="mt-2 text-sm text-red-600" id="pxnum-error">
          {t('forms.rego.fields.px.provinceError')}
        </p>
      }
    </>
  )
}

displayDistricts.js含量

代码语言:javascript
复制
/* eslint-disable react-hooks/rules-of-hooks */
/* TODO: Fix the hook useProvinces inside the useMemo in order to have proper code */
import {Field, useFormikContext} from 'formik';
import GetDistrictsAPI from '@/utils/services/GetDistrictsAPI';
import {useMemo} from 'react';

export default function DisplayDistricts(props) {
  
  const {setFieldValue, values} = useFormikContext();
  const handleSelectedDistrict = useMemo(() => getDistricts(), []);
  
  let districts = [
    { id: '0', name: 'Select a Province first' }
  ]
  
  function getDistricts(d) {
    let districts = GetDistrictsAPI(d);
    console.log(districts)
  
    function handleSelectedDistrict(pr) {
      console.log('Selected District = ' +pr)
    }
  
    return handleSelectedDistrict;
  }
  
  return (
    <Field
      as="select"
      id="pxDistrict"
      name="pxDistrict"
      disabled={!values.pxProvince}
      className="mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md"
    >
      {!districts ? districts : districts.map((p, i) => (
        <option key={i} value={p.dist_id}>{p.name}</option>
      ))}
    </Field>
  )
}

提前感谢您的任何见解/想法!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-09 07:11:06

尝试此解决方案,请检查注释:

主要部件

代码语言:javascript
复制
function Main() {
    const [province, setProvince] = useState({id: "" , name: ""});
    const [districts, setDistricts] = useState({});

\\ when select province you have id for other component 
console.log(province)
\\ so you can pass id DisplayDistricts component

    return (
        <>
            <DisplayProvinces callback={(e) => setProvince({id: e.id , name: i.name})} />
            <DisplayDistricts idProvince={province.id} callback={(e) => setDistricts({id: e.id , name: i.name})} />
        </>
    )
}

含金量

代码语言:javascript
复制
export default function DisplayProvinces(props){
  
  const [ provinces ] = GetProvincesAPI();
  const {setFieldValue, errors, touched} = useFormikContext();
  const { t, i18n } = useTranslation();
function handleSelectedProvince(name , id){
    console.log('Fired')
    console.log('Selected Province = ' +pr)
    props.callback({id: id , name:name})
    // Want to send 'pr' to displayDistricts.js in order to pull the appropriate Districts
  }
  
  return (
    <>
      <Field
        as="select"
        id="pxProvince"
        name="pxProvince"
        onChange={(e)=> {
          handleSelectedProvince(e.target.value , e.target[e.target.selectedIndex].id)
          setFieldValue('pxProvince', e.target.value)
        }}
        className="mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md"
      >
        {!provinces ? provinces : provinces.map((p, i) => (
          <option key={i} id={p.prov_id} value={p.prov_name}>{p.prov_name}</option>
        ))}
      </Field>
      {props.onError &&
        <p className="mt-2 text-sm text-red-600" id="pxnum-error">
          {t('forms.rego.fields.px.provinceError')}
        </p>
      }
    </>
  )
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73287043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档