Scoping
Variables
A variable declared in a Main.xmlui component is visible to built-in child components (e.g.
Text
) at any level.Main.xmlui
<App var.message="Hello from App">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message2="Hello from Card">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
<Card id="child">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
</Card>
</Card>
</Card>
</App>
Main.xmlui
<App var.message="Hello from App">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message2="Hello from Card">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
<Card id="child">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
</Card>
</Card>
</Card>
</App>
A variable declared in a Main.xmlui component is not automatically visible to a user-defined child component.
Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard />
</App>
MyCard
<Component name="MyCard">
<Card>
<Text>Message: {message}</Text>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard />
</App>
MyCard
<Component name="MyCard">
<Card>
<Text>Message: {message}</Text>
</Card>
</Component>
The variable can be passed into a user-defined component.
Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard message="{message}" />
</App>
MyCard
<Component name="MyCard">
<Card>
<Text>Message: {$props.message}</Text>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard message="{message}" />
</App>
MyCard
<Component name="MyCard">
<Card>
<Text>Message: {$props.message}</Text>
</Card>
</Component>
Or the variable can be transposed into the user-defined component by means of the Slot mechanism. The
Slot
content evaluates in the parent's scope, so it can see parent vars and IDs, but renders inside the child’s layout.Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard>
<Text>Message: {message}</Text>
</MyCard>
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Slot/>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyCard>
<Text>Message: {message}</Text>
</MyCard>
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Slot/>
</Card>
</Component>
A child component can redeclare a variable.
Main.xmlui
<App var.message="Hello from App">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message="Hello from parent Card">
<Text>Message: {message}</Text>
<Card id="child" var.message="Hello from child Card">
<Text>Message: {message}</Text>
</Card>
</Card>
</Card>
</App>
Main.xmlui
<App var.message="Hello from App">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message="Hello from parent Card">
<Text>Message: {message}</Text>
<Card id="child" var.message="Hello from child Card">
<Text>Message: {message}</Text>
</Card>
</Card>
</Card>
</App>
All these rules apply within a user-defined component defined in a file like
MyComponent.xmlui
.Main.xmlui
<App>
<MyComponent />
</App>
MyComponent.xmlui
<Component name="MyComponent" var.message="Hello from MyComponent">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message2="Hello from Card">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
<Card id="child">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
</Card>
</Card>
</Card>
</Component>
Main.xmlui
<App>
<MyComponent />
</App>
MyComponent.xmlui
<Component name="MyComponent" var.message="Hello from MyComponent">
<Card id="grandparent">
<Text>Message: {message}</Text>
<Card id="parent" var.message2="Hello from Card">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
<Card id="child">
<Text>Message: {message}</Text>
<Text>Message2: {message2}</Text>
</Card>
</Card>
</Card>
</Component>
A variable declared in a user-defined component can be passed into another user-defined component.
Main.xmlui
<App>
<MyComponent />
</App>
MyComponent.xmlui
<Component name="MyComponent" var.message="Hello from MyComponent">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyOtherComponent message="{message}" />
</Component>
MyOtherComponent.xmlui
<Component name="MyOtherComponent">
<Card>
<Text>Passed message: {$props.message}</Text>
</Card>
</Component>
Main.xmlui
<App>
<MyComponent />
</App>
MyComponent.xmlui
<Component name="MyComponent" var.message="Hello from MyComponent">
<Card>
<Text>Message: {message}</Text>
</Card>
<MyOtherComponent message="{message}" />
</Component>
MyOtherComponent.xmlui
<Component name="MyOtherComponent">
<Card>
<Text>Passed message: {$props.message}</Text>
</Card>
</Component>
Component IDs
A component ID declared on a Main.xmlui component is visible to built-in child components (e.g.
Text
) at any level.Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<Card id="parent">
<Text>
{ textBox.value }
</Text>
<Card id="child">
<Text>
{ textBox.value }
</Text>
</Card>
</Card>
</App>
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<Card id="parent">
<Text>
{ textBox.value }
</Text>
<Card id="child">
<Text>
{ textBox.value }
</Text>
</Card>
</Card>
</App>
A component ID declared on a Main.xmlui component is not automatically visible to a user-defined child component.
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard />
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Text>Message: {textBox.value}</Text>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard />
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Text>Message: {textBox.value}</Text>
</Card>
</Component>
The id can be passed into a user-defined component.
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard textBox="{textBox}" />
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Text>Message: {$props.textBox.value}</Text>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard textBox="{textBox}" />
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Text>Message: {$props.textBox.value}</Text>
</Card>
</Component>
Or the component ID can be transposed into the user-defined component by means of the Slot mechanism.
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard>
<Text>Message: {textBox.value}</Text>
</MyCard>
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Slot/>
</Card>
</Component>
Main.xmlui
<App var.message="Hello from App">
<TextBox id="textBox" initialValue="{message}" />
<MyCard>
<Text>Message: {textBox.value}</Text>
</MyCard>
</App>
MyCard.xmlui
<Component name="MyCard">
<Card>
<Slot/>
</Card>
</Component>
All these rules apply within a user-defined component defined in a file like
MyComponent.xmlui
.