fragment(attrs, children)
- Core
- Optional
- Tooling
Description
Allows attaching lifecycle methods to a fragment vnode
var groupVisible = true
var log = function() {
console.log("group is now visible")
}
m("ul", [
m("li", "child 1"),
m("li", "child 2"),
groupVisible ? m.fragment({oninit: log}, [
// a fragment containing two elements
m("li", "child 3"),
m("li", "child 4"),
]) : null
])
Signature
Generates a fragment vnode
vnode = m.fragment(attrs, children)
Argument | Type | Required | Description |
---|---|---|---|
attrs |
Object |
No | HTML attributes or element properties |
children |
Array |
No | Child vnodes. Can be written as splat arguments |
returns | Vnode |
A fragment vnode |
How it works
m.fragment()
creates a fragment vnode with attributes. It is meant for advanced use cases involving keys or lifecyle methods.
A fragment vnode represents a list of DOM elements. If you want a regular element vnode that represents only one DOM element and don't require keyed logic, you should use m()
instead.
Normally you can use simple arrays or splats instead to denote a list of nodes:
var groupVisible = true
m("ul",
m("li", "child 1"),
m("li", "child 2"),
groupVisible ? [
// a fragment containing two elements
m("li", "child 3"),
m("li", "child 4"),
] : null
)
However, JavaScript arrays cannot be keyed or hold lifecycle methods. One option would be to create a wrapper element to host the key or lifecycle method, but sometimes it is not desirable to have an extra element (for example in complex table structures). In those cases, a fragment vnode can be used instead.
There are a few benefits that come from using m.fragment
instead of handwriting a vnode object structure: m.fragment creates monomorphic objects, which have better performance characteristics than creating objects dynamically. In addition, using m.fragment
makes your intentions clear to other developers, and it makes it less likely that you'll mistakenly set attributes on the vnode object itself rather than on its attrs
map.