This second post will describe how to bind data to elements/components. In my approach I tried to simplify how the framework handles data.
In web development it's very common to need: If some array exists Then render each item in the array.
Angular separates these steps into two structural directives, *ngIf
and *ngFor
which can't be applied to the same element. I believe React requires the developer to return a default empty array in place of a falsy value (but this may have changed since I last worked with React).
It seemed to me "If falsy, do nothing" was worth handling instead of relying on the developer to guard the framework against falsy values. Also, non-arrays should be treated as single-element arrays. These assumptions result in a flexible data property that handles each of these inputs:
-
falsy
->[]
-
truthy
->[truthy]
-
[...any]
->[...any]
Element Data Binding
// single truthy value
div({ data: () => "Hello World" }, (message: string) =>
span({}, () => message)
)
// array of values
div({ data: () => ["Hello", "World"] }, (message: string) =>
span({}, () => message)
)
// falsy value
div({ data: () => false }, (message) =>
span({}, () => message)
)
Results in:
<div> <!-- "Hello World" -->
<span>Hello World</span>
</div>
<div> <!-- ["Hello", "World"] -->
<span>Hello</span>
<span>World</span>
</div>
<div> <!-- false -->
<!-- nothing is rendered -->
</div>
Component Data Binding
Components declare an arbitrary input type using the first generic parameter of the Component<T>
class. Within a Component, input data is accessed using this.Data
property. When using a component, data is passed to the component using the data
property of the component configuration object.
// Input type
type MessageHeaderData = { message: string };
// Type is included as part of the Component definition
class MessageHeader extends Component<MessageHeaderData> {
Template() {
return h1({}, () => this.Data.message);
}
}
// Pass MessageHeaderData to the component
messageHeader({ data: () => ({ message: "Hello World" }) });
Next post will cover adding event listeners to elements/components.
Top comments (0)