美文网首页
微信小程序之自定义组件

微信小程序之自定义组件

作者: 5df463a52098 | 来源:发表于2019-03-04 13:50 被阅读3次

1、创建自定义组件

在pages创建一个components目录专门用来存放自定义组件,这里创建一个弹窗组件modal。


image.png

modal.wxml:

<block>
  <view class='wx_dialog' hidden="{{!isShow}}">
    <view class='wx-mask'></view>
    <view class='wx-dialog-content'>
      <view class='wx-dialog-title'>
        <view wx:if="{{title}}">
          <text>{{ title }}</text>
          <text class="iconfont icon-cross" catchtap='_cancelEvent'></text>
        </view>
        <slot name="title"></slot>
      </view>
      <view class='wx-dialog-contents'>
        <text wx:if="{{content}}">{{content}}</text>
        <slot wx:else name="content"></slot>
      </view>
      <view class='wx-dialog-footer'>
        <view wx:if="{{!customFooter}}">
          <view class='wx-dialog-btn' catchtap='_cancelEvent'>{{ cancelText }}</view>
          <view class='wx-dialog-btn' catchtap='_confirmEvent'>{{ confirmText }}</view>
        </view>
        <slot wx:else name="footer"></slot>
      </view>
    </view>
  </view>
</block>

modal.js

Component({
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持 
  },
  /** 
   * 组件的属性列表 
   * 用于组件自定义设置 
  */
  properties: {
    // 弹窗标题 
    title: { // 属性名 
      type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型) 
      value: '' // 属性初始值(可选),如果未指定则会根据类型选择一个 
    },
    // 弹窗内容 自定义
    content: { type: String, value: '' },
    // 弹窗取消按钮文字 
    cancelText: { type: String, value: '取消' },
    // 弹窗确认按钮文字 
    confirmText: { type: String, value: '确定' },
    customFooter: { type: Boolean, value: false}
  },
  /** 
   * 私有数据,组件的初始数据 
   * 可用于模版渲染 
   */
  data: { // 弹窗显示控制 
    isShow: false
  },
  /**
   * 组件的方法列表 
   * 更新属性和数据的方法与更新页面数据的方法类似 
  */
  methods: {
    /** 
    * 公有方法 
    */
    //隐藏弹框 
    hideDialog() {
      this.setData({
        isShow: !this.data.isShow
      })
    },
    //展示弹框 
    showDialog() {
      this.setData({
        isShow: !this.data.isShow
      })
    },
    /** 
     * 内部私有方法建议以下划线开头 
     * triggerEvent 用于触发事件 
    */
    _cancelEvent() { //触发取消回调 
      this.triggerEvent("cancelEvent")
    },
    _confirmEvent() { //触发成功回调 
      this.triggerEvent("confirmEvent");
    }
  }
})

modal.json:

{
  "component": true
}

modal.wxss:

@import "../../../app.wxss";
.wx_dialog {
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}
.wx-mask {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background: rgba(0, 0, 0, .3);
  z-index: 99;
}
.wx-dialog-content {
  position: absolute;
  background: #fff;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  /* height: 200px; */
  padding-bottom: 60px;
  z-index: 100;
  border-radius: 5px;
}
.wx-dialog-contents {
  padding: 10px;
}
.wx-dialog-title {
  padding: 10px 10px;
  font-size: 14px;
  border-bottom: 1px solid #eee;
}
.wx-dialog-footer {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  font-size: 14px;
  height: 40px;
  line-height: 40px;
  border-top: 1px solid #eee;
}
.wx-dialog-btn {
  display: inline-block;
  width: 49%;
  cursor: pointer;
  text-align: center;
  line-height: 40px;
}
.wx-dialog-btn:first-child {
  border-right: 1px solid #eee;
}
.wx-dialog-title .iconfont{
  float: right;
}

2、引入组件

父组件中引入modal
index.wxml:

<modal id="dialog" bind:cancelEvent="_cancelEvent" bind:confirmEvent="_confirmEvent" customFooter="true">
  <view slot="title">
    ddddddd
  </view>
   <view slot="content">
   我是组件的内容
    </view>
    <view slot="footer">
      <view style='text-align: center;'>关闭</view>
    </view>
  </modal>

index.json:

{
  "usingComponents": {
    "modal": "../components/modal/modal"
  }
}

index.js:

onReady: function () {
    this.modal = this.selectComponent("#dialog"); 
    console.log(this.modal.data.isShow)
    this.modal.setData({
      isShow: true
    })
  },
 //取消事件 
  _cancelEvent() {
    console.log('你点击了取消');
    this.modal.hideDialog();
  },
  //确认事件 
  _confirmEvent() {
    console.log('你点击了确定');
    this.modal.hideDialog();
  },
~~
这是结果图:
![image.png](https://img.haomeiwen.com/i6109679/e6e477ed52e099e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在这里我使用了slot插槽来自定义组件内部的内容,也可以直接使用属性来固定死组件内部的内容。

相关文章

网友评论

      本文标题:微信小程序之自定义组件

      本文链接:https://www.haomeiwen.com/subject/kmtiuqtx.html