微信小程序开发5

一、自定义组件-插槽

1.1、什么是插槽

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

1.2、单个插槽

在小程序中,默认每个自定义组件中允许使用一个<slot>进行占位,这种个数上的限制叫做单个插槽
组件的封装者
<view class="wrapper"><view>这里是组件的内部节点</view><!-- 对于不确定的内容,可以使用<slot>进行占位,具体的内容由组件的使用者决定 --><slot></slot>
</view>
组件的使用者
<component-tag-name><!-- 这部分内容将被放置在组件<slot>的位置上 --><view>这里是插入到组件slot中的内容</view>
</component-tag-name>

1.3、启用多个插槽

在小程序的自定义组件中,需要使用多<slot>插槽时,可以在组件的.js文件中,通过如下方式进行启用
示例代码如下:
Component({options:{multipleSlots:true  // 在组件定义时的选项启用多slot支持},properties:{/* ... */},methods:{/* ... */}
})

1.4、定义多个插槽

可以在组件的.wxml中使用多个<slot>标签,以不同的name来区分不同的插槽,示例代码如下:
组件模板
<view class="wrapper"><!-- name为before的第一个slot插槽 --><slot name="before"></slot><view>这是一段固定的文本内容</view><!-- name为after的第二个slot插槽 --><slot name="after"></slot>
</view>

1.5、使用多个插槽

在使用带有多个插槽的自定义组件时,需要用slot属性来将节点插入到不同的<slot>中,示例代码如下:
引用组件的页面模板
<component-tag-name><!-- 这部分内容将被放置在组件<slot name="before">的位置上 --><view slot="before">这里是插入到组件slot name="before"中的内容</view><!-- 这部分内容将被放置在组件<slot name="after">的位置上 --><view slot="after">这里是插入到组件slot name="after"中的内容</view>
</component-tag-name>

二、自定义组件-父子组件之间的通信

2.1、父子组件之间通信的3种方式

属性绑定:用于父组件向子组件的指定属性设置数据,仅能设置JSON兼容的数据
事件绑定:用于子组件向父组件传递数据,可以传递任意数据
获取组件实例:父组件还可以通过this.selectComponent()获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法

2.2、属性绑定

属性绑定用于实现父向子传值,而且只能传递普通类型的数据,无法将方法传递给子组件,父组件的示例代码如下:
// 父组件的data节点
data:{count:0}
// 父组件的wxml结构
<my-test count="{{count}}"><my-test>
<view>-----</view>
<view>父组件中:count值为:{{count}}</view>
子组件在properties节点中声明对应的属性并使用,示例代码如下:
// 子组件的properties节点
properties:{count:Number
}
// 子组件的wxml结构
<text>子组件中,count值为:{{count}}<text>

2.3、事件绑定

事件绑定用于实现子向父传值,可以传递任何类型的数据,使用步骤如下:
1 在父组件的js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件// 在父组件定义的syncCount方法// 将来,这个方法会被传递给子组件,供子组件进行调用syncCount(){console.log('syncCount')},
2 在父组件的wxml中,通过自定义事件的形式,将步骤1中定义的函数引用,传递给子组件<!-- 使用bind:自定义事件名称 --><my-test count="{{count}}" bind:sync="syncCount"></my-test><!-- 或者bind后面直接写上自定义事件名称 --><my-test count="{{count}}" bindsync="syncCount"></my-test>
3 在子组件的js中,通过调用this.triggerEvent('自定义事件名称',{/*参数对象*/}),将数据发送到父组件// 子组件的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})}}
4 在父组件的js中,通过e.detail获取到子组件传递过来的数据syncCount(e){this.setData({count:e.detail.value})}

2.4、获取组件实例

可在父组件里调用this,selectComponent("id或class选择器"),获取子组件的实例对象,从而直接访问子组
件的任意数据和方法,调用时需要传入一个选择器,例如this.selectComponent(".my-component")
<my-test count="{{count}}" bind:sync="syncCount" class="customA" id="cA"></my-test>
<button bindtap="getChild">获取子组件实例</button>
getChild(){ // 按钮的tap事件处理函数// 切记下面参数不能传递标签选择器"my-test",不然返回的是nullconst child = this.selectComponent('.customA')  // 也可以传递id选择器#cAchild.setData({count:child.properties.count+1}) // 调用子组件的setData方法child.addCount()    // 调用子组件的addCount方法
}

三、自定义组件-behaviors

3.1、什么是behaviors

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

3.2、behaviors的工作方式

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

3.3、创建behavior

调用Behavior(Object object)方法即可创建一个共享的behavior实例对象,供所有的组件使用:
// 调用Behavior()方法,创建实例对象
// 并使用module.exports将behavior实例对象共享出去
module.exports=Behavior({// 属性节点properties:{},// 私有数据节点data:{username:'zs'},// 事件处理函数和自定义方法节点methods:{},// 其他节点...
})

3.4、导入并使用behavior

在组件中,使用require()方法导入需要的behavior,挂载后即可访问behavior中的数据或方法,示例代码如下:
// 1 使用require()导入需要的自定义behavior模块
const myBehavior=require("../../behaviors/my-behavior")
Component({// 2 将导入的behavior实例对象,挂载到behaviors数组节点中,即可生效behaviors:[myBehavior],// 组件的其他节点...
})

3.5、behavior中所有可用的节点

可用的节点       类型              是否必填      描述
properties     Object Map          否        同组件的属性
data           Object              否        同组件的数据
methods        Object              否        同自定义组件的方法
behaviors      String Array        否        引入其他的behavior
created        Function            否        生命周期函数
attached       Function            否        生命周期函数
ready          Function            否        生命周期函数
moved          Function            否        生命周期函数
detached       Function            否        生命周期函数

3.6、同名字段的覆盖和组合规则

组件和它引用的behavior中可以包含同名的字段,此时可以参考如下3种同名的处理规则
1 同名的数据字段(data)
2 同名的属性(properties)或方法(methods)
3 同名的生命周期函数
关于详细的覆盖和组合规则,大家可以参考微信小程序官方文档给出的说明

四、使用npm包

小程序对npm的支持与限制:
目前,小程序已经支持使用npm安装第三方包,从而提高小程序的开发效率,但是,在小程序中使用
npm包有如下3个限制:
        1 不支持依赖于Node.js内置库的包
        2 不支持依赖于浏览器内置对象的包
        3 不支持依赖于C++插件的包

五、使用npm包-Vant Weapp

5.1、什么是Vant Weapp

Vant Weapp是有赞前端团队开发的一套小程序UI组件库,助力开发者快速搭建小程序应用,它所使用的是
MIT开源许可协议,对商业使用比较友好
官方文档地址:https://youzan.github.io/vant-weapp

5.2、安装Vant组件库

在小程序项目中,安装Vant组件库主要分为如下3步:
        1 通过npm安装npm i @vant/weapp -S --production
        2 构建npm包
        3 修改app.json

5.3、使用Vant组件

安装完Vant组件库之后,可以在app.json的usingComponents节点中引入需要的组件,即可在wxml中
直接使用组件,示例代码如下:
"usingComponents": {"van-button":"@vant/weapp/button/index"
}
<van-button type="primaty">按钮</van-button>

5.4、定制全局主题样式

在app.wxss中,写入css变量,即可对全局生效:
page{/* 定制警告按钮的背景颜色和边框颜色 */--button-danger-background-color:#C00000;--button-danger-border-color:#D60000;
}

六、使用npm包-API Promise化

6.1、基于回调函数的异步API的缺点

默认情况下,小程序官方提供的异步API都是基于回调函数实现的,例如,网络请求的API需要按照如下的方式调用:
wx.request({method:'',url:'',data:{},success:()=>{}, // 请求成功的回调函数fail:()=>{}, // 请求失败的回调函数complete:()=>{} // 请求完成的回调函数
})

6.2、什么是API Promise化

API Promise化,指的是通过额外的配置,将官方提供的。基于回调函数的异步API,升级改造为基于
Promise的异步API,从而提高代码的可读性、维护性,避免回调地狱的问题

6.3、实现API Promise化

在小程序中,实现API Promise化主要依赖于miniprogram-api-promise这个第三方的npm包,它的安装
和使用步骤如下:
npm install --save miniprogram-api-promise@1.0.4
// 在小程序入口文件中(app.js),只需调用一次promisifyAll()方法
// 即刻实现异步API的Promise化
import {promisifyAll} from 'miniprogram-api-promise'
const wxp=wx.p={}
promisifyAll(wx,wxp)

6.4、调用Promise化之后的异步API

async getInfo(){const {data:res}=await wx.p.request({method:"GET",url:"https://www.escook.cn/api/get",data:{name:'zs',age:100}})console.log(res)
},
<van-button type="danger" bindtap="getInfo">vant按钮</van-button>

七、全局数据共享

7.1、什么是全局数据共享

全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题
开发中常用的全局数据共享方案有:Vuex、Redux、MobX等

7.2、小程序中的全局数据共享方案

在小程序中,可使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享,其中:
mobx-miniprogram用来创建Store实例对象
mobx-miniprogram-bindings用来把Store中的共享数据或方法,绑定到组件或页面中使用

八、全局数据共享-MobX

8.1、安装MobX相关的包

在项目中运行如下的命令,安装MobX相关的包:
npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
注意:MobX相关的包安装完毕之后,记得删除miniprogram_npm目录后,重新构建npm

8.2、创建MobX的Store实例

import {observable,action} from 'mobx-miniprogram'
export const store = observable({// 数据字段numA:1,numB:2,// 计算属性get sum(){return this.numA+this.numB},// actions方法,用来修改store中的数据updateNum1:action(function(step){this.numA+=step}),updateNum2:action(function(step){this.numB+=step}),
})

8.3、将Store中的成员绑定到页面中

// 页面的.js文件
import {createStoreBindings} from 'mobx-miniprogram-bindings'
import {store} from '../../store/store'
Page({onLoad:function(){  // 生命周期函数--监听页面加载this.storeBindings=createStoreBindings(this,{store,fields:['numA','numB','sum'],actions:['updateNum1']})},onUnload:function(){    // 生命周期函数--监听页面卸载this.storeBindings.destoyStoreBindings()}
})

8.4、在页面上使用Store中的成员

// 页面的.wxml结构
<view>{{numA}}+{{numB}}={{sum}}</view>
<van-button type="primary" bindtap="btnHandler1" data-step="{{1}}">numA+1</van-button>
<van-button type="danger" bindtap="btnHandler1" data-step="{{-1}}">numA-1</van-button>
// 按钮tap事件的处理函数
btnHandler1(e){this.updateNum1(e.target.dataset.step)}

8.5、将Store中的成员绑定到组件中

import {storeBindingsBehavior} from 'mobx-miniprogram-bindings'
import {store} from '../../store/store'
Component({behaviors:[storeBindingsBehavior],  // 通过storeBindingsBehavior来实现自动绑定storeBindings:{store,  // 指定要绑定的Storefields:{    // 指定要绑定的字段数据numA:()=>store.numA,    // 绑定字段的第1种方式numB:(store)=>store.numB,  // 绑定字段的第2种方式sum:'sum'   // 绑定字段的第3种方式},actions:{   // 指定要绑定的方法updateNum2:'updateNum2'}}
})

8.6、在组件中使用Store中的成员

// 组件的.wxml结构
<view>{{numA}}+{{numB}}={{sum}}</view>
<van-button type="primary" bindtap="btnHandler2" data-step="{{1}}">numB+1</van-button>
<van-button type="danger" bindtap="btnHandler2" data-step="{{-1}}">numB-1</van-button>
// 组件的方法列表
methods:{btnHandler2(e){this.updateNum2(e.target.dataset.step)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧井盖监测管理系统解决方案

一、方案概述 近年来&#xff0c;随着城市化的不断发展&#xff0c;城市地下管道设施的一步步完善&#xff0c;井盖作为城市基础设施中必不可少的一部分&#xff0c;其重要性也逐渐凸显。然而&#xff0c;在实际应用中&#xff0c;井盖监测和管理并不容易。如井盖地理位置分散&…

【libevent】http客户端1:转存http下载的数据

read_http_input // // HTTP endpoint: GET /rpc/1 (list methods) or POST /rpc/1 (execute RPC) // // JSON-RPC API endpoint. Handles all JSON-RPC method calls. // static void rpc_jsonrpc(evhttp_request *req, void *opaque) {RpcApiInfo *ap =

第一百一十四天学习记录:C++提高:类模板案例(黑马教学视频)

类模板案例 main.cpp代码&#xff1a; #include "myarray.hpp"void printIntArray(MyArray <int>& arr) {for (int i 0; i < arr.getSize(); i){cout << arr[i] << " ";}cout << endl; }void test01() {MyArray <int&…

史上最全,接口测试-Fiddler抓包常用功能总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Fiddler中常用的功…

冒泡排序实现原理

文章目录 前言一、算法原理二、复杂度三、Java实现总结 前言 冒泡排序&#xff08;Bubble Sort&#xff09;,是一种比较简单的排序算法。 它重复地走访要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果它们的顺序错误&#xff0c;则把它们交换位置。走访元…

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.8 (21G725) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…

C++运算符:优先级

#include <iostream> using namespace std;//#define INT int //宏命令 // typedef int BOO; //移动 // INT a10; // BOO b 12;void fun(string& str) {int pos str.find(a);cout << "位置" << pos << endl;str.replace(pos,…

Windows Active Directory密码同步

大多数 IT 环境中&#xff0c;员工需要记住其默认 Windows Active Directory &#xff08;AD&#xff09; 帐户以外的帐户的单独凭据&#xff0c;最重要的是&#xff0c;每个密码还受不同的密码策略和到期日期的约束&#xff0c;为不同的帐户使用单独的密码会增加用户忘记密码和…

微信小程序弱网监控

前言 在真实的项目中&#xff0c;我们为了良好的用户体验&#xff0c;会根据用户当前的网络状态提供最优的资源&#xff0c;例如图片或视频等比较大的资源&#xff0c;当网络较差时&#xff0c;可以提供分辨率更低的资源&#xff0c;能够让用户尽可能快的看到有效信息&#xf…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项&#xff1a; 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒&#xff0c;20岁的女生风华正茂&#xff0c;没有人会一直风华正茂&#xff0c;也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性&#xff08;重点&#xff09;1.磁盘、OS、MySQL&#xff0c;在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…

安全杂记 - 状态码,DNS,编码

目录 1.状态码2.DNS解析过程3.URL编码4.HTML实体编码5.FORM表单 1.状态码 200 - 请求成功 301 - 资源&#xff08;网页等&#xff09;被永久转移到其它URL 302 - 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 304 - 未修改。所请求的资源未修改&#…

WebSocket工具类

最近的项目在整长连接WebSocket&#xff0c;之前也写过一个感觉没有这个全面。提供个工具类WebSocketHelper和Java-WebSocket-1.3.9.jar包以及一个HttpURLConnectionUtil 1、WebSocketHelper import android.util.Log;import org.java_websocket.client.WebSocketClient; imp…

Two Days wpf 分享 分页组件

迟来的wpf分享。 目录 一、序言 二、前期准备 三、前端界面 四、后台代码部分 1、先定义些变量后面使用 2、先是按钮事件代码。 首页按钮 上一页按钮 下一页按钮 末尾按钮 画每页显示等数据 每页显示多少条 判断是否为数字的事件 分页数字的点击触发事件 跳转到…

HCIP——OSPF基础

OSPF基础 一、OSPF基础二、OSPF的区域划分三、OSPF的数据包hello包数据库描述包DBD包链路状态请求包LSR包链路状态更新包LSU包链路状态确认包LSAck包 四、OSPF的状态机五、OSPF的工作过程六、链路状态型的路由生成过程七、条件匹配五、OSPF数据包头部八、OSPF的接口网络类型 一…

链动2+1系统开发模式有没有风险?

现在的分销模式层出不穷&#xff0c;很多人都不知道分销与传销的区别&#xff0c;甚至认为最近很火的一个分销模式链动21也是个传销盘。那么&#xff0c;链动21模式究竟涉不涉传&#xff1f;有没有风险呢&#xff1f;下面就来具体说一下。 首先分销不是传销&#xff0c;分销是商…

Kafka生产者性能调优技巧

Kafka生产者性能调优技巧 一、Kafka生产者简介1.1 概述1.2 Kafka生产者性能的重要性1.2.1 批量发送消息1.2.2 指定分区1.2.3 使用压缩算法1.2.4 合理设置ACKs参数 二、Kafka生产者性能调优技巧2.1 硬件配置优化2.1.1 CPU、内存、磁盘等硬件参数调整注意事项2.1.2 如何通过负载均…

(css)列表点击前后样式

(css)列表点击前后样式 效果&#xff1a; html <ul v-show"rightOne" class"one-content"><liv-for"(item,index) in exampleList":key"index"click"searchHandle(item,index)"class"liClass":class&qu…

Java中的LRU缓存算法

Java中的LRU缓存算法 LRU&#xff08;Least Recently Used&#xff09;缓存算法是一种常见的缓存淘汰算法&#xff0c;用于在缓存空间不足时决定哪些数据需要被淘汰&#xff0c;以便为新的数据腾出空间。LRU算法的基本思想是&#xff1a;当缓存满时&#xff0c;淘汰最近最少使…

MySQL函数讲解(谓词、CASE)

目录 MySQL常见函数 字符串函数 进行字符串操作的函数 算术函数 进行数值计算的函数 日期函数 进行日期操作的函数 转换函数 进行数据类型和值转换的函数 流程函数 进行条件删选 聚合函数 进行数据聚合的函数 谓词 一般用于条件判断 什么是函数 函数指一段可以直接被…