• 技术文章 >微信小程序 >小程序开发

    浅析小程序中的插槽、父子组件通讯的几种方式

    青灯夜游青灯夜游2021-11-04 10:16:17转载86
    本篇文章给大家介绍一下微信小程序中的插槽、父子组件通讯的几种方式,希望对大家有所帮助!

    今天我们一起看一下小程序中的插槽和父子组件相互通讯方面的内容,来看一下和vue有什么样的区别?【相关学习推荐:小程序开发教程

    一、插槽

    1. 什么是插槽?

    在自定义组件的 wxml 结构中,可以提供一个 节点(插槽),用于承载组件使用者提供的 wxml 结构

    1.png

    其实插槽, 说的通俗一些, 就是 子组件挖坑,父组件填坑 的过程。由父组件在使用子组件的时候, 决定子组件内部的某一些布局展示

    2. 单个插槽

    在小程序中,默认每个自定义组件中只允许使用一个 slot 占位,这种个数上的限制叫做单个插槽

    代码如下(示例):

    <!-- 组件的封装者 -->
    <view class="wrapper">
      <view>这里是组件的内部节点</view>
      <!-- 对于不确定的内容,可以使用<slot>进行占位,具体的内容由组件的使用者决定 -->
      <slot></slot>
    </view>
    
    <!-- 组件的使用者 -->
    <component-tag-name>
      <!-- 这部分内容将被放置在组件<slot>的位置上 -->
      <view>这里是插入到组件slot的内容</view>
    </component-tag-name>

    3. 启动多个插槽

    在小程序的自定义组件中,需要使用多 插槽时,可以在组件的 .js 文件中

    代码如下(示例):

    Component({
      options: {
        multipleSlots: true // 在组件定义时的选项中启用多 slot 支持
      },
      properties: { /* ... */ },
      methods: { /* ... */ }
    })

    4. 定义多个插槽

    可以在组件的 .wxml 中使用多个 标签,以不同的 name 来区分不同的插槽

    代码如下(示例):

    <!-- 组件模板 -->
    <view class="wrapper">
      <!-- name 为 before 的第一个 slot 插槽 -->
      <slot name="before"></slot>
      <view>这是一段固定的文本内容</view>
      <!-- name 为 after 的第二个 slot 插槽 -->
      <slot name="after"></slot>
    </view>

    二、父子组件通讯

    1. 父子组件通讯方式

    2. 属性绑定

    代码如下(示例):

    // 父组件的 data 节点
    data: {
      count: 0
    }
    
    // 父组件的wxml 结构
    <my-test3 count="{{count}}"></my-test3>
    <view>~~</view>
    <view>父组件中,count值为:{{count}}</view>

    子组件在 properties 节点中声明对应的属性并使用 代码如下(示例):

    // 子组件的 properties 节点
    properties: {
      count: Number
    }
    
    // 子组件的 wxml 结构
    <text>子组件中,count值为:{{count}}</text>

    3. 事件绑定的核心实现步骤

    事件绑定用于实现子向父传值,可以传递任何类型的数据。使用步骤如下:

    4. 事件绑定的核心实现代码

    代码如下(示例):

    // 父组件中定义 syncCount 方法
    // 将来,这个方法会被传递给子组件,供子组件进行调用
    syncCount() {
      console.log('syncCount')
    },

    代码如下(示例):

    <!-- 使用 bind: 自定义事件名称(推荐:结构清晰) -->
    <my-test3 count="{{count}}" bind:sync="syncCount"></my-test3>
    <!-- 或在 bind 后面直接协商自定义事件名称 -->
    <my-test3 count="{{count}}" bindsync="syncCount"></my-test3>

    代码如下(示例):

    // 子组件的wxml结构
    <text>子组件中,count值为:{{count}}</text>
    <button type="primary" bindtap="addCount">+1</button>
    
    // 子组件中的 js 代码
    methods: {
      addCount() {
        this.setData({
          count: this.properties.count + 1
        })
        this.triggerEvent('sync', {value: this.properties.count})
      }
    }

    代码如下(示例):

    syncCount(e) {
      // console.log(e.detail.value)
      this.setData({
        count: e.detail.value
      })
    }

    5. 使用 selectComponent 获取组件实例

    父组件如何获得子组件实例?

    可在父组件里调用 this.selectComponent("id或class选择器"),获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器,例如 this.selectComponent(".my-component")

    代码如下(示例):

    // wxml结构
    <my-test3 count="{{count}}" bind:sync="syncCount" class="customA" id="cA"></my-test3>
    <button bindtap="getChild">获取子组件实例</button>
    
    getChild() { // 按钮的tap事件处理函数
      // 切记下面参数不能传递标签选择器 'my-test3',不然返回的是 null
      const child = this.selectComponent('.customA') // 也可以传递 id 选择器 #cA
      child.setData({ count: child.properties.count + 1 }) // 调用子组件的 setData 方法
      child.addCount() // 调用子组件的 addCount 方法 
    }

    更多编程相关知识,请访问:编程入门!!

    以上就是浅析小程序中的插槽、父子组件通讯的几种方式的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    上一篇:一起聊聊微信小程序中的生命周期(函数) 下一篇:小程序中怎么对网络请求进行二次封装
    VIP会员

    相关文章推荐

    • 什么是思维导图?怎么使用F6在小程序中绘制思维导图?• 带大家聊聊小程序中的几种页面传参方式• 浅谈小程序中下拉刷新和上拉加载功能怎么实现?(附代码)• 手把手带你在小程序中实现保存图片组件功能• 浅谈小程序中怎么创建页面二维码• 小程序Vant组件怎么将默认样式单位px转为rpx

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网