Logo

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.
This site is an XMLUI™ app.