两种组件方式
- 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.jsComponent({properties: {},methods: {onTap: function () {var myEventDetail = {} // detail对象,提供给事件监听函数var myEventOption = {} // 触发事件的选项this.triggerEvent('myevent', myEventDetail, myEventOption)}}})
总结
如果只是想简单的展示样式,只需要使用 template组件就够了,相反如果想每个组件都有自己的业务逻辑,各自独立,建议使用component组件方法实现。
