React array, почему это происходит?

У меня есть два компонента React, один из которых создает новый массив при нажатии кнопки, а затем отправляет этот массив через функцию другому компоненту, который отображает и выводит маркированный список. Но вместо того, чтобы отображать маркер для каждого элемента в массиве, второй компонент смешивает их вместе.

Функция первого компонента:

export default class SvcList extends React.Component {
   constructor(props) {
   super(props)

   this.state = {
      servicesArr: []
   }
 }

  changeSelectionsArray = (id) => {  
    this.state.servicesArr.push(id)
    // THIS IS THE FUNCTION SENDING THE ARRAY TO SECOND COMPONENT
    this.props.reviseServicesArray(this.state.servicesArr)  
  }

  render() {
    return(
      <div><button id = "something" onClick = {() => this.changeSelectionsArray(id)}>Click Me</button></div>
    )  
  }
}

Это работает. В console.info показан вывод, который я получаю от компонента:

["5bd97355-50d8-4a06-aced-025c8cc587f3", "5bd97403-ae5b-4c90-92cb-130f86154e27"]

Поэтому я привожу этот массив ко второму компоненту через props, и когда я console.info props, я получаю точный массив, показанный выше. Вот второй компонент:

export default class SvcDisplay extends React.Component {
   constructor(props) {
   super(props)
  }     

 render() {

  const { servicesArr } = this.props;

  const serviceDisplay = servicesArr.map((item, i) => (
    <li key = {i}>{item}</li>
  ));

    return(
      <div>
        <ul>{serviceDisplay}</ul>      
      </div>  
    )  
  }
}

Выходные данные объединяются в одну пулю, например:

- 5bd97355-50d8-4a06-aced-025c8cc587f35bd97403-ae5b-4c90-92cb-130f86154e27

вместо отдельных пуль. Если я добавил эту строку во вторую функцию рендеринга компонента над функцией карты, она будет работать отлично:

const servicesArr = ["5bd97355-50d8-4a06-aced-025c8cc587f3", "5bd97403-ae5b-4c90-92cb-130f86154e27"];

Почему это происходит?????

Не могли бы вы создать Минимальный, полный и проверяемый пример, например, в CodeSandbox? Это, например, не совсем понятно, откуда вы берете id в своем коде. Вы также не должны изменять свой массив состояний, нажимая на него.

Tholle 15.11.2018 14:27

Помогает ли включение UL? const serviceDisplay = ( <ul> {servicesArr.map((item, i) => <li key = {i}>{item}</li>)} </ul> );

HMR 15.11.2018 14:35

HMR благодарит, но это не помогло. Я также внес изменения в Taz742, упомянутый ниже, и все еще имеет тот же результат.

CHays412 15.11.2018 14:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
55
1

Ответы 1

Потому что this.state.array.push () неправильный синтаксис. Также, если вы хотите использовать обновленное состояние, вам нужно использовать callBack из после setState.

changeSelectionsArray = (id) => {  
    let { servicesArr } = this.state;
    servicesArr.push(id);

    this.setState({
        servicesArr,
    }, () => {
        this.props.reviseServicesArray(this.state.servicesArr)  
    })
}

Или:

changeSelectionsArray = (id) => {  
    this.setState({
        servicesArr: [...this.state.servicesArr, id]
    }, () => {
        this.props.reviseServicesArray(this.state.servicesArr)  
    })
}

Или:

...

Или:

...

Пробовал оба и все равно получаю те же результаты. Также удалил массив из состояния и просто добавил в пустой массив и все тот же результат.

CHays412 15.11.2018 14:42

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