#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(...);