zoukankan      html  css  js  c++  java
  • 微信小程序----父子组件通信

    组件

      前端开发现在都讲究组件化开发,甚至有的面试官会问啥叫组件化开发。初次听到这个词还是在刚找工作的时候,被面试官问到。当时并没有对一些专业词汇太过关注,因此被问懵了。其实组件化开发,说白了就是,将一部分ui以及样式甚至逻辑抽离出来组成一个单独的文件(模块),然后可以在多个地方使用,需要的数据源有一定的格式规则,产出也是有一定的规则(相同的输入会产生相同的输出)。组件化开发的好处是:增加代码复用性,减少代码量,提高开发效率、便于代码维护、提高系统设计。

      那么当使用组件的时候,就会涉及到数据流向、事件传递的问题。(除非是某些固定的 UI 展示类,不用逻辑,可以简单的写死,类似于静态页)。父组件使用子组件,那么父组件就需要给子组件传值。子组件发生的操作,需要通知父组件,那么就需要将事件或者产生的结果通知到父组件。这就是父子组件的通信。A组件使用B组件,则A是父组件,B是子组件。主要说说,小程序中的父子组件通信和事件的传递。

    先看代码:

    父组件
    // home.wxml 文件
    <view class="container">
      <view class="list-wrap">
        <view class="list-item" wx:for="{{list}}" wx:for-item="paper" wx:for-index="idx" wx:key="idx">
          <list-item id="paperItem" paper="{{paper}}" bind:likeFun="likeFun" bind:collectFun="collectFun" />
        </view>
      </view>
    </view>
    
    // home.json
      "usingComponents": {
        "list-item": "../components/listItem/listItem"
      }
    
    子组件
    // listItem 组件
    <!--pages/components/listItem.wxml-->
    <view class="list-item">
      <view class="item-title">{{paper.title}}</view>
      <view class="item-author">作者:{{paper.author}}</view>
      <view class="item-action">
        <view class="action-like" bindtap="likeClick" >点赞:{{paper.like}}</view>
        <view class="action-collect" bindtap="collectClick" >收藏:{{paper.collect}}</view>
      </view>
    </view>
    
    // listItem.json
    {
      "component": true,
      "usingComponents": {}
    }
    
    // listItem.wxss 是样式文件,仅对这个组件有效
    // listItem.js
    // pages/components/listItem.js
    Component({
      /**
       * 组件的属性列表
       */
      properties: {
        paper: Object
    
      },
    
      /**
       * 组件的初始数据
       */
      data: {
    
      },
    
      /**
       * 组件的方法列表
       */
      methods: {
        likeClick: function() {
          console.log('like');
          let obj = {
            type: 'click',
            event: 'like'
          }
          this.triggerEvent("likeFun", obj)
        },
    
        collectClick: function() {
          console.log('collect');
          let obj = {
            type: 'tap',
            event: 'collect'
          }
          this.triggerEvent("collectFun", obj)
        }
    
      }
    })
    
    

    // 点击点赞打印:
     like
     ==外部事件1== {type: "click", event: "like"}
    // 点击收藏打印:
    collect
    ==外部事件2== {type: "tap", event: "collect"}
    
    解释0

    父组件通过属性的方式(paper),将自己的数据传递给子组件使用,子组件要使用父组件的数据,只能是通过属性的方式接受传递。

    父组件通过 bind方法,绑定一个自己的方法,然后传给子组件一个方法。
    子组件通过调用 trigger 方法来执行父组件的方法,并将子组件的值通过参数传递给父组件。父组件在 e.detail 中获取到子组件传出来的值,这样就完成了父子组件间的通信(数据传递、事件执行)。

    triggerEvent 还可以接受第三个参数来确认事件是否冒泡、事件是否可以穿越组件边界、事件是否拥有捕获阶段。
    附上微信链接

    获取组件实例

      因为微信和Vue、React类似属于数据驱动视图更新,因此一般不用获取实例。微信小程序提供了获取组件实例的方法:this.selectComponent("选择器")
    比如:const child = this.selectComponent('#paperItem');
    若需要自定义 selectComponent 返回的数据,可使用内置 behavior: wx://component-export。
    使自定义组件中支持 export 定义段,这个定义段可以用于指定组件被 selectComponent 调用时的返回值。

  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/xguoz/p/13126805.html
Copyright © 2011-2022 走看看