0
点赞
收藏
分享

微信扫一扫

小程序学习笔记(7) -- 自定义组件案例


自定义组件

  • ​​步骤​​
  • ​​创建⾃定义组件​​
  • ​​声明组件​​
  • ​​引入自定义组件​​
  • ​​使用自定义组件​​
  • ​​tabs案例了解自定组件的关键知识点​​
  • ​​自定义组件的其他属性​​

步骤

创建⾃定义组件

声明组件

已经帮我们自动填写上了,看下

小程序学习笔记(7) -- 自定义组件案例_数据_03

引入自定义组件

在demo16.json里面引入test组件,key代表组件的别名

小程序学习笔记(7) -- 自定义组件案例_小程序_04

使用自定义组件

在demo16. wxml使用test组件

<!--pages/demo16/demo16.wxml-->

<test></test>

打开demo16的页面看下效果:

小程序学习笔记(7) -- 自定义组件案例_自定义组件_05


已经显示test组件内容

tabs案例了解自定组件的关键知识点

新建个tabs组件,demo17的页面使用tabs组件
完整代码如下:
tabs.wxml

<view clsss="tabs">
<view class="tabs_title">
<!-- <view class="title_item active">首页</view>
<view class="title_item">原创</view>
<view class="title_item">分类</view>
<view class="title_item">关于</view>
-->
<view wx:for="{{tabs}}" wx:key="id"
class="title_item {{item.isActive ? 'active' : ''}}"
bindtap="handleItemTap"
data-index="{{index}}"
>
{{item.name}}
</view>
</view>
<view class="tabs_content">
<!-- slot 标签其实就是一个占位符
等到 父组件调用 子组件的时候 再传递 标签过来 最终 这些被传递的标签
就会替换slot插件的位置
-->
<slot></slot>
</view>
</view>

tab.js

// Tabs/tabs.js
Component({
/**
* 组件的属性列表
* 里面存放的是 要从父组件接收的数据
*/
properties: {
//要接收的数据的名称
// aaa:{
// //type 要接收的类型
// type: String,
// value:""
// }
tabs:{
type: Array,
value: []
}
},

/**
* 组件的初始数据
*/
data: {

},


/**
* 组件的方法列表
*/
methods: {
handleItemTap: function(e){
console.log(e)
console.log(e.currentTarget.dataset.index)
/**
* 绑定事件,需要在methods中绑定
* 获取被点击的索引
* 获取数组循环
*
* 除了索引的闲的属性为isActivew为true外,其他的均为false
*
* 5.点击事件触发的时候
* 触发父组件中的自定义事件 同时传递数据给 父组件
* this.triggerEvent("父组件自定义事件的名称", 要传递的参数)
*/
//获取索引
const {index} = e.currentTarget.dataset;
//触发父组件中的自定义事件 同时传递数据给 父组件
this.triggerEvent("itemChange", {index})
//获取data中的数组
//解构 对 复杂类型进行解构的时候,复制了一份 变量的引用而已
//最严谨的做法,重新拷贝一份 数组, 再对这个数组的备份进行处理
//let tabs = JSON.parse(JSON.stringify(this.data.tabs))
//不要直接修改 this.data.数据
let {tabs} = this.data;
//等于 let tabs = this.data
//[].forEach 遍历数组,遍历数组的时候, 修改了v,也会导致原数组被修改
// tabs.forEach((v, i) => i==index ? v.isActive=true : v.isActive = false);
// this.setData({
// tabs
// })
}
}
})

tabs.json

{
"component": true,
"usingComponents": {}
}

tabs.wxss

.tabs_title{
display: flex;
padding: 10px;
}
.title_item {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
}
.active{
color: red;
border-bottom: 10rpx solid currentColor;
}

使用组件的页面 demo17
demo17.wxml

<!--pages/demo17/demo17.wxml-->
<!-- <text>pages/demo17/demo17.wxml</text> -->

<!--
1.父组件(页面)向子组件 传递数据 通过 标签属性的方式来传递
1 在子组件上进行接收
2 把这个数据当成是data中的数据直接用即可
2 子向父传递数据 通过事件的方式传递
1.在子组件的标签上加一个 自定义事件
-->

<tabs tabs="{{tabs}}" binditemChange="handleItemChange">
<block wx:if="{{tabs[0].isActive}}">0</block>
<block wx:elif="{{tabs[1].isActive}}">1</block>
<block wx:elif="{{tabs[2].isActive}}">2</block>
<block wx:else>3</block>
</tabs>

demo17.js

// pages/demo17/demo17.js
Page({

/**
* 页面的初始数据
*/
data: {
tabs:[
{
id:0,
name:"首页",
isActive: false
},
{
id:1,
name:"原创",
isActive: true
},
{
id:2,
name:"分类",
isActive: false
},
{
id:3,
name:"关于",
isActive: false
}
]
},
//自定义事件, 用来接收子组件传递的数据
handleItemChange: function(e){
console.log(e);
console.log(e.detail.index);
let {tabs} = this.data;
//等于 let tabs = this.data
//[].forEach 遍历数组,遍历数组的时候, 修改了v,也会导致原数组被修改
tabs.forEach((v, i) => i==e.detail.index ? v.isActive=true : v.isActive = false);
this.setData({
tabs
})
}

})

demo17.json

{
"usingComponents": {
"tabs": "../../components/tabs/tabs"
}
}

效果演示:

切换tab,点击的tab高亮,并变化不同的内容

小程序学习笔记(7) -- 自定义组件案例_小程序_06


小程序学习笔记(7) -- 自定义组件案例_小程序_07


小程序学习笔记(7) -- 自定义组件案例_数据_08

注意点:
父组件向子组件传值
子组件向父组件传值
slot的使用

自定义组件的其他属性

小程序学习笔记(7) -- 自定义组件案例_数据_09


注意observers 只有组件中可以使用,页面是不可以使用这个事件的

笔记补充:
​​​https://docs.qq.com/pdf/DTlVnYnFvdnZYUmNn​​


举报

相关推荐

0 条评论