Это хороший шаблон для использования !! нотация для прослушивания изменений ReactJS?

Я использую ReactJS + Redux в своих проектах уже пару лет. Я часто попадаю в асинхронные ситуации, когда мне нужно, чтобы мой компонент ждал обновления состояния для рендеринга. Обычно достаточно простой логики !this.props.isFetching ? <Component /> : "Loading...".

Однако бывают случаи, когда мне нужно проверить состояние массива, встроенного в объект состояния. В этих случаях большинство моих компонентов выглядят так:

  renderPostAuthor = () => {
    if (!!this.props.postDetails.author) {
      return this.props.postDetails.author[0].name;
    } else {
      return (
        <div>
          <StyledTitle variant = "subheading" gutterBottom color = "primary">
            Loading...
          </StyledTitle>
        </div>
      );
    }
  };

Является ли такое использование нотации !! хорошим шаблоном / практикой в ​​ReactJS?

ОБНОВЛЕНИЕ: Спасибо за ответы, и все они действительны. Возможно, чтобы прояснить мой вопрос, отметим, что this.props.postDetails - это само состояние, которое содержит ряд объектов и массивов. Следовательно, проблема в том, что если я опущу !!, а this.props.postDetails еще не создан и, следовательно, не содержит массивов, таких как author[], я получаю ошибку undefined.

В этом нет ничего плохого, но в этом нет необходимости, поскольку исключение !! будет вести себя точно так же. В основном это скрытый!! в обычном режиме, в котором работает тест if.

Pointy 29.06.2018 15:39

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

lealceldeiro 29.06.2018 15:39

В !! нет ничего плохого, но в этом случае if (this.props.postDetails.author) будет иметь такой же эффект. Это скорее вопрос вкуса, если вам явно не нужен boolean.

Tholle 29.06.2018 15:39

@Pointy не то же самое, смотри. var a = 1; var x = !!a; console.info(x) // true (not 1)

lealceldeiro 29.06.2018 15:40

@lealceldeiro, конечно, но опубликованный код использует !! в тесте if.

Pointy 29.06.2018 15:41

Пожалуйста, проверьте обновление, которое я сделал по этому вопросу. Иногда мне все еще нужно проверить, обработан ли this.props.postDetails, прежде чем я смогу даже протестировать массив this.props.postDetails.author.

James 29.06.2018 16:31
Поведение ключевого слова "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
6
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это гораздо больше связано с JavaScript в целом, чем с React.

Нет, использование !! не особо полезно. Этот:

if (!!this.props.postDetails.author) {

то же самое, что и это:

if (this.props.postDetails.author) {

Ни один из них означает, что author содержит массив по крайней мере с одной записью, на которую опирается ваша следующая строка кода. Для этого добавьте .length или, в вашем конкретном примере, возможно, [0] (в случае, если author имел запись, но эта запись была ложным значением):

if (this.props.postDetails.author[0]) {

Если author может быть null или undefined, нам нужно выполнить две проверки:

if (this.props.postDetails.author && this.props.postDetails.author[0]) {

Поскольку мы собираемся использовать результат, лучше всего сохранить результат в переменной или константе:

const firstAuthor = this.props.postDetails.author && this.props.postDetails.author[0];
if (firstAuthor) {
    return firstAuthor.name;
}

Пример текущего кода, выдающего ошибку:

console.info("Running");
const author = [];
if (!!author) {
  console.info(author[0].name);
} else {
  console.info("No Author");
}

Пример проверки [0], когда мы знаем, что author не будет null / ложным:

console.info("Running");
const author = [];
if (author[0]) {
  console.info(author[0].name);
} else {
  console.info("No Author");
}

Пример двойной проверки, когда author может быть null / ложным:

console.info("Running");
const author = null;
if (author && author[0]) {
  console.info(author[0].name);
} else {
  console.info("No Author");
}

Пример сохранения и использования результата:

function example(author) {
  const firstAuthor = author && author[0];
  if (firstAuthor) {
      return firstAuthor.name;
  } else {
      return "Loading...";
  }
}
console.info(example(null));                      // Loading...
console.info(example([]));                        // Loading...
console.info(example([{name:"Harlan Ellison"}])); // "Harlan Ellison" (RIP)

Проблема в том, что если я опущу !!, а this.props.postDetails еще не создан и, следовательно, не содержит массивов, таких как author[], я получаю ошибку undefined.

James 29.06.2018 16:28

@JamesJ. - У вас тоже была бы проблема с участием с !!. Если this.props.postDetails может еще не существовать, вам понадобится дополнительная защита: if (this.props.postDetails && this.props.postDetails.author && this.props.postDetails.author[0]) {. Если вы можете предположить, что .author будет существовать, если .postDetails существует, вы можете опустить средний. Также могут помочь ответы на это и это.

T.J. Crowder 29.06.2018 16:35

Бывают моменты, когда использование !! особенно полезно, но это не тот случай, о котором говорилось выше. Самый распространенный случай, который я обнаружил, - это оценка того, собираетесь ли вы отображать элементы массива или нет. Часто люди будут использовать длину массива, чтобы решить, работать с ним или нет, поскольку длина 0 является ложным логическим значением:

render () {
  return this.props.array.length && <MyList items = {this.props.array} />
}

К сожалению, это вернет 0, который будет отображаться на странице. Поскольку false не будет отображаться на странице, хорошей альтернативой будет использование двойного взрыва, чтобы возвращался false.

render () {
  return !!this.props.array.length && <MyList items = {this.props.array} />
}

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