Условный рендеринг не защитил от рендеринга

У меня есть этот фрагмент кода:

document.lines && (<div>
                    <h4>Title1</h4>
                    {
                        document.lines
                            .concat(["end"])
                            .filter(Boolean)
                            .map((line, i) =>
                                <p key = {i}>{line}</p>
                            )
                    }
                </div>)

Все отлично работает при действующем document.lines. В одном из моих тестов я использовал ложное значение. Думал, что document.lines && меня защитит, но нет. Я сталкиваюсь с этой машинописной ошибкой:

TypeError: Cannot read property 'concat' of undefined

В мире angular я бы написал <div *ngIf = "document.lines">, а в мире vue я бы написал <div v-if = "document.lines">. Я думаю, что мне что-то не хватает с реакцией.

Почему моя охрана меня не защитила? Как я могу изменить свой код, чтобы избежать проблемы?

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

aftershock 15.01.2019 11:03

Странно, это должно было защитить тебя. Вы уверены, что ошибка указывает на эту строку, а не на какой-то другой concat? Можете ли вы создать сокращенный тестовый пример, который показывает ошибку?

Gleb Kostyunin 15.01.2019 11:03

@GlebKost Я постараюсь создать правильный минимальный воспроизводимый пример с помощью stackblitz.

aloisdg 15.01.2019 11:05

@GlebKost так всегда проще. Это помогает мне найти то, что мне не хватало. Я смог ответить. Спасибо

aloisdg 15.01.2019 11:17

@aloisdg Отлично! Со мной случалось много раз;)

Gleb Kostyunin 15.01.2019 11:19
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Таким образом, ваш охранник просто проверяет, существует ли document.lines, но не массив.

Измените охрану на:

Array.isArray(document.lines) && ...

Поскольку ошибка говорит 'concat' of undefined, мне кажется, это не имеет ничего общего с тем, является ли он массивом или не является.

Gleb Kostyunin 15.01.2019 11:05

Неа. Пробовали безуспешно.

aloisdg 15.01.2019 11:05

@GlebKost вообще-то ты прав. @aloisdg, а вы уверены, что этот document.lines.concat больше нигде не используете?

quirimmo 15.01.2019 11:06
Ответ принят как подходящий

Вы обернули свой код внутри { ... }? Без них document.lines && будет читаться реакцией как обычный html (демонстрация этого поведения).

Попробуй это:

{
    document.lines && <div>
                    <h4>Title1</h4>
                    {
                        document.lines
                            .concat(["end"])
                            .filter(Boolean)
                            .map((line, i) =>
                                <p key = {i}>{line}</p>
                            )
                    }
                </div>
}

Вот Рабочая демонстрация, созданный с помощью stackblitz. (Вы можете установить для строк значение undefined, чтобы показать, что случай ложной обработки обрабатывается правильно).

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