步骤
创建⾃定义组件
新建个test文件加,点击test文件夹右键创建components
自动生成test文件里面的4个文件
声明组件
已经帮我们自动填写上了,看下
引入自定义组件
在demo16.json里面引入test组件,key代表组件的别名
使用自定义组件
在demo16. wxml使用test组件
<!--pages/demo16/demo16.wxml--> <test></test>
打开demo16的页面看下效果:
已经显示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高亮,并变化不同的内容
注意点:
父组件向子组件传值
子组件向父组件传值
slot的使用
自定义组件的其他属性
注意observers 只有组件中可以使用,页面是不可以使用这个事件的
完