为什么需要自定义组件?因为小程序通过组件来传值,但小程序没有提供很多传值的方法,所以需要写自定义组件。调用自定义组件 - 传值给组件 - 组件传值出来,开发者需要在组件中写属性及方法等。 
 
 
  现在来实现弹幕功能 如下:   
 
   1.  首先需要单独创建一个组件目录,在目录中新建一个AuglyVideo文件夹,用来存放弹窗组件,结构如下: 
 
  2.    组件初始化准备完成。开始写组件相关的配置。我们需要现在自定义组件声明 component 字段为 true    
 
  //AuglyVideo.json 
 
  { 
 
    "component": true, // 自定义组件声明 
 
    "usingComponents": {} // 可选项,用于引用别的组件 
 
  } 
 
  接下来组件的页面结构: 
 
  //AuglyVideo.wxml 
 
  <view class='wx_dialog_container' hidden="{{!isShow}}"> 
 
    <view class='wx-mask'></view> 
 
    <view class='wx-dialog'> 
 
      <view class='wx-dialog-title'>{{ title }}</view> 
 
      <view class='wx-dialog-content'>{{ content }}</view> 
 
  <view class='wx-dialog-footer'> 
 
      <view class='wx-dialog-btn' catchtap='_cancelEvent'>{{ cancelText }}</view> 
 
      <view class='wx-dialog-btn' catchtap='_confirmEvent'>{{ confirmText }}</view> 
 
     </view> 
 
   </view> 
 
  </view> 
 
  //AuglyVideo.wxss文件 
 
  .wx-mask{ 
 
    position: fixed; 
 
    z-index: 1000; 
 
    top: 0; 
 
    right: 0; 
 
    left: 0; 
 
    bottom: 0; 
 
    background: rgba(0, 0, 0, 0.3); 
 
  } 
 
  .wx-dialog{ 
 
    position: fixed; 
 
    z-index: 5000; 
 
    width: 80%; 
 
    max-width: 600rpx; 
 
    top: 50%; 
 
    left: 50%; 
 
    -webkit-transform: translate(-50%, -50%); 
 
    transform: translate(-50%, -50%); 
 
    background-color: #FFFFFF; 
 
    text-align: center; 
 
    border-radius: 3px; 
 
    overflow: hidden; 
 
  } 
 
  .wx-dialog-title{ 
 
    font-size: 18px; 
 
    padding: 15px 15px 5px; 
 
  } 
 
  .wx-dialog-content{ 
 
    padding: 15px 15px 5px; 
 
    min-height: 40px; 
 
    font-size: 16px; 
 
    line-height: 1.3; 
 
    word-wrap: break-word; 
 
    word-break: break-all; 
 
    color: #999999; 
 
  } 
 
  .wx-dialog-footer{ 
 
    display: flex; 
 
    align-items: center; 
 
    position: relative; 
 
    line-height: 45px; 
 
    font-size: 17px; 
 
  } 
 
  .wx-dialog-footer::before{ 
 
    content: ''; 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    right: 0; 
 
    height: 1px; 
 
    border-top: 1px solid #D5D5D6; 
 
    color: #D5D5D6; 
 
    -webkit-transform-origin: 0 0; 
 
    transform-origin: 0 0; 
 
    -webkit-transform: scaleY(0.5); 
 
    transform: scaleY(0.5); 
 
  } 
 
  .wx-dialog-btn{ 
 
    display: block; 
 
    -webkit-flex: 1; 
 
    flex: 1; 
 
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 
 
    position: relative; 
 
  } 
 
  .wx-dialog-footer .wx-dialog-btn:nth-of-type(1){ 
 
    color: #353535; 
 
  } 
 
  .wx-dialog-footer .wx-dialog-btn:nth-of-type(2){ 
 
    color: #3CC51F; 
 
  } 
 
  .wx-dialog-footer .wx-dialog-btn:nth-of-type(2):after{ 
 
    content: " "; 
 
    position: absolute; 
 
    left: 0; 
 
    top: 0; 
 
    width: 1px; 
 
    bottom: 0; 
 
    border-left: 1px solid #D5D5D6; 
 
    color: #D5D5D6; 
 
    -webkit-transform-origin: 0 0; 
 
    transform-origin: 0 0; 
 
    -webkit-transform: scaleX(0.5); 
 
    transform: scaleX(0.5); 
 
  } 
 
  3.   js文件: 
 
         Component构造器用于自定义组件,属性、数据、方法等都是在构造器中调用 
 
  Component({ 
 
     options: { 
 
    multipleSlots: true // 在组件定义时的选项中启用多slot支持 默认只支持一个 
 
  }, 
 
  /** 
 
  * 组件的属性列表 例:页面上的模板字符 {{title}} {{content}} 
 
  * 用于组件自定义设置 
 
  */ 
 
  properties: { 
 
  // 弹窗标题 
 
   title: { // 属性名 
 
    type: String, // 类型(必填),可以是任意类型 
 
    value: '标题' // 属性初始值(可选) 
 
  }, 
 
  // 弹窗内容 
 
  content :{ 
 
    type : String , 
 
    value : '弹窗内容' 
 
  }, 
 
  // 弹窗取消按钮文字 
 
  cancelText :{ 
 
    type : String , 
 
    value : '取消' 
 
  }, 
 
  // 弹窗确认按钮文字 
 
  confirmText :{ 
 
    type : String , 
 
    value : '确定' 
 
  } 
 
  }, 
 
  /** 
 
  * 私有数据,组件的初始数据 
 
  * 可用于模版渲染 
 
  */ 
 
  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"); 
 
  } 
 
  } 
 
  }) 
 
  这时已经写好了组件的属性及方法等,之后开始组件的引用 
 
  4. 首先需要在index.json中引用它 
 
  { 
 
    "usingComponents": { 
 
    "dialog": "/Compent/AuglyVideo/AuglyVideo" //把dialog组件引用到自定义组件中 
 
  } 
 
  } 
 
  组件引用已经设置好了,接下来我们需要在index.wxml中引入它,并增加自定义的一些值 
 
  <view class="container"> 
 
  <dialog id='dialog' 
 
    title='标题' 
 
    content='恭喜你,学会了小程序组件' 
 
    cancelText='知道了' 
 
    confirm='谢谢你' 
 
    bind:cancelEvent="_cancelEvent" //函数不能用双引号括起来 例:{{_cancelEvent}} 
 
    bind:confirmEvent="_confirmEvent"> 
 
  </dialog> 
 
  <button type="primary" bindtap="showDialog"> 点我 </button></view> 
 
  index.js文件 
 
  //index.js //获取应用实例 
 
  const app = getApp()  
 
  Page({ 
 
  /** 
 
  * 生命周期函数--监听页面初次渲染完成 
 
  */ 
 
  onReady: function () { 
 
  //获得dialog组件 
 
    this.dialog = this.selectComponent("#dialog"); 
 
  }, 
 
  showDialog(){ 
 
    this.dialog.showDialog(); 
 
  }, 
 
  //取消事件 
 
  _cancelEvent(){ 
 
    console.log('你点击了取消'); 
 
    this.dialog.hideDialog(); 
 
  }, 
 
  //确认事件 
 
  _confirmEvent(){ 
 
    console.log('你点击了确定'); 
 
    this.dialog.hideDialog(); 
 
  } 
 
  }) 
 
  运行如下: 
 
  遇到的错误: 
 
      当点击取消和确定时,发现没有反应 
 
      解决方法:先在函数中打印下,结果发现没有执行函数,接下来去.wxml页面看下函数有没有写对,发现函数名使用双引号括起来了。去掉双引号就能执行 
 
   好的博客文章: 
 
 
 
来源:oschina
链接:https://my.oschina.net/u/4271149/blog/3552962