本章节内容:小程序自定义组件的创建和使用
组件的引用方式分为 '局部引用' 和 '全局引用'
在页面的.json配置文件中引用组件的方式 叫做'局部引用'
//在页面的 .json文件中引用组件
{
"usingComponents": {
"my-component": "/components/index"
}
}
//在页面的.wxml文件中可以直接使用组件
<view>
<my-component></my-component>
</view>
在app.json全局配置文件中引用组件的方式 叫做全局引用
//在app.json文件中引入组件
{
"pages": [],
"window": {},
"usingComponents": {
"my-component": "/components/index"
}
}
//在页面的 .wxml文件中 使用组件
<view>
<my-component></my-component>
</view>
从表面看 组件和页面都是由.js .json .wxml和.wxss四个文件组件 但是组件和页面的.js与.json文件有明显的不同
组件的事件处理函数需要定义到 methods 节点中
在小程序组件中,事件处理函数和自定义方法需要定义到methods节点中
Component({
//组件方法列表[包含事件处理函数和自定义方法]
methods:{
//声明处理函数
}
})
在小程序组件中 properties是组件的对外属性 用来接收外界传递到组件中的数据
//wxml文件
<my-component max='5'></my-component>
//js文件
Component({
//属性定义
properties:{
//完整定义属性的方法(当需要指定属性默认值时,建议使用此方式)
max:{
// type 表是要接受的数据的类型
type:Number,
//value 默认值
value:10
},
//简化定义属性方式(不需要指定属性默认值时,可以使用简化方式)
max:Number
}
})
在小程序的组件中 properties属性和data数据的用法相同 他们都是可读可写的
data 更倾向于存储组件的私有数据
由于data数据和properties属性本质上没有任何区别 因此properties属性的值也可以用于页面渲染或使用setData
为properties中的属性重新赋值
父组件向子组件传递参数,子组件需要在properties中接收传递过来的参数
//子组件wxml
<view class="container">
<view bindtap="close">关闭</view>
</view>
//子组件wxss样式
.container{
width: 150px;
height: 150px;
background-color: green;
border: 1px solid #000000;
}
//父组件wxml
<view bindtap="childisShow">开启</view>
<my-component wx:if="{{isShow}}"></my-component>
</view>
//父组件js
//在data中定义
data:{
isShow:false
}
//声明方法
childisShow(){
this.setData({
isShow:true
})
},
子传父是通过事件来触发的
this.triggerEvent(“父组件自定义的事件名”,要传递的参数)
来通过事件传递数据给父组件。triggerEvent
方法可以把组件内部的数据传到外面,触发组件外的事件。它接收3个参数:this.triggerEvent('myevent', myEventDetail, myEventOption)。
myEventDetail和myEventOption都是对象,myEventDetail是传到组件外的数据,myEventOption有三个参数可以设置:
//子组件wxml
<view class="container">
<view bindtap="close">关闭</view>
</view>
//子组件wxss样式
.container{
width: 150px;
height: 150px;
background-color: green;
border: 1px solid #000000;
}
//子组件js文件,在methods中声明方法
methods: {
close(){
console.log(!this.data.isShow);
this.triggerEvent('myEvent',!this.data.isShow)
}
}
2、在父组件页面文件用:bind:子组件的事件名=父组件事件名
//wxml
<view bindtap="childisShow">开启</view>
<my-component wx:if="{{isShow}}" bind:myEvent="closechild"></my-component>
</view>
//js
closechild(val){
//val打印出来的是事件对象,不能直接用val赋值,需要用val.detail才能拿到子组件传递过来的值
this.setData({
isShow:val.detail
})
}