map not a function при выборе option в dropDown

128
25 января 2021, 22:10

TypeError: serviceName.map is not a function сам компонент рендерится, но при выборе опшина, ломается.

import React from 'react'; 
import { 
  makeStyles 
} from '@material-ui/core/styles'; 
import '@material/react-select/dist/select.css'; 
import Select, { 
  Option 
} from '@material/react-select'; 
 
export default class SelectService extends React.Component { 
  constructor(props) { 
    super(props) 
    this.state = { 
      serviceName: [] 
    }; 
  } 
 
  getServices = _ => { 
    fetch('http://localhost:3001/prices') 
      .then(response => response.json()) 
      .then(response => this.setState({ 
        serviceName: response.data 
      })) 
      .catch(err => console.log(err)) 
  } 
 
  componentDidMount() { 
    this.getServices(); 
  } 
 
  renderServices = ({ 
      id_service, 
      title 
    }) => 
    < 
    Option key = { 
      id_service 
    } 
  value = { 
    title 
  } > { 
    title 
  } < /Option> 
 
  render() { 
    const { 
      serviceName 
    } = this.state 
    return ( < 
      Select className = "select" 
      label = 'Выберите Желаемую Услугу' 
      value = { 
        serviceName 
      } 
      onChange = { 
        (evt) => this.setState({ 
          serviceName: evt.target.value 
        }, () => console.log(this.state.serviceName)) 
      } > 
      { 
        serviceName.map(this.renderServices) 
      } < 
      /Select> 
    ); 
  } 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Answer 1

При текущей реализации и массив вариантов, и выбранное значения хранятся в одном поле в state.serviceName. После выставления значения, в serviceName оказывается строка. Нужно разделить

import React from 'react'; 
import { 
  makeStyles 
} from '@material-ui/core/styles'; 
import '@material/react-select/dist/select.css'; 
import Select, { 
  Option 
} from '@material/react-select'; 
 
export default class SelectService extends React.Component { 
  constructor(props) { 
    super(props) 
    this.state = { 
      serviceNames: [], // варианты 
      serviceName: '' //  значение 
    }; 
  } 
 
  getServices = _ => { 
    fetch('http://localhost:3001/prices') 
      .then(response => response.json()) 
      .then(response => this.setState({ 
        serviceNames: response.data 
      })) 
      .catch(err => console.log(err)) 
  } 
 
  componentDidMount() { 
    this.getServices(); 
  } 
 
  renderServices = ({ 
      id_service, 
      title 
    }) => 
    < 
    Option key = { 
      id_service 
    } 
  value = { 
    title 
  } > { 
    title 
  } < /Option> 
 
  render() { 
    const { 
      serviceNames, serviceName 
    } = this.state 
    return ( < 
      Select className = "select" 
      label = 'Выберите Желаемую Услугу' 
      value = { 
        serviceName 
      } 
      onChange = { 
        (evt) => this.setState({ 
          serviceName: evt.target.value 
        }, () => console.log(this.state.serviceName)) 
      } > 
      { 
        serviceNames.map(this.renderServices) 
      } < 
      /Select> 
    ); 
  } 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

READ ALSO
Что делают эти строки?

Что делают эти строки?

Помоготе разобраться что делают эти 7 строк что я закоментировалНе могу розобраться в длинных jQuery цепочках( Код слайдера:

167
Последовательность отправки AJAX

Последовательность отправки AJAX

Есть задача: С элементов страницы собираются данные (ID)Далее их, по очереди, надо отправить на сервер, но чётко последовательно(после завершения-следующий)

114
Вопрос о курсоре (mac os но возможно и web и windows)

Вопрос о курсоре (mac os но возможно и web и windows)

Проблема в том что есть сайт на котором спрятан курсор в принципе ( cursor: none ) но когда на мой mac приходит уведомление с другого приложения например...

125