小程序开发 组件定义(封装)、组件调用、父子组件方法调用、父子组件传值通讯

摘要:
为了提高代码效率和代码使用率,我们还在applet开发中使用组件封装。今天,我将介绍如何在applet中封装头公共组件。首先,父组件(调用页)的所有json文件都应该引用子组件:index。json{“usingComponents”:{“header”:“../../component/header/header”,}}1.组件定义(封装)子组件:header。wxml˂viewname='head

在小程序开发中,为了提高代码效率,和代码使用率,我们也用到了组件封装,

今天我介绍下如何在小程序中封装一个头部公用组件

首先,所有父组件(调用页面)的json文件都要引用子组件:index.json

{
  "usingComponents": {
    "header": "../../component/header/header",
  }
}

一,组件定义(封装)

子组件:header.wxml

<view  name='header'   id='header'>
    <text>{{userInfo.nickName}}</text>
    <view class='icon-box-r'><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>
</view >

子组件:header.js

// component/header/header.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
   
  },

  /**
   * 组件的初始数据
   */
  data: {
    userInfo:[
        {nickName:'username',avatarUrl:'userImg.jpg'}
    ],
  },

  /**
   * 组件的方法列表
   */
  methods: {
    
  },
  
})

在父组件(调用页面)使用我们封装好的组件:index.wxml

<view class='header-box'>
  <header></header>
</view>

——————————————————————————————————————————————————————————————————————————————————————————

——————————————————————————————————————————————————————————————————————————————————————————

二,父组件(调用页面)向子组件传值通讯

父组件(调用页面):index.wxml

<view class='header-box'>
  <header userInfoName="{{userInfo.nickName}}" userInfoImg="{{userInfo.avatarUrl}}" ></header>
</view>

父组件(调用页面):index.js

// pages/index/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
     userInfo:[
        {nickName:'username',avatarUrl:'userImg.jpg'}
     ]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
   
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },
  
})

子组件:header.wxml

<view  name='header'   id='header'>
    <text>{{userInfo.nickName}}</text>
    <view class='icon-box-r'><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>
</view >

子组件:header.js

// component/header/header.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
     userInfoName: {
       type: String
     },
     userInfoImg: {
       type: String
     }
  },

  /**
   * 组件的初始数据
   */
  data: {
    userInfo:[
        {nickName:'username',avatarUrl:'userImg.jpg'} //若父组件无值传来,此处值可作默认值
    ],
  },

  /**
   * 组件的方法列表
   */
  methods: {
    
  },
  
})

———————————————————————————————————————————————————————————————————————————————————————————————————————————————————

二,子组件向父组件(调用页面)传值通讯

子组件向父组件传值会有2种情况

1,手动触发传值

2,自动触发传值

先来说第一种:手动触发

子组件:header.wxml

<view  name='header'   id='header'>
    <text>{{userInfo.nickName}}</text>
    <view   ><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>
</view >

我们这动手动触发是在父组件点击头部组件来触事件,我们还可以稍微改动下,在子组件中添加方法就可以同时触发父组件的触发方法

【在子组件有表单的时候,该方法就很明显,如果在父组件中的子组件引用区域填写表单就可以触发表单验证】

小程序开发 组件定义(封装)、组件调用、父子组件方法调用、父子组件传值通讯第1张View Code
小程序开发 组件定义(封装)、组件调用、父子组件方法调用、父子组件传值通讯第2张View Code
小程序开发 组件定义(封装)、组件调用、父子组件方法调用、父子组件传值通讯第3张View Code

子组件:header.js

// component/header/header.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
  
  },

  /**
   * 组件的初始数据
   */
  data: {
    userInfo:[],
  },

  /**
   * 组件的方法列表
   */
  methods: {
    userInfo:function(){
      var that = this;
      var userInfo = wx.getStorageSync('userInfo'); //获取本地缓存中的用户信息 
      var myUserInfo = {
         val: userInfo
       }
       this.triggerEvent('userInfo', myUserInfo);
      
      if (userInfo) {
        this.setData({ userInfo: userInfo, })
      } else {
        wx.redirectTo({ url: '../../pages/menu/menu' })
      }
      
      // console.log("userInfo-----///---->", userInfo);
    },
   
  },
  
})

父组件(调用页面):index.wxml

<view class='header-box'>
  <header   bind:userInfo="onUserInfo"></header>
</view>
<text>{{userInfo.nickName}}</text>
<view class='icon-box-r'><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>

父组件(调用页面):index.js

// pages/index/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
     userInfo:[]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },
  onUserInfo: function (e) {
    this.setData({
      userInfo:e.detail.myUserInfo   //赋值到父组件的data集合
    })
  },
  
})

第二种自动触发

先来说第一种:自动触发

子组件:header.wxml

<view  name='header'   id='header'>
    <text>{{userInfo.nickName}}</text>
    <view   ><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>
</view >

子组件:header.js

// component/header/header.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
  
  },

  /**
   * 组件的初始数据
   */
  data: {
    userInfo:[],
  },

  /**
   * 组件的方法列表
   */
  methods: {
    userInfo:function(){
      var that = this;
      var userInfo = wx.getStorageSync('userInfo'); //获取本地缓存中的用户信息 
      
      
      if (userInfo) {
        this.setData({ userInfo: userInfo, })
      } else {
        wx.redirectTo({ url: '../../pages/menu/menu' })
      }
      return userInfo;
      // console.log("userInfo-----///---->", userInfo);
    },
   
  },
  
})

父组件(调用页面):index.wxml 

<view class='header'>
  <header id="header"></header>
</view>
<text>{{userInfo.nickName}}</text>
<view class='icon-box-r'><image   src='http://t.zoukankan.com/{{userInfo.avatarUrl}}'></image></view>

父组件(调用页面):index.js

// pages/index/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
     userInfo:[]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    var that = this;
    var userInfo = this.selectComponent("#header").userInfo(); //调用头部组件用户状态
    
    if (userInfo){
      this.setData({ userInfo:userInfo })
    }
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  },

  
})

免责声明:文章转载自《小程序开发 组件定义(封装)、组件调用、父子组件方法调用、父子组件传值通讯》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用MFC开发ActiveX控件配置yum镜像源下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[Swift]在Swift项目中创建桥接头文件,Swift文件和Objective-C文件相互调用

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://w...

信息安全期末复习

一、米特尼克的圣诞攻击 1、攻击背景 在Unix世界中,可以很容易地给予信任。 假设用户在机器A和机器B上都有一个帐户,为了使两者之间的麻烦最小,就可以在它们之间建立全双工的信任关系。 在A的主目录中,创建一个 .rhosts 文件:echo "hostB 用户名" > .rhosts,在B的主目录中做同样的操作,现在,用户可以使用任何 r* 命令来...

Win32汇编操作注册表

1.打开和关闭子键 注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值: HKEY_C...

boost之ThreadPool

threadpool是基于boost库实现的一个线程池子库,但线程池实现起来不是很复杂。我们从threadpool中又能学到什么东西呢? 它是基于boost库实现的,如果大家对boost库有兴趣,看看一个简单的实现还是可以学到点东西的。 threadpool基本功能 1、任务封装,包括普通任务(task_func)和优先级任务(prio_task_fun...

android自定义控件及自定义组合控件

一、构建自定义控件 构建自定义组件 Android中,你的应用程序程序与View类组件有着一种固定的联系,例如按钮(Button)、文本框(TextView),可编辑文本框(EditText),列表框(ListView),复选框(CheckBox),单选框(RadioButton),滚动条(Gallery),微调器(Spinner), 等等,还有一些比较先...

Android Binder总结

1. MediapplayerService 的启动,怎样在ServiceManager注冊的,不解说详细的细节     ServiceManager 是整个系统的Service总管,其余的系统服务都是通过defaultServiceManager的远程接口来调用ServiceManager。Service获得ServiceManager的接口之后就会把...