建设网站怎么学,只有网站才需要域名吗,关键字网站采集,天元建设集团有限公司第十一建筑工程分公司一、自定义组件-插槽
1.1、什么是插槽 在自定义组件的wxml结构中#xff0c;可以提供一个slot节点(插槽)#xff0c;用于承载组件使用者提供的wxml结构 1.2、单个插槽
在小程序中#xff0c;默认每个自定义组件中允许使用一个slot进行占位#xff0c;这种…一、自定义组件-插槽
1.1、什么是插槽 在自定义组件的wxml结构中可以提供一个slot节点(插槽)用于承载组件使用者提供的wxml结构 1.2、单个插槽
在小程序中默认每个自定义组件中允许使用一个slot进行占位这种个数上的限制叫做单个插槽
组件的封装者
view classwrapperview这里是组件的内部节点/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 classwrapper!-- name为before的第一个slot插槽 --slot namebefore/slotview这是一段固定的文本内容/view!-- name为after的第二个slot插槽 --slot nameafter/slot
/view
1.5、使用多个插槽
在使用带有多个插槽的自定义组件时需要用slot属性来将节点插入到不同的slot中示例代码如下
引用组件的页面模板
component-tag-name!-- 这部分内容将被放置在组件slot namebefore的位置上 --view slotbefore这里是插入到组件slot namebefore中的内容/view!-- 这部分内容将被放置在组件slot nameafter的位置上 --view slotafter这里是插入到组件slot nameafter中的内容/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:syncsyncCount/my-test!-- 或者bind后面直接写上自定义事件名称 --my-test count{{count}} bindsyncsyncCount/my-test
3 在子组件的js中通过调用this.triggerEvent(自定义事件名称,{/*参数对象*/})将数据发送到父组件// 子组件的wxml结构text子组件中count值为{{count}}/textbutton typeprimary bindtapaddCount1/button// 子组件的js代码methods:{addCount(){this.setData({count:this.properties.count1})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:syncsyncCount classcustomA idcA/my-test
button bindtapgetChild获取子组件实例/button
getChild(){ // 按钮的tap事件处理函数// 切记下面参数不能传递标签选择器my-test不然返回的是nullconst child this.selectComponent(.customA) // 也可以传递id选择器#cAchild.setData({count:child.properties.count1}) // 调用子组件的setData方法child.addCount() // 调用子组件的addCount方法
}三、自定义组件-behaviors
3.1、什么是behaviors behaviors是小程序中用于实现组件间代码共享的特性类似于Vue.js中的mixins 3.2、behaviors的工作方式 每个behavior可以包含一组属性、数据、生命周期函数和方法组件引用它时它的属性、数据和方法会被合并到组件中每个组件可以引用多个behaviorbehavior也可以引用其他behavior 3.3、创建behavior
调用Behavior(Object object)方法即可创建一个共享的behavior实例对象供所有的组件使用
// 调用Behavior()方法创建实例对象
// 并使用module.exports将behavior实例对象共享出去
module.exportsBehavior({// 属性节点properties:{},// 私有数据节点data:{username:zs},// 事件处理函数和自定义方法节点methods:{},// 其他节点...
})
3.4、导入并使用behavior
在组件中使用require()方法导入需要的behavior挂载后即可访问behavior中的数据或方法示例代码如下
// 1 使用require()导入需要的自定义behavior模块
const myBehaviorrequire(../../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 typeprimaty按钮/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-promise1.0.4
// 在小程序入口文件中(app.js)只需调用一次promisifyAll()方法
// 即刻实现异步API的Promise化
import {promisifyAll} from miniprogram-api-promise
const wxpwx.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 typedanger bindtapgetInfovant按钮/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-miniprogram4.13.2 mobx-miniprogram-bindings1.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.numAthis.numB},// actions方法用来修改store中的数据updateNum1:action(function(step){this.numAstep}),updateNum2:action(function(step){this.numBstep}),
})
8.3、将Store中的成员绑定到页面中
// 页面的.js文件
import {createStoreBindings} from mobx-miniprogram-bindings
import {store} from ../../store/store
Page({onLoad:function(){ // 生命周期函数--监听页面加载this.storeBindingscreateStoreBindings(this,{store,fields:[numA,numB,sum],actions:[updateNum1]})},onUnload:function(){ // 生命周期函数--监听页面卸载this.storeBindings.destoyStoreBindings()}
})
8.4、在页面上使用Store中的成员
// 页面的.wxml结构
view{{numA}}{{numB}}{{sum}}/view
van-button typeprimary bindtapbtnHandler1 data-step{{1}}numA1/van-button
van-button typedanger bindtapbtnHandler1 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 typeprimary bindtapbtnHandler2 data-step{{1}}numB1/van-button
van-button typedanger bindtapbtnHandler2 data-step{{-1}}numB-1/van-button
// 组件的方法列表
methods:{btnHandler2(e){this.updateNum2(e.target.dataset.step)}
}