Проблема при вызове обоих моих состояний (TypeError: не удается прочитать свойство ‘map’ неопределенного)

#javascript #reactjs

#javascript #reactjs

Вопрос:

У меня возникли проблемы с отображением на моем локальном хосте обоих моих состояний (у меня есть следующее сообщение: TypeError: не удается прочитать свойство ‘map’ неопределенного).

Skills.js

 import React, { Component } from 'react';
import ProgressBar from './ProgressBar';

class Skills extends Component {
  state = {
    programs: [
      { id: 1, value: 'Opera', xp: 5 },
      { id: 2, value: 'Fols', xp: 3 },
      { id: 3, value: 'Micros', xp: 2 },
    ],
    languages: [
      { id: 1, value: 'French', xp: 5 },
      { id: 2, value: 'English', xp: 5 },
      { id: 3, value: 'Spanish', xp: 1 },
    ]
  }

  render() {
    let { programs, languages } = this.state;

    return (
      <div className="programsLanguages">
        <ProgressBar
          programs={programs}
          className="programsDisplay"
          title="programs"
        />
        {/* <ProgressBar
          languages={languages}
          title="languages"
          className="languagesDisplay"
        /> */}
      </div>
    );
  }
}

export default Skills;
 

Для

ProgressBar.js

 import React from 'react';

const ProgressBar = (props) => {
  return (
    <div className={props.className}>
      <h3>{props.title}</h3>
      <div className="years">
        <span>Years of Experience</span>
        <span>1 year</span>
        <span>8 years</span>
      </div>

      <div>
        console.log(props)
        {props.programs.map((item) => {
          let xpYears = 8;
          let progressBar = (item.xp / xpYears) * 100   '%';
          return (
            <div key={item.id} className="programsList">
              <li>{item.value}</li>
              <div className="progressBar" style={{ width: progressBar }}></div>
            </div>
          );
        })}
      </div>
    </div>
  );
};

export default ProgressBar;
 

Когда я комментирую

 {/* <ProgressBar
          languages={languages}
          title="languages"
          className="languagesDisplay"
        /> */}
 

это работает. Мой локальный хост показывает мой объект {программы}, и то же самое, если я комментирую {программы} (отображаются мои {языки}), но вместе это невозможно.

Надеюсь, я был достаточно конкретен в своем примере.

Большое вам спасибо.

С уважением

Ответ №1:

Это потому, что вы использовались languages здесь в качестве реквизита

 <ProgressBar
  languages={languages}
  title="languages"
  className="languagesDisplay"
/>;
 

но вы отображаете programs здесь:

 {props.programs.map((item) => {
  let xpYears = 8;
  let progressBar = (item.xp / xpYears) * 100   '%';
  return (
    <div key={item.id} className="programsList">
      <li>{item.value}</li>
      <div className="progressBar" style={{ width: progressBar }}></div>
    </div>
  );
})}
 

также попробуйте проверить props.programs перед отображением, чтобы иметь такую длину:

 {props.programs.length amp;amp; props.programs.map((item) => {
  let xpYears = 8;
  let progressBar = (item.xp / xpYears) * 100   '%';
  return (
    <div key={item.id} className="programsList">
      <li>{item.value}</li>
      <div className="progressBar" style={{ width: progressBar }}></div>
    </div>
  );
})}
 

Ответ №2:

Используйте Реагирующий Крючок

И передайте тот же реквизит таким образом items={прогресс} ИЛИ items= {языки} Например, реквизиты title и calssName

 import React, { useState } from 'react';

const ProgressBar = ({ title, items, className }) => {
  return (
    <div className={className}>
      <h3>{title}</h3>
      <div className="years">
        <span>Years of Experience</span>
        <span>1 year</span>
        <span>8 years</span>
      </div>
      <div>
       console.log(props)
        {items.map((item) => {
          let xpYears = 8;
          let progressBar = (item.xp / xpYears) * 100   '%';
          return (
            <div
              key={item.id}
              className="programsList"
            >
              <li>{item.value}</li>
              <div
                className="progressBar"
                style={{ width: progressBar }}
              ></div>
            </div>
          );
        })}
      </div>
    </div>
  );
};

const initialPrograms = [
    { id: 1, value: 'Opera', xp: 5 },
    { id: 2, value: 'Fols', xp: 3 },
    { id: 3, value: 'Micros', xp: 2 },
  ],
  initialLanguages = [
    { id: 1, value: 'French', xp: 5 },
    { id: 2, value: 'English', xp: 5 },
    { id: 3, value: 'Spanish', xp: 1 },
  ];

const Skills = () => {
  const [programs, setPrograms] = useState(initialPrograms);
  const [languages, setLanguage] = useState(initialLanguages);
  return (
    <div className="programsLanguages">
      <ProgressBar
        items={programs}
        className="programsDisplay"
        title="programs"
      />
      <ProgressBar
        items={languages}
        title="languages"
        className="languagesDisplay"
      />
    </div>
  );
};

export default Skills;