@campus1

Как убрать ошибку и нормальный ли код??

Всем привет.
Мне с бекенда приходит такой объект:
const data = {
  q_lang: {value: 1},
  q_sex: {value: 2},
  q_height: {value: "170cm"}
}


Мне надо отрендерить данные по типу:
Language - English
Sex - Male
Height - 170cm


Как я пробовал решить:
Сделать пресет данных -
const profileTitles = [
  {
    title: "Language of questions",
    key: "q_lang",
    dataByValue: [
      { value: 1, label: "English" },
      { value: 2, label: "Swedish" }
    ]
  },

  {
    title: "Sex",
    key: "q_sex",
    dataByValue: [{ value: 1, label: "Male" }, { value: 2, label: "Female" }]
  },
  { title: "Height", key: "q_height" }
];


И потом ф-цию для рендеринга
renderProfileData = testingReducer => {
    return profileTitles.map((element, index) => {
      const questionValue = get(testingReducer, `${element.key}.value`); // get с lodash
      let labelValue; // нужный нам label для рендеринга
      if (element.hasOwnProperty("dataByValue")) {
        const filteredDataByQuestionValue = element.dataByValue.filter(
          el => el.value === questionValue
        ); // фильтрация по value
        labelValue = filteredDataByQuestionValue[0].label; 
      } else {
        labelValue = questionValue;
      }
      return (
        <div className="profile-data">
          <span>{element.title}</span>
          <span>{labelValue}</span>
        </div>
      );
    });
  };


Вроде все работает, но при первоначальном рендеринге на 2-3 секунды вылетает красное окно с текстом can not read label of undefined, потом все норм рендериться

5b81818308586688361228.pngВопросы:

  1. Как можно исправить первоначальную ошибку?
  2. Нормальный ли подход я выбрал и читабельная ли функция? TLDR: Норм ли код?:)
  • Вопрос задан
  • 145 просмотров
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Вы усложняете реализацию там, где это не требуется.
Все можно сделать гораздо понятней и проще:
const mapLangTitleByCode = code => ({
  const titles = {
    1: 'English',
    2: 'Russian',
  };
  return titles[code] || 'unknown code';
});

Для пола можно вообще функцию не делать

<div className="profile-data">
  <span>Language</span>
  <span>{mapLangTitleByCode(data.q_lang)}</span>
</div>
<div className="profile-data">
  <span>Sex</span>
  <span>{data.q_sex === 1 ? 'Male' : 'Female'}</span>
</div>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы