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

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

步骤



创建⾃定义组件


新建个test文件加,点击test文件夹右键创建components

1dc618a0ed9580ce8bfa6facb208c08f.png

5d4c6812c8535adbb050f4ddf2e1bce8.png

自动生成test文件里面的4个文件


声明组件


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

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


引入自定义组件


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

66ba272a0bfc97be54a5fa679e3d5482.png


使用自定义组件


在demo16. wxml使用test组件


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


打开demo16的页面看下效果:

88b9988b40447cb37c7e3c492d49867f.png

已经显示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高亮,并变化不同的内容

80308c27701d3aead18db6c7b167f308.png

1014213c4196c8798c8417b952a8a253.png



注意点:

父组件向子组件传值

子组件向父组件传值

slot的使用


自定义组件的其他属性


bca4cb090baa8da2af298cceffa5d128.png

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





相关文章
|
16天前
|
开发框架 小程序 测试技术
排队免单小程序开发模式案例
排队免单小程序通过线上排队系统,为用户提供便捷的免单机会。主要功能包括用户注册与登录、商家入驻与管理、排队系统、通知与提醒、活动记录与查询。技术实现涉及微信小程序原生开发框架、后端技术、API接口和第三方服务。开发过程还包括全面的测试与优化,确保稳定运行和良好体验。最后,通过提交审核、上线运营和推广策略,吸引更多用户和商家入驻。
|
1月前
|
小程序 数据可视化 JavaScript
微信小程序:轻松实现时间轴组件
本文介绍了如何在微信小程序中实现一个可视化时间轴组件。该组件适用于展示用户资金流动、投资结算等时间节点,帮助用户直观了解资金去向。时间轴支持自定义节点形状、显示序号、倒序排列等功能,并通过插槽灵活定义动态内容。文中详细介绍了组件的设计与使用方法,以及如何结合动态 slot 实现自定义操作。该组件为展示用户资金信息提供了美观、易用的解决方案。
63 1
微信小程序:轻松实现时间轴组件
|
1月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
432 1
|
1月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
63 0
微信小程序:自定义关注公众号组件样式
|
1月前
|
小程序 前端开发 JavaScript
微信小程序图表制作利器:ECharts组件的使用与技巧
微信小程序图表制作利器:ECharts组件的使用与技巧
60 1
|
1月前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
204 1
|
1月前
|
小程序 搜索推荐 前端开发
短剧小程序开发案例
首先,明确你的短剧平台的目标用户群体和他们的需求。比如,年轻用户可能更倾向于轻松、幽默的短剧内容,而家庭用户则可能更偏爱教育、亲子类的短剧。了解用户需求有助于你设计更符合他们口味的功能和界面
|
1月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
236 3
|
1月前
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
50 0
微信小程序更新提醒uniapp
|
3月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
107 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目