微信小程序——自定义组件、插槽

26 篇文章 0 订阅
7 篇文章 0 订阅

微信小程序的自定义组件

组件的使用:

**1.**在根目录创建components文件夹(与pages同级),在此文件夹下再创建一个文件夹(如test),再右键test文件夹选择新建Component,文件名建议与test同名(好管理),完成后会自动在test文件夹下生成同名的.js/.wxml/.json/.wxss四个文件

**2.**在组件的.json文件里设置usingComponents

{
  "component": true,
  "usingComponents": {
    "组件名":"/components/文件夹名/文件名"
    //如:"show":"/components/show/show"
  }
}

**3.**使用组件

3.1局部使用组件:在需要使用的组件的父组件的.json文件内设置usingComponents

{
  "usingComponents": {
  //这里跟上面组件的格式一样
  "引用的组件名":"组件路径"
  }
}

3.2全局使用组件:在根目录下的app.json文件内设置usingComponents,跟局部使用的格式是一样的,但全局使用的usingComponents是和window、page是同级

数据监听器

用于监听和响应任何属性和数据字段的变化,从而执行特定的操作,类似于vue中的watch侦听器

Component({
  properties: {},
  data: {},
  methods: {},
  observers: {
  	'字段A,字段B':function(字段A的新值,字段B的新值){
  		//特定的操作
  	}
  }
})

插槽

插槽(slot)是一个节点,用于承载组件使用者的wxml结构

单个插槽:

小程序中默认是只能使用一个插槽()来进行占位。有个数限制的叫做单个插槽

组件使用者中有多个slot。也就只有第一个有效,它会将后面的slot覆盖掉

组件的.wxml文件

<!-- slot在组件展示的内容(view)的前面,因此组件的使用者所填入的内容也是在组件前面 -->
<view>
  <slot></slot>
  <view>我是单个slot</view>
</view>

组件的使用者的.wxml文件

<test4>
  <!-- view中的内容显示在组件内容的前面 -->
  <view>我是slot要显示的内容</view>
</test4>
多个插槽

需要使用多个插槽时,在组件的.js文件中设置multipleSlots

Component({
//options是与properties、data同级
  options:{
    // 值为true可以启用多插槽slot
    // 设置了多插槽,就要设置相应匹配的name属性,来区分不同的插槽
    multipleSlots:true
  }
})

组件的.wxml文件

<view>
  <!-- slot是为显示组件使用者添加的内容 -->
  <!-- 这个slot占位符的内容就是自定义的,可以留给客户来写,自由发挥,在js文件中若是没有设置multipleSlots:true,那么就只能有一个slot,有多个slot时,只显示第一个slot -->
  <!-- 根据各个插槽所在view的相对位置,使用者中内容显示的位置也是一样 -->
  <slot name="aa"></slot>
  <view>
    今天是个好日子
  </view>
  <slot name="bb"></slot>
</view>

组件使用者的.wxml文件

<!-- 组件中的slot使用来显示组件使用者要另外添加的内容,若组件中没有设置slot标签,添加的内容就显示不出来,简单来说,slot就是占位符 -->
<test4>
  <text slot="aa">我是aa插槽</text>
  <text slot="bb">我是bb插槽</text>
</test4>

父子组件之间的传值:

传值的三种方式:

1.属性绑定:用于父组件向子组件的指定属性设置数据,仅能设置JSON兼容的数据

2.事件绑定:用于子组件向父组件传递数据,可以传递任意数据

3.获取组件实例:父组件还可以通过this.selectComponent()获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法

父组件:组件的使用者

子组件:组件

属性绑定实现父传子;事件绑定实现子传父

父传子:

父组件的.js文件

  // 1.在这里定义要传给子组件的数据
  data: {
    count: 200
  },

父组件的.wxml文件

<!-- 2.在父组件中绑定属性,绑定属性count的值是父组件中data中的变量count -->
<!-- 这里绑定的属性名要与子组件中properties里面的属性一致 -->
<show count="{{count}}"></show>

子组件的.js文件

  // 3.父组件properties中定义了属性,这里的属性要与父组件中的定义的属性一致
  properties: {
    count: Number
  },

子组件.wxml文件

<!-- 5.这里的count就是父组件的绑定属性,是子组件properties中的属性 -->
<view>属性绑定:父传子,传过的值为:{{count}}</view>
子传父:

1.在父组件的.js文件中,定义函数,这个函数是通过自定义事件的形式,传递给子组件

2.在父组件的.wxml中。通过自定义事件的形式,将1中定义的函数引用,传递给子组件

3.在子组件的.js文件中,通过调用this.triggerEvent(‘自定义事件名称’,{/参数对象/}),将数据发送到父组件

4.在父组件的.js文件中,通过e.detail获取子组件传递过来的数据

父组件.js文件

  // 1.在父组件js文件中定义一个函数
  syncCount(){},

父组件.wxml文件

<!-- 事件绑定 -->
<!-- 2.在父组件的wxml文件中自定义一个事件(sync),事件的值就是在.js文件中定义的函数(syncCount) -->
<!-- 格式一 -->
<show count="{{count}}" bind:sync="syncCount"></show>
<!-- 格式二 bind后面的词就是自定义的事件-->
<!-- <show count="{{count}}" bindsync="syncCount"></show> -->

子组件.wxml文件

<!-- 3.在子组件的wxml文件中,点击事件addNum来触发triggerEvent事件 -->
<button type="primary" size="mini" bindtap="addNum">count+1后传给父组件</button>

子组件.js文件

methods: {
    // 3.通调用this.triggerEvent('子组件中自定义的事件',{参数对象}),将数据发送给父组件
    // 参数对象{value:this.properties.count}中的value是可以自定义,这个value要与父组件中定义的函数中的e.detail后面的值一致
    addNum() {
      this.setData({
        count: this.properties.count + 1
      })
      this.triggerEvent('sync', { value: this.properties.count })
    }
  }

父组件.js文件

  // 4.在父组件的js中,通过e.detail获取到子组件传递过的数据
  // e.detail.value中的value就是子组件调用this.triggerEvent()中的对象中的属性value,
  syncCount(e) {
    count: e.detail.value
  },
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值