微信小程序-组件化
业务描述:代码中有多处需要引用同一段代码,需要把他封装成一个组件
<view>
<view>我是标题view>
<view>我是内容view>
view>
主页面直接引用
<section-info/>
<section-info/>
直接引用路径配置
{
"usingComponents": {
"section-info":"/components/section-info/section-info"
}
}
也可在全局配置app.json中进行配置其好处就是配置后所有的page页面都可使用
"usingComponents": {
"section-info":"/components/section-info/section-info"
},
类似于vue 的props
往组件内传递数据
<section-info title="hahah" content="zzzzz" />
<section-info title="hehehehe" content="aaaaa"/>
组件内
properties: {
title:{
type:String,
value:"标题"
},
content:{
type:String,
value:"内容"
}
},
/**
* 组件的初始数据
*/
data: {
},
<view>
<view>{{title}}view>
<view>{{content}}view>
view>
组件bindtap绑定事件
<view>
<view bindtap="ontab">{{title}}view>
<view>{{content}}view>
view>
组件写逻辑在methods中
methods: {
ontab(){
this.triggerEvent("titleclick","bbbb")
}
}
要传递的外部页面
<section-info title="hahah" content="zzzzz" bind:titleclick="oninfo" />
<section-info title="hehehehe" content="aaaaa"/>
oninfo(event){
// console.log("q111");
console.log(event.detail);
},
创建组件 navigation
<view class="tab">
<block wx:for="{{titles}}" wx:key="*this">
<view
class="item"
bindtap="itemtap"
data-index="{{index}}"
class="item {{index === currentIndex ? 'active': ''}}"
>
{{item}}
view>
block>
view>
.tab{
display: flex;
height: 40px;
line-height: 40px;
text-align: center;
}
.active{
border-bottom: 3px solid #ff8189;
padding: 5px;
}
.tab .item{
flex: 1;
}
// components/navigation/navigation.js
Component({
/**
* 组件的属性列表
*/
properties: {
titles:{
type:Array,
value:[]
}
},
/**
* 组件的初始数据
*/
data: {
currentIndex:0
},
/**
* 组件的方法列表
*/
methods: {
itemtap(event){
//console.log(event.currentTarget.dataset);
const currentIndex = event.currentTarget.dataset.index
this.triggerEvent("titleclick",currentIndex)
this.setData({currentIndex})
}
}
})
页面
导入组件
{
"usingComponents": {
"section-info":"/components/section-info/section-info",
"navigation":"/components/navigation/navigation"
}
}
<navigation titles='{{arr1}}' bind:titleclick="oninfo11" />
// pages/05_learn_cpns/index.js
Page({
/**
* 页面的初始数据
*/
data: {
arr1:["蔬菜","水果","青菜"]
},
oninfo11(event){
console.log(event.detail);
},
})
创建组件my-slot
<view>
<view>headerview>
<view>
<slot>slot>
view>
<view>footerview>
view>
{
"usingComponents": {
"my-solt":"/components/my-solt/my-solt"
}
}
<my-solt>
<button>按钮button>
my-solt>
在组件中预留多个插槽
<view>
<view>
<slot name="top" >slot>
view>
<view>
<slot name="center">slot>
view>
<view>
<slot name="descend">slot>
view>
view>
开启多个插槽配置
Component({
options: {
multipleSlots: true
},
})
页面进行使用
<my-solt>
<button slot="top">topbutton>
<view slot="center">centerview>
<button slot="descend">descendbutton>
my-solt>
指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件被自动触发
自小程序基础库2.2.3起,组件的生命周期也可以在lifetimes里进行声明
lifetimes:{
created(){
console.log("created在组件实例刚刚被创建时执行");
},
attached(){
console.log("attached 在组件实例进入页面节点树时执行");
},
ready(){
console.log("ready在组件在视图层完成后执行");
},
moved(){
console.log("moved在组件实例被移动到节点树另一个位置时执行");
},
detached(){
console.log("detached在组件实例被从页面节点树中移除");
},
error(){
console.log("error每当组件方法抛出错误时执行");
}
},