при изменении страны, затем отобразите штат и город, чтобы разместить значение держателя

#reactjs #antd

Вопрос:

У меня есть Страна, штат и город . впервые я выбрал страну, штат и город. Когда я меняю другую страну, я ожидаю , что отобразится значение по умолчанию, например, выберите штат, выберите город. после повторного выбора страны мне нужно выбрать другой штат и город в разделе «Измененная страна». Пожалуйста, помогите мне отобразить значение по умолчанию для штата и города после изменения страны.

шаг 1) выберите страну

шаг 2) выберите состояние

шаг 3) выберите город

введите описание изображения здесь

шаг 4) измените страну введите описание изображения здесь

шаг 5) ожидание после изменения страны ожидание штата и города должно измениться на значение по умолчанию(—выберите Штат—) (—Выберите город —)

актуально:- Он отображает значение штата и города.

мой код : —

 import React, { useState, useEffect } from "react";
import { useDispatch,useSelector } from "react-redux";
import { Button, Form, message, Select, Row, Col, Alert} from 'antd';
import { DeleteOutlined } from "@ant-design/icons";
import { Country, State, City }  from 'country-state-city';
import { SetStudentInfo } from "../../../../../redux/reducer/StudentRegister/StudentReg.actions";

const { Option } = Select;
const Countries = Country.getAllCountries()
const States = State.getAllStates()
const Cities = City.getAllCities()

export default (props) => {
  const studentInfo = useSelector((state) => state.studentInfo)
  const dispatch = useDispatch()
  const [form] = Form.useForm()
  const [error, setError] = useState("")
  const [loading, setLoading] = useState(false)
  const [collegesList, setCollegesList] = useState(props.collegesList)
  const [collegesSelectedList, setCollegesSelectedList] = useState(studentInfo ? studentInfo.institutesList ? studentInfo.institutesList : [] : [])
  const [selectedCountry, setSelectedCountry] = useState(studentInfo ? studentInfo.country : null)
  const [selectedState, setSelectedState] = useState(studentInfo ? studentInfo.state : null)
  const [selectedCity, setSelectedCity] = useState(studentInfo ? studentInfo.city : null)
  const [filteredState, setFilteredState] = useState(States)
  const [filteredCity, setFilteredCity] = useState(Cities)
  const [warning, setWarning] = useState()
  let count = 1
  let checkDuplicateSelect = false
  
  const handleSubmit = () => {
    let formData = {
      country: selectedCountry ? selectedCountry : '',
      state: selectedState ? selectedState : '',
      city: selectedCity ? selectedCity : '',
      institutesList: collegesSelectedList ? collegesSelectedList : []
    }
    setError("");
    setLoading(true)

    console.log('formData: ', formData)
    dispatch(SetStudentInfo(formData));
    props.nextPage(true)
  }

  const handleRemoveList = (college) => {
    setCollegesSelectedList(collegesSelectedList.filter((c) => c !== college))
  }

  useEffect(() => {
    const defaultState = {
      name: "--select--"
    };
    setFilteredState([defaultState,...filteredState])
    setFilteredCity([defaultState,...filteredCity])
  }, []);
  
  return (
      <div className="form-width">
        <Form form={form} onFinish={handleSubmit} layout="vertical" className="content">
          <h3 style={{textAlign: "center", fontWeight: "lighter"}}>Step 1 of 2</h3>
          <Row>
            <Col span={11}>
              <h3 >I want to go to</h3>
            </Col>
            <Col span={2}></Col>
            <Col span={11}>
              <h3 >I want to study at the <br />following universities amp;#38; colleges</h3>
            </Col>
          </Row>
          <Row>
              <Col span={11} style={{marginTop: "3%"}}>
                <Form.Item
                    name="cntry"
                    label="Country"
                    initialValue={studentInfo ? studentInfo.country : null}
                    rules={[
                    {
                        required: true,
                        message: "Please choose the country you wanted to go.",
                    },
                    ]}
                >
                    <Select
                    showSearch
                    placeholder="Select country"
                    loading={loading}
                    onChange={(code) => {
                      setSelectedCountry(Countries[code].name)
                      setFilteredState(States.filter((state) => state.countryCode === Countries[code].isoCode ))
                    }}
                    optionFilterProp="children"
                    filterOption={(input, option) =>
                        option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
                    }
                    >
                    {Object.keys(Countries).map((code) => (
                        <Option value={code}>{Countries[code].name}</Option>
                    ))}
                    </Select>
                </Form.Item>

                <Form.Item
                    name="prvc"
                    label="Province"
                    initialValue={studentInfo ? studentInfo.state ? studentInfo.state : null : null}
                >
                    <Select
                    showSearch
                    loading={loading}
                    placeholder="Select Province"
                    onChange={(code) => {
                      setSelectedState(States[code].name)
                      setFilteredCity(Cities.filter((city) => city.countryCode === filteredState[code].countryCode amp;amp; city.stateCode === filteredState[code].isoCode))
                      }}
                    optionFilterProp="children"
                    filterOption={(input, option) =>
                        option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
                    }
                    >
                    {Object.keys(filteredState).map((state) => (
                        <Option value={state}>{filteredState[state].name}</Option>
                    ))}
                    </Select>
                </Form.Item>

                <Form.Item
                    name="cty"
                    label="City"
                    initialValue={studentInfo ? studentInfo.city ? studentInfo.city : null : null}
                >
                    <Select
                    showSearch
                    loading={loading}
                    placeholder="Select City"
                    onChange={(code) => {
                      setSelectedCity(Cities[code].name)
                    }}
                    optionFilterProp="children"
                    filterOption={(input, option) =>
                        option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
                    }
                    >
                    {Object.keys(filteredCity).map((city) => (
                        <Option value={city}>{filteredCity[city].name}</Option>
                    ))}
                    </Select>
                </Form.Item>
              </Col>
              <div style={{border: "1px solid #a8f0d9", margin: "2% 2% 2% 2%"}}></div>
              <Col span={11} style={{marginTop: "3%"}}>
                
                <Form.Item
                    name="insts"
                    label="Type institute name here"
                >
                    <Select
                    showSearch
                    loading={loading}
                    placeholder="Select Colleges"
                    onChange={(college) => {
                      checkDuplicateSelect = collegesSelectedList.some(c => c === (collegesList[college].name))
                      if (!checkDuplicateSelect amp;amp; count <= 10) {
                        setCollegesSelectedList([...collegesSelectedList, collegesList[college].name])
                      } else if (!checkDuplicateSelect amp;amp; count > 10) {
                        setWarning("Max no.of institues[10] list exceeded.")
                         
                      } else if (checkDuplicateSelect) {
                        setWarning("Already this institute selected.")
                      }
                    }}
                    optionFilterProp="children"
                    filterOption={(input, option) =>
                        option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0
                    }
                    >
                    {Object.keys(collegesList).map((college) => (
                        <Option value={college}>{collegesList[college].name}</Option>
                    ))}
                    </Select>
                </Form.Item>
                {warning amp;amp; <Alert message={warning} type="warning" showIcon />}
                <label>List of institutes selected</label>
                <div style={{ border: "1px solid #b3e2d2", height: "19vh", overflowY: "auto" }}>
                  <Form.Item>
                    {collegesSelectedList.map((college) => (
                      <ul style={{listStyleType: "none", padding: "0px"}}>
                        <li key={college} >
                          {count  }.{college}<Button size="small" onClick={() => handleRemoveList(college)} icon={<DeleteOutlined />} danger />
                        </li>
                      </ul>
                      ))
                    }
                  </Form.Item>
                </div>
              </Col>
          </Row>
          <Form.Item style={{textAlign: "center", marginTop: "2%"}}>
            <Button htmlType="submit"  
                    type="primary"                       
                    loading={loading}
                    disabled={loading}>
              Next
            </Button>
          </Form.Item>
        </Form>
      </div>
  )
}
 

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

1. Ваши входы не кажутся контролируемыми входами. Если вы хотите программно установить их значение, то они должны быть полностью управляемыми входными данными. Вы также можете использовать клавишу React для «сброса» входных данных. Похоже, вы не включили полный, воспроизводимый пример кода (я не смог воспроизвести ваш код в запущенном codesandbox). Можете ли вы привести более полный и исчерпывающий пример кода?

Ответ №1:

Я не уверен, что то, что вы хотите сделать, касается только отображения значения по умолчанию, вы можете добавить эту опору в свой выбор. Вы можете сделать что-то вроде этого:

 <Select defaultValue="Select state" style={{ width: 120 }}>
      <Option value="anycity">anycity</Option>
</Select>
 

Это всегда сохранит значение по умолчанию, прежде чем выбрать штат или город

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

1. Я совершенно уверен, что OP хочет, чтобы входные данные штата и города «сбрасывались» при обновлении значения страны. Другими словами, они хотят вернуться к «исходному значению».

Ответ №2:

API формы initialValues работает только при установке значения путем инициализации или сброса формы, как и Form.Item.

 <Form.Item
  name="prvc"
  label="Province"
  initialValue={studentInfo ? studentInfo.state ? studentInfo.state : null : null}
>
 

если вы измените значение initialValue после инициализации, это не сработает. вы можете использовать FormInstance api form.setFieldsValue({prvc: 'the value you want to set', cty: 'the value you want to set'}) . как показано ниже:

 <Form.Item
  name="cntry"
  label="Country"
  initialValue={studentInfo ? studentInfo.country : null}
  rules={[
    {
       required: true,
       message: "Please choose the country you wanted to go.",
     },
  ]}
>
  <Select
     showSearch
     placeholder="Select country"
     loading={loading}
     onChange={(code) => {
       // setSelectedCountry(Countries[code].name)
       // setFilteredState(States.filter((state) => state.countryCode === Countries[code].isoCode ))
       // form is const [form] = Form.useForm()
       form.setFieldsValue({
         prvc: ...,
         cty: ...
       })
     }}