写点什么

【愚公系列】2022 年 12 月 微信小程序 - 组件模板和组件样式

作者:愚公搬代码
  • 2022-12-04
    福建
  • 本文字数:1461 字

    阅读完需:约 5 分钟

一、组件模板

组件模板的写法与页面模板相同。组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上。


在组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子节点。

1.无命名插槽

<!-- 组件模板 --><view class="wrapper">  <view>这里是组件的内部节点</view>  <slot></slot></view>
复制代码


<!-- 引用组件的页面模板 --><view>  <component-tag-name>    <!-- 这部分内容将被放置在组件 <slot> 的位置上 -->    <view>这里是插入到组件slot中的内容</view>  </component-tag-name></view>
复制代码

2.命名插槽

默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用。


Component({  options: {    multipleSlots: true // 在组件定义时的选项中启用多slot支持  },  properties: { /* ... */ },  methods: { /* ... */ }})
复制代码


<!-- 组件模板 --><view class="wrapper">  <slot name="before"></slot>  <view>这里是组件的内部细节</view>  <slot name="after"></slot></view>
复制代码


<!-- 引用组件的页面模板 --><view>  <component-tag-name>    <!-- 这部分内容将被放置在组件 <slot name="before"> 的位置上 -->    <view slot="before">这里是插入到组件slot name="before"中的内容</view>    <!-- 这部分内容将被放置在组件 <slot name="after"> 的位置上 -->    <view slot="after">这里是插入到组件slot name="after"中的内容</view>  </component-tag-name></view>
复制代码

二、组件样式

1.禁用写法

组件对应 wxss 文件的样式,只对组件 wxml 内的节点生效。以下写法是不生效的


#a { } /* 在组件中不能使用 */[a] { } /* 在组件中不能使用 */button { } /* 在组件中不能使用 */.a > .b { } /* 除非 .a 是 view 组件节点,否则不一定会生效 */
复制代码

2.组件样式隔离

默认情况下,自定义组件的样式只受到自定义组件 wxss 的影响。但也有些特殊写法会影响到组件样式就必须隔离


Component({  options: {    addGlobalClass: true,    styleIsolation: 'isolated'  }})
复制代码

3.外部样式

有时,组件希望接受外部传入的样式类。此时可以在 Component 中用 externalClasses 定义段定义若干个外部样式类。


/* 组件 custom-component.js */Component({  externalClasses: ['my-class']})
复制代码


<!-- 组件 custom-component.wxml --><custom-component class="my-class">这段文本的颜色由组件外的 class 决定</custom-component>
复制代码

4.页面样式引用

即使启用了样式隔离 isolated ,组件仍然可以在局部引用组件所在页面的样式或父组件的样式。


.blue-text {  color: blue;}
复制代码


<view class="~blue-text"> 这段文本是蓝色的 </view>
复制代码

5.父组件样式引用

.red-text {  color: red;}
复制代码


<view class="^red-text"> 这段文本是红色的 </view>
复制代码

6.虚拟化组件节点

自定义组件并不希望这个节点本身可以设置样式、响应 flex 布局等,而是希望自定义组件内部的第一层节点能够响应 flex 布局或者样式由自定义组件本身完全决定。


这种情况下,可以将这个自定义组件设置为“虚拟的”:


Component({  options: {    virtualHost: true  },  properties: {    style: { // 定义 style 属性可以拿到 style 属性上设置的值      type: String,    }  },  externalClasses: ['class'], // 可以将 class 设为 externalClasses})
复制代码


<!-- 页面的 WXML --><view style="display: flex">  <!-- 如果设置了 virtualHost ,节点上的样式将失效 -->  <custom-component style="color: blue">不是蓝色的</custom-component></view>
复制代码


发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-03-01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年12月 微信小程序-组件模板和组件样式_12月月更_愚公搬代码_InfoQ写作社区