微信小程序slot插槽功能

在我们封装组件的时候,有些时候,我们需要使用类似于vue中的slot插槽;
小程序借鉴了这个优秀的想法;
在小程序中,组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子节点。
组件
<view class="cont">
    <view>
        我是组件
    </view>
    <slot></slot>
</view>

页面使用

xxx.json 引入注册组件

{
  "usingComponents": {
    "listview":"/components/listview/list"
  }
}

<listview>
    <view>
        我是插入的第一条数据
    </view>
    <view>我是插进入的第二天数据
    </view>
</listview>


在组件的 wxml 中可以包含 slot 节点,用于承载组件使用者提供的 wxml 结构。
默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用。

ps:组件对应 wxss 文件的样式,只对组件wxml内的节点生效。编写组件样式时,需要注意以下几点:
1==>组件和引用组件的页面不能使用id选择器(#a)、属性选择器([a])和标签名选择器,请改用class选择器。(注意)

2==> 组件件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。

3==>子元素选择器(.a>.b)只能用于 view 组件与其子节点之间,用于其他组件可能导致非预期的情况。

4==>继承样式,如 font 、 color ,会从组件外继承到组件内。(重点)

5==>除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)。
什么是组件样似隔离选项

默认情况下,自定义组件的样式只受到自定义组件 wxss 的影响。除非以下两种情况:

(1)app.wxss 或页面的 wxss 中使用了标签名选择器(或一些其他特殊选择器)来直接指定样式,
 这些选择器会影响到页面和全部组件。通常情况下这是不推荐的做法。
 比如说你在app.wxss中定义了
 view{color:red};
 你使用了标签选择器,那么页面以及所有组件
 字体颜色是红色哈~;


(2) 指定特殊的样式隔离选项 styleIsolation
isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值);
apply-shared 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面;
shared 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-shared 或 shared 的自定义组件。(这个选项在插件中不可用。)

Component({
  options: {
    styleIsolation: 'isolated'
  }
})

组件

组件.js中

Component({
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持
  },
  properties: { /* ... */ },
  methods: { /* ... */ }
})
<view class="cont">
    <slot name="before"></slot>
    <view>这里是组件的内部细节</view>
    <slot name="after"></slot>
</view>

父页面使用

<listview>
     <!-- 这部分内容将被放置在组件 <slot name="before"> 的位置上 -->
        <view slot="before">这里是插入到组件"before"</view>
    <!-- 这部分内容将被放置在组件 <slot name="after"> 的位置上 -->
    <view slot="after">这里是插入到组件"after"的内容</view>
</listview>

猜你喜欢