-
-
Notifications
You must be signed in to change notification settings - Fork 8.8k
Description
Current proposal:
- Remove
inhertiAttrs
option - Remove
nativeOn
- Remove automatic attribute fallthrough in all cases
- The only, consistent way to enable attribute fallthrough is to explicitly spread
$attrs
on desired target element- In template:
<div v-bind="$attrs">
- In render functions:
return cloneVNode(h('div'), this.$attrs)
- note if component has no declared props,
$attrs
will be empty and everything will be in$props
, and it should just spread / pass on$props
instead.$attrs
will just point to$props
which includes everything passed to the component.
- In template:
Rationale
-
The fallthrough behavior has already been inconsistent between stateful components and functional components in 2.x. With the introduction of fragments, the fallthrough behavior becomes even more unreliable for component consumers. The implicit behavior is convenient in cases where it works, but can be confusing in cases where it doesn't. By making this an explicit decision of component authors, whether a component accepts additional attributes becomes part of the component's API contract, overall resulting in more consistency.
-
The combination of
inheritAttrs
,nativeOn
,$attrs
and$listeners
makes props passing in higher-order components unnecessarily complex. The new behavior makes it much more straightforward: spreading$attrs
means "pass everything that I don't care about down to this element/component".
Drawbacks
-
Fallthrough behavior is now disabled by default and is controlled by the component author. If the component is intentionally "closed" there's no way for the consumer to change that. This may cause some inconvenience for users accustomed to the old behavior, but can be easily worked around with by wrapping the component in a wrapper element.
-
For accessibility reasons, it should be a best practice for components that are shipped as libraries to always spread
$attrs
. However this is a straightforward / mechanical code change, and is more of an educational issue. We could make it common knowledge by emphasizing this in all our information channels.
Side Benefit
Not spreading $attrs
actually improves performance.