两种组件方式
- template组件:主要用途是用与展示页面,方法只需要在页面定义,而且template组件没有业务逻辑文件(JS)与配置文件(JSON)。
component组件:有自己的业务逻辑,如果涉及到的逻辑较多,使用component即可。
template组件化
只需要创建template文件,在这个文件内新建想要封装的组建文件夹,里面就存放wxml与wxss。
- 多个template组件之间,可以用
name
区分,页面调用也是以name
指定对应的template,如下:<template name="packModule">
<view class="packModule">packModule</view>
</template>
页面应用
在index.wxml里,可以如下 :
<!--导入模板-->
<import src="./modules/pack.wxml" />
<!--嵌入模板-->
<view wx:for="{{moduleInfoList}}" wx:for-item="moduleInfo" wx:key="index">
<template is="packModule" data="{{moduleInfo}}" wx-if="{{moduleInfo.style == 5}}"></template>
</view>
在index.wxss里,需要引入该组件的wxss,如下:
@import "../../libs/templates/module.wxss";
component组件
- 同样的,可以创建一个 component文件,里面就存放多个不同的component组件,component与正常的页面文件差不多,也有wxml、wxss、json、js这四个文件,但是,在component里,json与js这两个文件与正常页面的不一样。
<!--dialog.wxml-->
<view>
<!-- 略 -->
</view>
/* 略 */
Component({ //在component里,这里不是Page,而是Component
//略
})
{
"component": true, //必须要写这个,不然组件不能生效
"usingComponents": {}
}
如何引用
在index.json文件里开启组件配置:
{
"usingComponents": {
"dialog": "/components/dialog/dialog"
}
}
接下来在index引用:
<!-- 自定义dialog组件 -->
<dialog id="dialog" global-color="{{globalColor}}"></dialog>
component注意事项
- 在component样式里,不允许使用id选择器、属性选择器、标签名选择器,只能使用class选择器。
- 而且,在组件与引用组件的页面中使用 后代选择器 与 子元素选择器 ,在极端条件下会有一些bug,建议避免使用。
- 样式继承,如果font、color之类的,会从组件外继承到组件内。
组件之间如何通信
父组件向子组件传值通讯:通过 properties
向自定义组件传递数据。
子组件向父组件传值通讯,就需要分别设置触发事件与监听事件,自定义组件可以触发事件,引用组件的页面可以监听这些事件。如下 :
监听事件:
<!-- 引用组件的页面模版 -->
<view>
<my-component bindmyevent="myEventListener">
<!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
<view>这里是插入到组件slot中的内容</view>
</my-component>
</view>
Page({
myEventListener: function(e) {
console.log(e)
}
})
触发事件:
<!-- 组件模板 -->
<view class="wrapper">
<view>这里是组件的内部节点</view>
<slot></slot>
<button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
</view>
// components/component-tag-name.js
Component({
properties: {},
methods: {
onTap: function () {
var myEventDetail = {} // detail对象,提供给事件监听函数
var myEventOption = {} // 触发事件的选项
this.triggerEvent('myevent', myEventDetail, myEventOption)
}
}
})
总结
如果只是想简单的展示样式,只需要使用 template组件就够了,相反如果想每个组件都有自己的业务逻辑,各自独立,建议使用component组件方法实现。