TypeError: невозможно прочитать свойство length of undefined в React JS для раскрывающегося списка страны

Я пытаюсь заполнить Состояние на основе выбранного Страна. Я получаю сообщение об ошибке, как показано ниже TypeError: невозможно прочитать свойство length of undefined в React JS для раскрывающегося списка страны

Сервис, Действие и Редуктор работают правильно. Я получаю ответ от Action. Ниже приведен код

constructor(props) {
    super(props)
    this.state = {
      CompanyName: '',
      country:'', 
      statez:'',
      selectedStateList: []
    }
  }
componentWillMount(){
    this.props.actions.company.StateList();
  }

handleSelect = (e) => {
    this.setState({selectedCountry: e.target.value}) 
    var filterStr = e.target.value  == "1" ? 'Canada' : 'USA';      
    this.state.selectedStateList = this.props.stateList.length && this.props.stateList.filter(stateData => stateData.Country == filterStr)

  }
render() {
return (
Form onSubmit = {this.handleSubmit} className = "gx-signin-form gx-form-row0">
                <Row gutter = {24}>
                  <Col span = {12}>
                    <FormItem label = "Business Name">
                      {getFieldDecorator('CompanyName', {
                        initialValue: this.state.CompanyName,
                        rules: [{
                          required: true, message: 'Please Input Your Business Name!',
                        }],
                      })(
                        <Input name='CompanyName' placeholder = "Business Name"
                          onChange = {(e) => {
                            e.preventDefault(); e.stopPropagation();
                            this.handleChangeEvent(e)
                          }}
                        />
                      )}

                    </FormItem>


                </Row>



                <Row gutter = {24}>
                  <Col span = {12}>
                    <FormItem label = "Business Address">
                      {getFieldDecorator('Address', {
                        initialValue: this.state.Address,
                        rules: [{
                          required: true, message: 'Please Input Business Address!',
                        }],
                      })(
                        <Input name='Address' placeholder = "Business Address"
                          onChange = {(e) => {
                            e.preventDefault(); e.stopPropagation();
                            this.handleChangeEvent(e)
                          }}
                        />
                      )}

                    </FormItem>

                  </Col>

                </Row>
                <Row gutter = {24}>
                <Col span = {12}>
                            <FormItem label = "Country">
                  {getFieldDecorator('Country', {
                    initialValue: "",
                    rules: [{
                       //required: this.props.isEdit == false ? true : false, message: 'Please Select Your Country!', 
                    }],
                  })(
                    <select  style = {{'width':'245px','height':'32px'}}  onChange = {this.handleSelect} >
                      <option value='0'>Select Country</option>
                      <option value='1'>Canada</option>
                      <option  value='2'>USA</option> 
                    </select>
                  )}

                </FormItem>
                </Col>


                </Row>
                <Row gutter = {24}>
                <Col span = {12}>
                            <FormItem label = "State">
                  {getFieldDecorator('State', {
                    initialValue: "",
                    rules: [{
                      /* required: this.props.isEdit == false ? true : false, message: 'Please Select Your State!', */
                    }],
                  })(
                    <select value = {'StateID'} style = {{'width':'245px','height':'32px'}}>
                   {this.state.selectedStateList.length && this.state.selectedStateList.map((value,index)=>(
                      <option value = {value.StateID} key = {index}>{value.StateName}</option>
                    ))}


                    </select>
                  )}

                </FormItem>
                </Col>

                <Row>
                  <Col span = {24}>
                    <FormItem>
                      <Button type = "primary" className = "gx-mb-0" htmlType = "submit">
                        Sign Up
                    </Button> Or Already Have One <Link to='/signin'> Sign In </Link>
                    </FormItem>
                  </Col>
                </Row>
              </Form>
)
} 

const mapStateToProps = (state) => {
  return {
    stateList:state.companyReducer.stateList || []
  }
};

const mapDispatchToProps = dispatch => ({
  actions: {
    company: bindActionCreators(companyAction, dispatch)
  }
});

Для этой статьи есть только одна страница. Как изменить свой код, чтобы избежать этой ошибки? Это что-нибудь с состоянием и реквизитом?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
768
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проверить вот так

{this.state.selectedStateList && this.state.selectedStateList.length && this.state.selectedStateList.map((value,index)=>(
                      <option value = {value.StateID} key = {index}>{value.StateName}</option>
                    ))}

и убедитесь, что у вас есть правильные значения в состоянии

Также убедитесь, что вы connect ваш компонент с mapStateToProps

Обновлять

Попробуйте это в handleSelect

//this.setState({selectedCountry: e.target.value}) 
var filterStr = e.target.value  == "1" ? 'Canada' : 'USA';      

let selectedStateList = this.props.stateList.length && 
this.props.stateList.filter(stateData => stateData.Country == filterStr)

this.setState({selectedCountry: e.target.value, selectedStateList : selectedStateList });

Я пробовал это. Ошибка устранена, но список состояний не заполняется.

Levina 13.11.2018 11:31

Да, я использую подключение

Levina 13.11.2018 11:40
export default connect(mapStateToProps, mapDispatchToProps)(SignForm);
Levina 13.11.2018 11:40

Нет, я не могу это сделать

Levina 13.11.2018 12:25

Штат не соответствует стране. Значения, написание всех значений, приведенных в handleSelect, верны.

Levina 13.11.2018 12:26
stateList - это набор массивов, содержащий все состояния
Levina 13.11.2018 12:39

когда ты делаешь

this.setState ({selectedCountry: e.target.value})

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

    handleSelect = (e) => {
       const selectedStateList = this.props.stateList.filter(stateData => stateData.Country == filterStr)
 this.setState({selectedCountry: e.target.value, selectedStateList});
      }

и последнее, никогда не устанавливайте состояние напрямую, как вы:

this.state.selectedStateList = .....

Тогда где мне ставить selectedStateList @Maxim Rudenko

Levina 13.11.2018 12:51

в setState, как я писал ранее: this.setState ({selectedCountry: e.target.value, selectedStateList});

Maksym Rudenko 13.11.2018 13:29

Другие вопросы по теме