小程序的组件化开发

news2024/12/23 18:12:23

目录:

1 小程序组件化思想

2 自定义组件的过程

3 组件样式实现细节

4 组件使用过程通信

5 组件插槽定义使用

6 Component构造器

在小程序里面需要创建组件的话需要在最外层建component包,然后在使用新建component来创建类似page的4个文件:

组件和页面的区别就是,组件文件会有额外显示是组件的标致:

js文件由component包裹

json文件里面会有

小程序的内置组件是可以直接使用的,但是上面创建的自定义组件是需要我们在使用组件的页面的json文件里面配置注册小程序的自定义组件名称以及路径:

如果某个自定义组件使用的地方很多,需要在很多页面json文件里面注册很麻烦,这时候我们可以在最外层的app.json文件里面注册这个自定义组件,注册的方法和上图一致。直接在app.json里面写

"usingComponents":{"xxx":"xxxxx"},

关于组件样式注意点:

1、在组件的css文件中不要使用id选择器、标签选择器、属性选择器,如果你使用了这些选择器,那么这个css样式会影响到其他组件的样式和页面的样式。

2、在组件中使用css样式建议使用class类选择器,此时的类选择器只会作用于组件自身,对使用该组件的页面不生效。

3、使用组件的页面的css样式的id选择器、属性选择器,class类选择器不会影响到组件的样式。但是标签选择器会影响到组件样式。

4、有时候确实有需求在页面的class类选择器能够作用于组件样式,那就需要在组件的js文件中写入下图的代码,把隔离的选项改变即可。

组件的通信包括:传递数据(properties),传递样式(externalClasses),传递标签(插槽slot),传递自定义事件。

传递数据:

如果type的类型是null,那么就是不限制类型。子组件使用properties来接收父组件传递的参数。

传递样式:

不建议使用这个,组件该什么样式就定义好。传递方式需要在页面的wxss定义好类,然后传递给组件,组件在js文件中接受并在标签中使用该样式。

传递自定义事件:

组件中写事件需要写在methods里面,和页面不同,页面的事件函数直接写。子组件通过

可以通过this.triggerEvent("自定义名字","参数")给父组件传递自定义事件 。

父组件可以直接使用子组件的某个方法、函数:

获取对应的组件实例对象是需要在该组件上使用class命名,然后在js用this.selectComponent(".class名称")来获得组件实例对象。

插槽的应用:

微信小程序的插槽不支持默认值,<slot>hhh</slot>这样子是没有用的,不会页面显示。

解决这个插槽不支持默认值的方法是使用伪类(使用css的方法解决): 

下图的<view class="default">哈哈哈哈</view>就是默认值,通过css的伪类:empty判断插槽是否为空,利用兄弟选择器选择默认值的class赋给display。

插槽分为单个插槽和多个插槽,

这样子插画入插槽,插槽是不知道你插入的是哪个位置的 ,所以超过一个以上的插槽需要给插槽添加名字并且还要在组件的js文件中option启用多插槽才行。

插槽给予名字和使用多个插槽的方法:

behavior:

类似于vue的mixin混入,就是把options api的内容写在一个单独js文件,这个文件一般创建一个新的叫behavior的包。然后在需要复用这个behavior的内容的组件添加behavior:[ ]

即可。创建和使用如下图,左边是behavior的js文件内容,右边是使用behavior文件的组件。

 

组件的生命周期最重要的三个生命周期(created,attached,detached):

页面的生命周期和组件的生命周期不一样,组件的生命周期是写在lifetime的options里面,而页面的生命周期每一个都是一个options api。

 在组件的js逻辑里面也是可以监听使用该组件的页面的生命周期,使用方法就是和lifetime同级别再写一个pagetime:{}即可。

 

最后就是关于组件的js文件里面的构造器,就是可以使用的东西:

使用组件的页面:

wxml代码:

<!--pages/07_learn_cpns/index.wxml-->
<!-- 1.内置组件 -->
<text>pages/07_learn_cpns/index.wxml</text>

<!-- 2.自定义组件 bind:原来绑定子组件发送给父组件的自定义事件名称(titleclick)
onSectionTitleClick为父组件定义的函数 
下面的info原来传递样式的,abc是该页面定义的一个css样式
 -->
<section-info 
  info="abc" 
  title="我与地坛" 
  content="要是有些事情我没说, 别以为是我忘记了"
  bind:titleclick="onSectionTitleClick"
/>
<section-info info="cba" title="黄金时代" content="在我一生中最好的黄金时代, 我想吃, 我想爱"/>

<!-- 3.测试组件样式 -->
<test-style/>
<view class="title">我是页面的title</view>


<!-- 4.tab-control的使用 此处是选项卡的选项, -->
<tab-control
  class="tab-control"
  titles="{{digitalTitles}}"
  bind:indexchange="onTabIndexChange"
/>
<button bindtap="onExecTCMethod">调用TC方法</button>

<tab-control titles="{{['流行', '新款', '热门']}}"/>

wxss代码:

/* pages/07_learn_cpns/index.wxss */
.title {
  background-color: skyblue;
}

.abc {
  background-color: #0f0;
}

.cba {
  background-color: #00f;
}

json代码:

{
  "usingComponents": {
    /* 从根目录下的component文件找下列的组件*/
    "section-info": "/components/section-info/section-info",
    "test-style": "/components/test-style/test-style",
    "tab-control": "/components/tab-control/tab-control"
  }
}

js代码:

// pages/07_learn_cpns/index.js
Page({
  data: {
    digitalTitles: ['电脑', '手机', 'iPad']
  },
  onSectionTitleClick(event) {
    console.log("区域title发生了点击", event.detail);
  },
  onTabIndexChange(event) {
    const index = event.detail
    console.log("点击了", this.data.digitalTitles[index]);
  },
  onExecTCMethod() {
    // 1.获取对应的组件实例对象
    const tabControl = this.selectComponent(".tab-control")

    // 2.调用组件实例的方法
    tabControl.test(2)
  }
})

组件section-info的代码:

wxml代码:

<!--components/section-info/section-info.wxml-->
<view class="section">
  <view class="title" bindtap="onTitleTap">{{ title }}</view>
  <view class="content info">{{ content }}</view>
</view>

wxss代码:

/* components/section-info/section-info.wxss */
.section .title {
  font-size: 40rpx;
  font-weight: 700;
  color: red;
}

.section .content {
  font-size: 24rpx;
  color: purple;
}

js代码:

// components/section-info/section-info.js
Component({
  properties: {
    title: {
      type: String,
      value: "默认标题"
    },
    content: {
      type: String,
      value: "默认内容"
    }
  },
  externalClasses: ["info"],
  
  methods: {
    onTitleTap() {
      console.log("title被点击了~");
      this.triggerEvent("titleclick", "aaa")
    }
  }
})

组件tab-control的代码:

wxml代码:

<!--components/tab-control/tab-control.wxml-->
<view class="tab-control">
  <block wx:for="{{ titles }}" wx:key="*this">
    <view 
      class="item {{index === currentIndex ? 'active': ''}}"
      bindtap="onItemTap"
      data-index="{{index}}"
    >
      <text class="title">{{ item }}</text>
    </view>
  </block>
</view>

wxss代码:

/* components/tab-control/tab-control.wxss */
.tab-control {
  display: flex;
  height: 40px;
  line-height: 40px;
  text-align: center;
}

.tab-control .item {
  flex: 1;
}

.tab-control .item.active {
  color: #ff8189;
}

.tab-control .item.active .title {
  border-bottom: 3px solid #ff8189;
  padding: 5px;
}

js代码:

// components/tab-control/tab-control.js
Component({
  properties: {
    titles: {
      type: Array,
      value: []
    }
  },

  data: {
    currentIndex: 0
  },

  methods: {
    onItemTap(event) {
      const currentIndex = event.currentTarget.dataset.index
      this.setData({ currentIndex })

      // 自定义事件
      this.triggerEvent("indexchange", currentIndex)
    },
    test(index) {
      console.log("tab control test function exec");
      this.setData({
        currentIndex: index
      })
    }
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知乎版ChatGPT「知海图AI」加入国产大模型乱斗,称效果与GPT-4持平

“2023知乎发现大会”上&#xff0c;知乎创始人、董事长兼CEO周源和知乎合作人、CTO李大海共同宣布了知乎与面壁智能联合发布“知海图AI”中文大模型。 周源据介绍&#xff0c;知乎与面壁智能达成深度合作&#xff0c;共同开发中文大模型产品并推进应用落地。目前&#xff0c;知…

AUTOSAR存储服务之FEE换页策略介绍

概述 如下图是AUTOSAR Memory Stack的架构图,对于Memory Stack的介绍请参考AUTOSAR MemoryStack详细介绍_钢琴上的汽车软件的博客-CSDN博客 随着现在MCU携带的内置flash空间越来越大,从成本节省以及方便使用等方面考虑,在产品设计和开发过程中常用Flash EEPROM Emulation技…

CTFHub | eval执行

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

手推广告论文(二)Wide Deep 推荐系统算法Wide Deep Learning for Recommender Systems

Wide & Deep Learning for Recommender Systems 论文地址https://arxiv.org/pdf/1606.07792.pdf 摘要 广义线性模型结合非线性特征转换&#xff0c;在处理具有大规模稀疏输入的回归和分类问题中已被广泛应用。通过一系列交叉积特征转换来记忆特征交互既有效又具有解释性…

【分布式事务 本地部署Seata服务】分布式事务框架Seata本地部署详细讲解

前言 这篇文章我会从0到1详细搭建分布式事务框架seata的使用&#xff0c;那么我们首先要先了解一下什么是分布式事务&#xff1f; 本篇文章是本地启动seata服务并且注册到nacos中&#xff0c;在SpringCloud中整合seata框架请转移下方连接 点我跳转SpringCloud整合seata教程&…

VMware ESXi 8.0U1 Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

发布 ESXi 8.0U1 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u1-sysin/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-04-18, VMware vSp…

【真北直播笔记】董越:简明DevOps学习地图

缘起 真北敏捷社区的宗旨是&#xff1a;求知、连接。求知就是学习&#xff0c;家里没矿的话&#xff0c;学习是一个人最重要的动力之源。连接就是把人拉在一起&#xff0c;我们相信人与人的互动会带来美好的变化。今天的直播是把大家拉在一起学习&#xff0c;就是求知、连接。 …

【万人推荐】黑客成长技术清单

最近两天&#xff0c;在reddit安全板块和Twitter上有个GitHub项目很火&#xff0c;叫“Awesome Hacking”。 “Awesome Hacking”在reddit上有超过四百个赞&#xff0c;但管理员后来认为不适合该板块&#xff08;Awesome类项目没有新的内容&#xff09;&#xff0c;给了“rejec…

十大排序算法之插入排序、希尔排序、选择排序

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 本篇主要讲解八大排序算法中的三种排序&#xff0c;分别是&#xff1a;插入排序、希尔排…

家用洗地机有什么优缺点?实用的洗地机分享

随着科技的不断发展&#xff0c;家庭清洁设备也在不断更新换代。现在市场上最常见的家用清洁设备包括洗地机、扫地机器人和吸尘器。这些设备各有优缺点&#xff0c;但在清洁效果、清洁范围和清洁方式等方面存在差异。洗地机是一种专业的清洁设备&#xff0c;它能够深度清洁地面…

SpringCloud之Gateway组件简介

网关的理解 网关类似于海关或者大门&#xff0c;出入都需要经过这个网关。别人不经过这个网关&#xff0c;永远也看不到里面的东西。可以在网关进行条件过滤&#xff0c;比如大门只有对应的钥匙才能入内。网关和大门一样&#xff0c;永远暴露在最外面 不使用网关 前端需要记住每…

Javascript进阶专题总结(函数、异步编程、设计模式)

函数式编程什么时候用 编程方法&#xff1a;函数式(js)&#xff0c;面向对象(java,c)&#xff0c;命令式 函数式&#xff08;工具式操作&#xff09; 优点&#xff1a;JavaScript种函数是一等公民&#xff0c;便于拆分组合可扩展性好&#xff0c;方便tree-shaking 缺点&…

【Linux系统】系统安全及应用二

开关安全控制一、开个安全控制1.1调整BIOS引导设置1.2GRUB限制1.3终端安全控制二、系统弱口令检查2.1安装JR工具三、网络端口扫描3.1NMAP端口扫描3.2NETSTAT&#xff0c;SS查看端口信息一、开个安全控制 1.1调整BIOS引导设置 将第一引导设备设为当前系统所在硬盘禁止从其他设…

1-时间复杂度分析

时间复杂度 ①what&#xff1a; 指执行当前算法所消耗的时间 ②简介结论&#xff1a; 时间复杂度由多项式T(n)中最高阶的项来决定&#xff0c;系数的影响忽略即可 例子&#xff1a; 操作数量T(n) 时间复杂度O(f(n)) 常数&#xff0c;比如 100000&#xff08;即&#xff1…

ChatGPT将批量文档翻译成中文的方法

文档翻译成中文软件是指在处理文档时&#xff0c;自动将文档中的内容翻译成中文的软件。这些软件通常采用自然语言处理技术&#xff0c;通过对待翻译文本的分词、词义分析、语法分析等多种技术处理&#xff0c;实现对文本中的单词、短语、句子等级别的翻译。 文档翻译成中文软件…

CSDN,有幸遇见 ——我的三周年创作纪念日

一生二&#xff0c;二生三&#xff0c;三生万物 三年&#xff0c;与 CSDN 的相遇相识相知—— 前两年都没写&#xff0c;一是没纪念的概念&#xff0c;二是纪念日这天每年总是清明节。 还有就是不知道有勋章&#xff08;&#xff08; Meet 遇见 那年&#xff0c;我六年级&a…

JVM 垃圾回收详解之垃圾收集算法+垃圾收集器

标记-清除算法 该算法分为“标记”和“清除”阶段&#xff1a;首先标记出所有不需要回收的对象&#xff0c;在标记完成后统一回收掉所有没有被标记的对象。 它是最基础的收集算法&#xff0c;后续的算法都是对其不足进行改进得到。 这种垃圾收集算法会带来两个明显的问题&…

Node.js—path模块

目录 1、什么是path模块2、path.resolve 拼接规范的绝对路径 常用3、path.sep 获取操作系统的路径分隔符4、 path.parse 解析路径并返回对象5、path.basename 获取路径的基础名称6、path.dirname 获取路径的目录名7、path.extname 获得路径的扩展名8、 path.join()路径拼接 1、…

Linux高性能服务器编程|阅读笔记:第2章 - IP协议详解

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

超越ChatGPT:AgentGPT正在将自主AI带到浏览器中

你好&#xff0c;欢迎来到人工智能领域的新时代&#xff01;今天我们介绍AgentGPT&#xff0c;这是一款最前沿的基于浏览器的平台&#xff0c;旨在革新人工智能的自主性。这项开创性的技术让你能够在舒适的网络浏览器中创建、配置和部署定制化的人工智能代理&#xff0c;以实现…