Синтаксически компактный и производительный метод выбора реквизитов для проверки равенства в shouldComponentUpdate?

#javascript #reactjs #performance #equality #react-props

#javascript #reactjs #Производительность #равенство #реагировать-реквизит

Вопрос:

Мне интересно, как выбрать реквизит для сравнения, не повторяясь до смешного.

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

Есть ли какая-либо библиотека для выбора реквизитов для сравнения?


 shouldComponentUpdate(nextProps) {
  const {
    myObj, 
    myString,
    myBool,
  } = this.props;
  const {
    myObj: nextMyObj, 
    myString: nextMyString,
    myBool: nextMyBool,
  } = nextProps;

  if (!shallowequal(
    {
      myObj,
      myString,
      nextMyBool,
    },
    {
      myObj: nextMyObj,
      myString: nextMyString,
      myBool: nextMyBool,
    }
  )) return true

  return false;
}
  

Комментарии:

1. return false; В конце никогда не будет достигнуто. Кроме того, это очень дорого с точки зрения производительности, поскольку создает два новых объекта и вызывает другую функцию.

2. Почему бы просто не использовать старое сравнение, подобное: return this.props.myObj.updateTime === nextProps.myObj.updateTime amp;amp; this.props.myString === nextProps.myString amp;amp; ...; . Это обеспечивает наилучшую производительность. Подробный не всегда плох.

3. это настолько компактно и производительно, насколько это возможно: jsfiddle.net/xdytmhe6

4. @ibrahimmahrir спасибо, что указали на это. Я добавил это в конце, не задумываясь. Причина, по которой я использую shallowequal здесь, заключается в том, что мне часто нужно сравнивать целые объекты, и в итоге я удалил это из этого примера к тому времени, когда я закончил его редактировать. Я отредактировал его обратно.

5. shallowequal уже возвращает true или false , поэтому нет необходимости в if и двух return , просто сделайте: return !shallowequal(...);