118.【微信小程序 - 02】(四)

简介: 118.【微信小程序 - 02】

9.自定义组件 - 父子组件之间的通信

(1).父子组件之间通信的3种方式
  1. 属性绑定
  • 用于父组件向子组件的指定属性设置数据,仅能设置JSON兼容的数据
  1. 事件绑定
  • 用于子组件向父组件传递数据,可以传递任意数据
  1. 获取组件实列
  • 父组件还可以通过 this.selectComponent()获取组件实列
  • 这样就可以直接访问子组件的任意数据和方法
(2).属性绑定 (父亲传递给儿子)

属性绑定用于实现父向子传值,而且只能传递普通类型的数据,无法将方法传递给子组件。

  1. 父亲组件
// 父组件的 data 节点
data:{
count:0
}
// 父组件的wxml结构  count="{{count}}"
<my-test3 count="{{count}}"></my-test3>
<view>{{count}}</view>
  1. 子组件

我们子组件在properties节点种声明对应的属性并使用

// 子组件的 properties 节点
properties:{
  count:Number
}
// 子组件的wxml结构  
<text>子组件->{{count}}</text>
  1. 父亲传递函数

home.wxml

<!--pages/home/home.wxml-->
<text class="t1">首页</text>
<view>
  父组件中Count的值为: {{count}}
</view>
<view>
  ---------------
</view>
//  传递函数
<my-test5 count="{{count}}"></my-test5>
  1. 儿子组件接受参数

tes5t.js

// components/test5/test5.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 注册-> 第一个是注册的变量名,第二个是注册的变量类型
      count: Number
  },
  /**
   * 组件的初始数据
   */
  data: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
  }
})
  1. 儿子组件输出传递过来的组件

test5.wxml

<!--components/test5/test5.wxml-->
<text>父组件传递过来的数据为 : {{count}}</text>

  1. 儿子调用自增的函数

test5.wxml

<!--components/test5/test5.wxml-->
<text>父组件传递过来的数据为 : {{count}}</text>
<button type="primary" bindtap="addCount">点我+1</button>

test5.js

// components/test5/test5.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 注册-> 第一个是注册的变量名,第二个是注册的变量类型
      count: Number
  },
  /**
   * 组件的初始数据
   */
  data: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
    addCount(){
      console.log(this)
      this.setData({
        count:this.properties.count+1
      }) 
    }
  }
})

(3).事件绑定 (儿子传递给父亲)

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

1.在父组件的js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件
2.在父组件的wxml中,通过自定义事件的形式,将步骤1中定义的函数引用,传递给子组件
3.在子组件的js中,通过调用this.triggerEvent('自定义事件名',{/* 参数对象*/}),将数据传递给父组件
4.在父组件的js中,通过e.detail获取到子组件传递过来的数据
  1. 父组件定义一个函数

home.js

Page({
  syncCount(){
    console.log('syncCount')
  },
  /**
   * 页面的初始数据
   */
  data: {
    count:0
  },
})
  1. 父组件将定义的方法传递给子组件

home.wxml

<!--pages/home/home.wxml-->
<text class="t1">首页</text>
<view>
  父组件中Count的值为: {{count}}
</view>
<view>
  ---------------
</view>
<!-- bind:自定义事件名="方法名" -->
<my-test5 count="{{count}}" bind:syc1="syncCount"></my-test5>
  1. 子组件绑定触发事件

test5.js

// components/test5/test5.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 注册-> 第一个是注册的变量名,第二个是注册的变量类型
      count: Number
  },
  /**
   * 组件的初始数据
   */
  data: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
    addCount(){
      this.setData({
        count:this.properties.count+1
      }) 
      // 触发自定义事件,将数值同步给父组件.。 第一个参数是: 自定义事件名,第二个参数是: 传给父类的数据{value:''}
      this.triggerEvent('syc1',{value:this.properties.count})
    }
  }
})
  1. 父组件进行同步接受数据

test5.js

Page({
  syncCount(e){
    console.log('syncCount',e)
    this.setData({
      count:e.detail.value
    })
  },
  /**
   * 页面的初始数据
   */
  data: {
    count:0
  }
})

(4).获取组件实列 (父组件获取子组件实列)

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

home.wxml

<!--pages/home/home.wxml-->
<text class="t1">首页</text>
<view>
  父组件中Count的值为: {{count}}
</view>
<view>
  ---------------
</view>
<!-- bind:自定义事件名="方法名" -->
<my-test5 count="{{count}}" bind:syc1="syncCount" class="customerA"></my-test5>
<button type="warn" bindtap="getChild">获取子组件的实列对象</button>

home.js

Page({
  getChild(){
  // 这里我们通过类选择器获取实列,并用e接受
    const e=this.selectComponent('.customerA')
    console.log('子组件的实列->',e)
    // 我们改变这个count值。注意这里我们不能用this,因为this是父组件并不是子组件。所以我们要用子组件的实列对象进行操作。
    e.setData({
      count:e.data.count+10
    })
  },
  syncCount(e){
    console.log('syncCount',e)
    this.setData({
      count:e.detail.value
    })
  },
  /**
   * 页面的初始数据
   */
  data: {
    count:0
  }
})

10.自定义组件-behavios

(1).什么是behaviors

behaviors是小程序中,用于实现组件间代码共享的特性,类似于Vue.js中的 “mixins”

(2).behaviors的工作方式

每个 behavioor 可以包含一组属性、数据、生命周期函数和方法。组件引用它时,它的属性、数据和方法会被合并到组件中

每个组件可以引用多个behavior,behavior也可以引用其他的 behavior。

(3).创建behavior

调用 Behavior方法即可创建一个共享的 behavior 实列对象,供所有的组件使用:

我们在根目录下创建Behavior这个文件夹中创建一个文件 behavior.js

my-behaviors.js

// 1. 创建一个Behavior并共享出里面的数据
module.exports= Behavior({
  data:{
    username:'jsxs'
  },
  properties:{},
  methods:{}
})
(4).导入并使用 behavior

在组件中,使用 require()方法导入需要的behavior,挂载后 即可访问 behavior中的数据或方法

test5.js

// 1.在我们要用的组件的 .js上面的文件中引入我们自定义的共享数据
const myBehavior=require('../../behaviors/my-behavior')
  // 2. 进行数据的挂载
  behaviors:[myBehavior],
// components/test5/test5.js
// 1.在我们要用的组件的 .js上面的文件中引入我们自定义的共享数据
const myBehavior=require('../../behaviors/my-behavior')
Component({
  // 2. 进行数据的挂载
  behaviors:[myBehavior],
  /**
   * 组件的属性列表
   */
  properties: {
    // 注册-> 第一个是注册的变量名,第二个是注册的变量类型
      count: Number
  },
  /**
   * 组件的初始数据
   */
  data: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
    addCount(){
      this.setData({
        count:this.properties.count+1
      }) 
      // 触发自定义事件,将数值同步给父组件.。 第一个参数是: 自定义事件名,第二个参数是: 传给父类的数据{value:''}
      this.triggerEvent('syc1',{value:this.properties.count})
    }
  }
})

test5.wxml

我们继续通过Mustach语法进行获取数据

<!--components/test5/test5.wxml-->
<text>父组件传递过来的数据为 : {{count}}</text>
<view>
  通过behavior获取的数据: {{username}}
</view>
<button type="primary" bindtap="addCount">点我+1</button>


相关文章
|
小程序 前端开发
阻止小程序事件冒泡的三种方法
阻止小程序事件冒泡的三种方法
1493 0
|
存储 JavaScript 前端开发
“纯血鸿蒙”要来了,赶紧入手学习吧
1月18日,华为宣布HarmonyOSNEXT鸿蒙星河版面向开发者开放申请,这一最新版本的鸿蒙系统也被喻为“纯血鸿蒙”。赶紧入手学习吧
761 1
|
人工智能 搜索推荐 物联网
如何训练个人的Gpt4ALL
如何训练个人的Gpt4ALL
3981 0
如何训练个人的Gpt4ALL
|
计算机视觉 Python
解决 NoneType‘ object has no attribute ‘astype’ 问题
解决 NoneType‘ object has no attribute ‘astype’ 问题
354 0
|
传感器 人工智能 监控
智能水质监测:水源保护与污染控制
【10月更文挑战第24天】智能水质监测技术结合了先进的信息技术、通信技术和传感技术,实现对水质的实时监测、分析与预警,旨在提高水资源利用效率、保障公共健康、维护生态平衡、追踪污染源并建立预警机制。通过传感器、通信技术、数据处理与智能控制技术的综合应用,该技术为水资源保护提供了科学依据和有效手段,促进了水资源的可持续发展。未来,随着技术的不断创新,智能水质监测将在水资源管理中发挥更大作用。
|
机器学习/深度学习 数据采集 算法
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
本文提供了2024泰迪杯A题“生产线的故障自动识别与人员配置”的Python代码实现,包括问题分析、故障数据特征分析、故障报警模型构建、故障时长计算、产量与合格率分析以及操作人员排班方案制定的详细步骤和代码示例。
272 3
【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现
|
9月前
|
存储 安全 算法
即时通讯安全篇(十五):详解硬编码密码的泄漏风险及其扫描原理和工具
本文详细讨论了硬编码密码的成因、危害及治理方法,同时本文从安全人员的角度出发,对现有的硬编码密码检测工具的算法进行了深入调研,并提出了我们的自动化检测工具。
289 7
|
IDE Java 编译器
Java“找不到符号” 错误怎么查找解决
“找不到符号”是Java编程中常见的编译错误,通常表明代码试图访问未声明或不可见的符号(如类、方法或变量)。解决此问题需检查拼写、导入包是否正确及作用域是否合适。确保使用正确的类路径和库,可有效避免此类错误。若问题依旧,查阅官方文档或使用调试工具定位错误亦为良策。
6256 10
|
存储 运维 API
源码解密协程队列和线程队列的实现原理(一)
源码解密协程队列和线程队列的实现原理(一)
204 1
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
802 4
下一篇
开通oss服务