# Component Template and Style
Similar to a page, each custom component has its own wxml
template and wxss
style.
# Component Template
Component templates are written in the same way as page templates. The node tree generated by binding the component template with the component data will be inserted into the location where the component is referenced.
A <slot>
node can be provided in the component template to host the child nodes provided via component reference.
Code example:
<!-- Component template -->
<view class="wrapper">
<view>This indicates the internal node of the component</view>
<slot></slot>
</view>
<!--Page template where the component is referenced-->
<view>
<component-tag-name>
<!-- This part is added to the location of the <slot> component -->
<view>This is inserted in the slot component</view>
</component-tag-name>
</view>
Note that the custom component referenced in the template and the name of its corresponding node should be explicitly defined in the json
file, otherwise the node will be deemed as meaningless. Besides, the node name can also be declared as an Abstract Node.
# Template Data Binding
Like an ordinary WXML template, data binding can also be employed to pass dynamic data to child component properties.
Code example:
<!--Page template where the component is referenced-->
<view>
<component-tag-name prop-a="{{dataFieldA}}" prop-b="{{dataFieldB}}">
<!-- This part is added to the location of the <slot> component -->
<view>This is inserted in the slot component</view>
</component-tag-name>
</view>
In the above example, the component properties propA
and propB
receive data passed from the page, and the page can change linked data field via setData
.
Note: Only JSON compatible data can be passed via the above data binding. From base library 2.0.9 and later, functions can also be included in the data. However, such functions cannot be called directly in WXML, but are only passed to child components.
# slot of Component's WXML
The slot
node can be included in the component's wxml to host the wxml structure provided by the component user.
By default, a component's wxml can contain only one slot. Multiple slots can be enabled by declaring in the component js if needed.
Component({
options: {
multipleSlots: true // Enable multiple slots in the options of component definition.
},
properties: { /* ... */ },
methods: { /* ... */ }
})
In this case, multiple slots can be used in the wxml of this component, each with a unique name
.
<!-- Component template -->
<view class="wrapper">
<slot name="before"></slot>
<view>This indicates the internal details of the component</view>
<slot name="after"></slot>
</view>
You can use the slot
property to insert nodes into different slots.
<!--Page template where the component is referenced-->
<view>
<component-tag-name>
<!-- This part is added to the location of the <slot name="before"> component -->
<view slot="before">This is inserted in the slot name="before" component</view>
<!-- This part is added to the location of the <slot name="after"> component -->
<view slot="after">This is inserted in the slot name="after" component</view>
</component-tag-name>
</view>
# Component Style
The style of a component for the wxss
file is only valid for the nodes in the component's wxml. Note the following when writing a component style:
- For the components and the pages that reference the components, the class selector, instead of the id selector (
#a
), property selector ([a]
) and tag name selector, should be used. - Unexpected behaviors may occur with the descendant selector (
.a .b
) used in the components and the pages that reference the components in extreme cases. If so, avoid using it. - The child selector (
.a>.b
) can be only used for theview
component and its child nodes; unexpected behaviors may occur if it is used in other components. - Inheritance styles, such as
font
andcolor
, are inherited into the components from outside the components. - In addition to inheritance styles, the styles in
app.wxss
and the styles of the pages that reference the components are invalid for custom components (unless the component style isolation option is changed).
#a { } /* Cannot be used in components */
[a] { } /* Cannot be used in components */
button { } /* Cannot be used in components */
.a > .b { } /* Invalid unless .a is view component node */
In addition, a default style can be specified for the node where the component resides by using the :host
selector (supported by the Weixin DevTools that contain the base library 1.7.2 or later).
Code example:
/* Component custom-component.wxss */
:host {
color: yellow;
}
<!-- Page's WXML -->
<custom-component>The text here is highlighted in yellow</custom-component>
# Component Style Isolation
By default, the styles of custom components are only affected by the wxss of custom components, unless in the following cases:
- The tag name selector (or other special selectors) is used in
app.wxss
orwxss
of the page to directly specify styles, which might affect the page and all components. This is generally not recommended. - Specify the special style isolation option
styleIsolation
.
Component({
options: {
styleIsolation: 'isolated'
}
})
The styleIsolation
option is supported in the base library 2.6.5 and later, which supports the following values:
isolated
indicates that the style isolation is enabled. Styles specified via class (default styles in normal cases) are not mutually affected in or outside custom components;apply-shared
indicates that the page's wxss style will affect custom components. However, the style specified in the wxss of custom components will not affect the page;shared
indicates that the page's wxss style will affect custom components, and the style specified in the wxss of custom components will also affect the page and other custom components configured withapply-shared
orshared
. (This option is not available in plug-ins.)
Pay close attention to the interaction between the styles when using the last two options.
If this Component constructor is used to construct a page, the default value is shared
and there are several additional style isolation options available:
page-isolated
indicates that app.wxss is disabled on this page, and the wxss of the page does not affect other custom components;page-apply-shared
indicates that app.wxss is disabled on this page, and the wxss of the page does not affect other custom components. But the custom components configured withshared
will affect the page;page-shared
indicates that app.wxss is disabled on this page. The wxss of the page will affect other custom components configured withapply-shared
orshared
, and will also be affected by the custom components configured withshared
.
In addition, the addGlobalClass
option is supported in the Mini Program base library 2.2.3 and later to set addGlobalClass: true
in the options
of Component
.
This option is equivalent to setting styleIsolation: apply-shared
, but will become invalid if the styleIsolation
option is set.
Code example:
/* Component custom-component.js */
Component({
options: {
addGlobalClass: true,
}
})
<!-- Component custom-component.wxml -->
<text class="red-text">The color of this text is determined by `app.wxss` and the style in `wxss` of the page</text>
/* app.wxss */
.red-text {
color: red;
}
# External Style Class
Sometimes, a component wants to accept a style class passed in externally. In this case, you can define several external style classes in Component
via the externalClasses
definition field. This feature is supported in base library 1.9.90 and later.
This feature can be used to implement, for example, the hover-class
property of the view
component: a style class can be provided in the page to specify value for the hover-class
of view
, which is written in the page instead of being implemented in the view
component.
Note: Avoid using an ordinary style class and an external style class on the same node because their priorities are not defined.
Code example:
/* Component custom-component.js */
Component({
externalClasses: ['my-class']
})
<!-- Component custom-component.wxml -->
<custom-component class="my-class">The color of this text is determined by the class outside the component</custom-component>
Therefore, the component user can specify the class corresponding to this style class, just like using ordinary properties. From base library 2.7.1 and later, multiple corresponding classes can be specified.
Code example:
<!-- Page's WXML -->
<custom-component my-class="red-text" />
<custom-component my-class="large-text" />
<!-- The following code is supported as of base library 2.7.1 -->
<custom-component my-class="red-text large-text" />
.red-text {
color: red;
}
.large-text {
font-size: 1.5em;
}