modules/util/get_set_value.js (27 lines of code) (raw):

// Like selection.property('value', ...), but avoids no-op value sets, // which can result in layout/repaint thrashing in some situations. export function utilGetSetValue(selection, value) { function d3_selection_value(value) { function valueNull() { delete this.value; } function valueConstant() { if (this.value !== value) { this.value = value; } } function valueFunction() { var x = value.apply(this, arguments); if (x == null) { delete this.value; } else if (this.value !== x) { this.value = x; } } return value == null ? valueNull : (typeof value === 'function' ? valueFunction : valueConstant); } if (arguments.length === 1) { return selection.property('value'); } return selection.each(d3_selection_value(value)); }