微信小程序-自定义组件

自定义组件的目的是组件化的复用问题。

组件的书写和页面的书写是一样的,当组件和数据结合之后会生成DOM树。

当然可以在组件中预留插槽来来承载组件中预留的子节点。

在模版中引用节点时候需要在json文件中显示定义,否则会被认为是无定义的节点。

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


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


// 引入组件时候需要在json文件显示定义
{
   "usingComponents": {
    "mp-searchbar": "../../components/searchbar/searchbar"
  },
}

数据绑定

当然,父组件当然可以向子组件通过prop传递参数,

自基础库版本 2.0.9 开始,还可以在数据中包含函数(但这些函数不能在 WXML 中直接调用,只能传递给子组件)。666

<!-- 引用组件的页面模板 -->
<view>
  <component-tag-name prop-a="{{dataFieldA}}" prop-b="{{dataFieldB}}">
    <!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
    <view>这里是插入到组件slot中的内容</view>
  </component-tag-name>
</view>

组件wxml的slot

默认只能添加一个slot插槽,需要添加定义来允许添加多个slot插槽,且不能重名

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

组件样式

组件对应的wxss对应的样式只能对组件内的节点有效。注意:

  • 组件和引用组件的页面不能使用id选择器(#a)、属性选择器([a])和标签名选择器,请改用class选择器。
  • 组件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。
  • 子元素选择器(.a>.b)只能用于 view 组件与其子节点之间,用于其他组件可能导致非预期的情况。
  • 继承样式,如 fontcolor ,会从组件外继承到组件内。
  • 除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)。
#a { } /* 在组件中不能使用 */
[a] { } /* 在组件中不能使用 */
button { } /* 在组件中不能使用 */
.a > .b { } /* 除非 .a 是 view 组件节点,否则不一定会生效 */

/* 组件 custom-component.wxss */
:host {
  color: yellow;
}

除此以外,组件可以指定它所在节点的默认样式,使用 :host 选择器。 >基础库 1.7.2

组件的样式隔离

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

  • app.wxss 或页面的 wxss 中使用了标签名选择器(或一些其他特殊选择器)来直接指定样式,这些选择器会影响到页面和全部组件。
  • 指定特殊的样式隔离选项 styleIsolation
component: ({
  options {
    styleIsolation: 'isolated',  //取值
  }
})

styleIsolation的取值有:  `>基础库版本 2.6.5 `
- isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值);
- apply-shared 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面;
- shared 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了,
- apply-shared 或 shared 的自定义组件。(这个选项在插件中不可用。)
`如果这个 Component 构造器用于构造页面 ,则默认值为 shared`

还有以下几个额外的样式隔离选项可用:
- page-isolated 表示在这个页面禁用 app.wxss ,同时,页面的 wxss 不会影响到其他自定义组件;
- page-apply-shared 表示在这个页面禁用 app.wxss ,同时,页面 wxss 样式不会影响到其他自定义组件,但设为 - shared 的自定义组件会影响到页面;
- page-shared 表示在这个页面禁用 app.wxss ,同时,页面 wxss 样式会影响到其他设为 apply-shared 或 shared 的自定义组件,也会受到设为 shared 的自定义组件的影响。


可以在json中配置styleIsolation, `>基础库版本 2.10.1 `
{
  "styleIsolation": "isolated"
}

Component : ({
   options: {
     addGlobalClass: true
   }
})  //这个选项等价于设置 styleIsolation: apply-shared,但设置了 styleIsolation 选项后这个选项会失效。

外部样式类

基础库 1.9.90

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

// 使用
<!-- 组件 custom-component.wxml -->
<custom-component class="my-class">这段文本的颜色由组件外的 class 决定</custom-component>
                                                         
                                                         
// 基础库 2.7.1 
可以指定多个对应的 class

引用页面或父组件的样式

>基础库 2.9.2

注意:如果组件是比较独立、通用的组件,请优先使用外部样式类的方式,而非直接引用父组件或页面的样式。

// 页面 wxss 
.blue-text {
  color: blue;
}
// 组件中可以使用 ~ 来使用
<view class="~blue-text"> 这段文本是蓝色的 </view>


// 一个组件的父组件 wxss 中
.red-text {
  color: red;
}
// 组件中可以使用 ^ 来引用
<view class="^red-text"> 这段文本是红色的 </view>

虚拟化组件节点

默认情况下,引入的自定义组件本身就是一个就是一个“普通”的节点。可以在那个节点上设置style/class/动画/flex等,就如同普通节点操作一样。

<!-- 页面的 WXML -->
<view style="display: flex">
  <!-- 默认情况下,这是一个普通的节点 -->
  <custom-component style="color: blue; flex: 1">蓝色、满宽的</custom-component>
</view>

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

可以将这个自定义组件设置为“虚拟的”:

// xxx.js
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>

<!-- custom-component.wxml -->
<view style="flex: 1">
  满宽的
  <slot></slot>
</view>

需要注意的是,自定义组件节点上的 class style 和动画将不再生效,但仍可以:

  • 将 style 定义成 properties 属性来获取 style 上设置的值;
  • 将 class 定义成 externalClasses 外部样式类使得自定义组件 wxml 可以使用 class 值。

详情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值