微信小程序-自定义组件

news2024/11/24 10:27:55

文章目录

  • 微信小程序-自定义组件
    • 概述
    • 创建和使用
    • 数据、方法和属性
    • slot 插槽
      • 默认插槽
      • 具名插槽
    • 组件样式
      • 注意项
      • 样式隔离
    • 数据监听
    • 组件间通信
      • 父传子
      • 子传父
      • 获取子组件实例
    • 生命周期
      • 组件的生命周期
      • 组件所在页面的生命周期
      • App、Page与Component生命周期对比
      • 冷启动
      • 保留当前页面和关闭当前页面跳转
      • 切换后台和切换前台
    • Component构建页面
      • 注意事项
      • 使用
    • behaviors
    • 修改组件默认样式
      • 样式覆盖
      • 外部样式类

微信小程序-自定义组件

概述

小程序目前已经支持组件化开发,可以将页面中的功能模块抽取成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。

创建和使用

创建流程:

一、在根目录下新建 components 文件夹。

二、在 components 文件夹内,新建组件的文件夹,再新文件内新建组件,文件夹名与组件名保持一致。

三、组件可分2种:

  • 公共组件:
    • 将功能模块抽象成自定义组件,方便在不同页面中重复使用。
    • 建议放在根目录下的 components 文件夹中。
  • 页面组件:
    • 将复杂的页面拆分成多个低耦合的模块,方便代码维护。
    • 建议放在对应的页面目录下的 components 文件夹中。

四、IDE 会自动在 json 文件中配置 component 选项:

{
  "component": true
}

五、IDE 会自动在 js 文件中定义 Component() 函数:

Component({

  /**
   * 组件的属性列表
   */
  properties: {

  },

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

  },

  /**
   * 组件的方法列表
   */
  methods: {

  }
})

使用流程;

  • 全局注册:在 app.json 文件中配置 usingComponents 选项,可以全局调用。

    {
      "usingComponents": {
        "my-custom-checkbox": "./components/my-custom-checkbox/my-custom-checkbox"
      } 
    }
    
  • 局部注册:在页面的 json 文件中配置 usingComponents 选项,只能在当前页面中使用。

    {
      "usingComponents": {
        "my-custom-checkbox": "../../components/my-custom-checkbox/my-custom-checkbox"
      }
    }
    

数据、方法和属性

Component 包含3个属性:

  • data:组件内部的数据。
  • methods:组件中的事件处理。
  • properties:组件的对外属性
    • 用于接收外部传递的数据。
    • 支持类型:String / Number / Boolean / Object / Array / null(不限制类型)

定义组件的WXML:

<view class="custom-checkbox-container">
  <view class="custom-check-box {{position ==='right'?'right':'left'}}">
    <checkbox class="custom-checkbox" checked="{{isChecked}}" bindtap="updateChecked" />
    <view>
      <text>{{label}}</text>
    </view>
  </view>
</view>

定义组件的JS:

Component({
  properties: {
    // 标题
    // 可简写为 label: String
    label: {
      type: String,
      value: "",
    },
    // 文字显示位置
    position: {
      type: String,
      value: "right",
    },
  },
  data: {
    isChecked: false,
  },
  methods: {
    updateChecked() {
      this.setData({
        isChecked: !this.data.isChecked,
      })
      console.log(this.data.isChecked)
    },
  },
})

使用:

<my-custom-checkbox label="我已阅读并同意 用户协议 和 隐私协议" position="right" />
<my-custom-checkbox label="匿名提交" position="left" />

效果图:

在这里插入图片描述

slot 插槽

默认插槽

在使用基础组件时,可以给组件传递子节点传递内容,从而将内容展示到页面中,自定义组件也可以接收子节点内容。

只不过在组件模板中需要定义 <slot /> 节点,用于承载组件引用时提供的子节点。

定义默认插槽组件:

<view>
  <text>hello</text>
  <slot />
  <text>world</text>
</view>

使用默认插槽:

<my-custom01>这是一个默认插槽</my-custom01>

效果如下:

在这里插入图片描述

具名插槽

默认情况下,一个组件的 wxml 中只能有一个 slot 。需要使用多 slot 时,可以在组件 js 中声明启用。

同时需要给 slot 添加 name 来区分不同的 slot,给子节点内容添加 slot 属性来将节点插入到 对应的 slot 中。

开启多插槽支持:

Component({
  options: {
    // 开启多slot支持
    multipleSlots: true,
  }
})

定义具名插槽:

<view>
  <slot name="slot-top" />
  <text>hello slot</text>
  <slot />
  <slot name="slot-bottom" />
</view>

使用具名插槽:

<my-custom02>
  <text slot="slot-top">自定义头部</text>
  这是一个具名插槽
  <text slot="slot-bottom">自定义尾部</text>
</my-custom02>

效果如下:

在这里插入图片描述

组件样式

类似于页面,自定义组件拥有自己的 wxss 样式,组件对应 wxss 文件的样式,只对组件wxml内的节点生效。

注意项

  • 不推荐使用标签名选择器,会影响页面和全部组件。
  • 不能使用 id 选择器、属性选择器。
  • 避免使用后代选择器、子元素选择器,可能出现非预期效果。
  • 建议使用 class 选择器。
  • 继承样式,如 font、color,会从组件外继承到组件内。
  • 全局样式、页面样式对自定义组件无效。

样式隔离

默认情况下,自定义组件的样式只受到自定义组件的 wxss 影响。

以下2种情况则受影响:

  1. 全局样式、页面样式使用标签选择器,这种情况下不推荐使用。

  2. 指定样式隔离选项:

    Component({
      options: {
        styleIsolation: 'isolated'
      }
    })
    

    styleIsolation 选项支持以下取值:

    • isolated :默认值,开启样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响。
    • apply-shared :表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面。
    • shared :表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-sharedshared 的自定义组件。

说明:

定义组件和组件样式:

<text class="label">这是一个组件样式</text>
.label {
  color: green;
  font-size: 30rpx;
}

定义页面和页面样式:

<my-custom03 />
<text class="label">这是一个页面样式</text>
.label{
  color:red;
  font-size: 50rpx;
}

当设置 styleIsolation: 'isolated' ,会开启组件隔离,效果如下:

在这里插入图片描述

当设置 styleIsolation: 'shared' ,会开启样式共享,效果如下:

在这里插入图片描述

数据监听

可以通过 observers 选项监听数据和属性的变化。

<view>num:{{num}}</view>
<view>count:{{count}}</view>
<view>
  arr:<text wx:for="{{arr}}" wx:key="index">{{item}}</text>
</view>
<view>user:{{user.name}}-{{user.age}}</view>
<button bindtap="updateData">修改数据</button>
Component({
    data: {
        num: 1,
        count: 10,
        arr: [1, 2, 3],
        user: { name: "小明", age: 18 },
    },
    observers: {
        // 监听数据
        num: function (newNumber) {
            console.log("监听num " + newNumber)
        },
        // 监听多个数据
        "num,count": function (newNum, newCount) {
            console.log(`监听多个数据 ${newNum}  ${newCount}`)
        },
        // 监听数组
        "arr[0]": function (newVal) {
            console.log(`监听数组 ${newVal}`)
        },
        // 监听对象
        "user.age": function (newAge) {
            console.log(`监听对象属性 ${newAge}`)
        },
        // 监听所有属性变化,使用通配符
        "user.**": function (obj) {
            console.log(`监听所有属性变化 ${obj.name} ${obj.age}`)
        },
    },
    methods: {
        // 修改数据
        updateData() {
            this.setData({
                num: this.data.num + 1,
                count: this.data.count + 1,
                "arr[0]": this.data.arr[0] + 1,
                "user.age": this.data.user.age + 1,
                "user.name": this.data.user.name + this.data.num,
            })
        },
    },
})

组件间通信

父传子

  • 在父组件 wxml 中使用数据绑定的方式向子组件传递数据。
  • 在子组件中使用 properties 接收父组件的数据。

定义子组件:

Component({
  properties: {
    propName: {
      type: String,
      value: "",
    },
    propAge: {
      type: Number,
      value: 0,
    },
  },
  data: {
    user: { name: "未命名", age: 0 },
  },
  observers: {
    propName: function (newName) {
      this.setData({
        "user.name": newName,
      })
    },
    propAge: function (newAge) {
      this.setData({
        "user.age": newAge,
      })
    },
  },
})
<text>{{user.name}} - {{user.age}}</text>

在父组件中使用:

<my-son prop-name="小白" prop-age="18" />

子传父

  • 子组件通过 triggerEvent 发送事件。
  • 通过 bind 方法监听事件。

定义子组件:

<text>{{user.name}} - {{user.age}}</text>
<button bindtap="sendData">子组件发送数据</button>
Component({
    methods: {
        sendData() {
			// 第一个参数:事件名
            // 第二个参数:传递的数据
            this.triggerEvent("myevent", "hello world " + Date.now())
        },
    },
})

定义父组件:

// 绑定事件方法
<my-son bind:myevent="getData" prop-name="小白" prop-age="18" />
<view>父组件接收数据:{{msg}}</view>
Page({
    data: { msg: "123" },
    getData(event) {
        this.setData({
            // 通过detail获取数据
            msg: event.detail,
        })
    },
})

获取子组件实例

在父组件中可以通过 selectComponent() 获取子组件的实例。

<my-son id="child" bind:myevent="getData" prop-name="小白" prop-age="18" />
<button bindtap="getChild">获取子组件实例</button>
Page({
    getChild() {
        const child = this.selectComponent("#child")
        console.log(child.data.user) // {name: "小白", age: 18}
    },
})

生命周期

组件的生命周期

组件的生命周期,指的是组件自身的一些函数,这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。

其中,最重要的生命周期是 created attached detached ,包含一个组件实例生命流程的最主要时间点。

组件生命周期:

  • created:组件被创建时执行,此时不能调用 setData()。
  • attached:组件实例进入页面节点树时执行。
  • ready:组件布局完成后执行。
  • moved:组件被移到到另一个位置时执行。
  • detached:组件被移除时执行。

在这里插入图片描述

Component({
  lifetimes: {
    created() {
      console.log("Component created")
    },
    attached() {
      console.log("Component attached")
    },
    ready() {
      console.log("Component ready")
    },
    moved() {
      console.log("Component moved")
    },
    detached() {
      console.log("Component detached")
    },
  },
})

组件所在页面的生命周期

主要用于组件内部监听父组件的展示、隐藏状态,从而方便组件内部执行一些业务逻辑的处理。

组件所在页面的生命周期有 4 个: show、 hide、 resize、 routeDone,需要在 pageLifetimes 字段内进行声明。

组件所在页面的生命周期:

  • show:页面处于显示状态时执行。如后台切换。
  • hide:页面处于隐藏状态时执行。如前台切换。

在这里插入图片描述

Component({
  pageLifetimes: {
    show() {
      console.log("Page show()")
    },
    hide() {
      console.log("Page hide()")
    },
  },
})

App、Page与Component生命周期对比

冷启动

在这里插入图片描述

保留当前页面和关闭当前页面跳转

在这里插入图片描述

切换后台和切换前台

在这里插入图片描述

Component构建页面

Component 可以用于构建页面,适合更复杂的页面逻辑开发。

注意事项

  • json 文件必须包含 usingComponent 选项。
  • Page 中的一些生命周期方法,必须放在 Component 的 methods 中。
  • 组件的属性 Properties 可以用于接收页面的参数,在 onLoad() 中可以通过 this.data 拿到对应的页面参数
Component({
  properties: {
    name: String,
    age: Number,
  },
  data: {
    name: "",
    age: 0,
  },
  methods: {
    onLoad(options) {
      console.log(this.data.name)
      console.log(this.data.age)
      console.log(this.properties.name)
      console.log(this.properties.age)
    },
    updateData() {
      this.setData({
        age: this.data.age + 1,
      })
    },
  },
})

使用

Component({
  properties: {
    name: String,
    age: Number,
  },
  data: {
    name: "",
    age: 0,
  },
  methods: {
    onLoad(options) {
      console.log(this.data);
      console.log(this.data.name)
      console.log(this.data.age)
      console.log(this.properties.name)
      console.log(this.properties.age)
    },
    updateData() {
      this.setData({
        age: this.data.age + 1,
      })
    },
  },
})
<navigator url="/pages/detail/detail?name=小花&age=20">跳转detail页面</navigator>

behaviors

behaviors 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。

创建behaviors并导出:

const behavior = Behavior({
  properties: {
    label: {
      type: String,
      value: "hell world",
    },
  },
  data: {
    name: "张三",
    age: 28,
  },
  methods: {
    updateName() {
      this.setData({
        name: "李四",
      })
    },
  },
})

export default behavior

引入并使用:

import behavior from "../../utils/behaviors.js"

Component({
  behaviors: [behavior]
})

修改组件默认样式

样式覆盖

方法:查找官方文档,找到案例,使用审查元素查看对应的类名。

在这里插入图片描述

可以看到3个信息:

  • .wx-checkbox-input:复选框默认样式。
  • .wx-checkbox-input-checked:复选框选中样式。
  • .wx-checkbox-input.wx-checkbox-input-checked:before:复选框前面✔的样式。

需要先开启 styleIsolation: "shared" 选项。

.wx-checkbox-input {
    border-radius: 50% !important;
    border: 1px solid blue !important;
}
.wx-checkbox-input-checked {
    border: 1px solid red !important;
}
.wx-checkbox-input.wx-checkbox-input-checked:before {
    color: red !important;
}

外部样式类

默认情况下,组件和组件使用者之间如果存在相同的类名不会相互影响。

开发者如果想修改组件的样式,需要就解除样式隔离,在极端情况下,会产生样式冲突。

使用外部样式类步骤:

  1. 开启 externalClasses 选项,可以定义多个外部样式类。
  2. 在自定义组件中使用 class 属性绑定一个样式类,属性值是传递的类名。
  3. 在父组件中使用样式类。

定义组件:

Component({
  // 定义外部样式类
  externalClasses: ["extend-class"],
})
// 属性绑定
<view class="extend-class">
  hello world 外部样式
</view>

使用外部样式:

// 使用样式
<my-external-classes extend-class="my-box" />
.my-box {
  border: 2rpx solid red !important;
}

效果如下:

在这里插入图片描述

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

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

相关文章

极氪汽车困局:营销频繁车、产品力不足

“ 极氪汽车的“车上吃火锅”营销活动虽登上热搜&#xff0c;但因频繁忽视老用户和产品力不足的争议&#xff0c;并未赢得消费者好感&#xff0c;反而加剧负面印象。 ” 科技新知 原创 作者丨颜瞾 编辑丨蕨影 近日&#xff0c;背靠吉利集团的极氪…

信息安全工程师(60)计算机病毒分析与防护

计算机病毒分析 介绍 计算机病毒是一种人为制造的程序&#xff0c;它通过不同的途径潜伏或寄生在存储媒体&#xff08;如磁盘、内存&#xff09;或程序里。当某种条件或时机成熟时&#xff0c;它会自生复制并传播&#xff0c;使计算机的资源受到不同程度的破坏。 定义&#xf…

Java【多线程】单例模式

目录 单例模式 饿汉模式 懒汉模式 懒汉模式-多线程版 单例模式 单例模式是一种设计模式 设计模式相当于棋谱 棋谱&#xff0c;大佬把一些对局整个推演过程&#xff0c;写出来 设计模式&#xff0c;是属于程序员的棋谱 单例模式&#xff08;单个实例/对象&#xff09;&…

Views Page 视图页面

下图中显示的 Views 页面允许自定义网格级别及其相应的 View。 Views &#xff08;视图&#xff09; 页面包含两个主要部分&#xff1a; 关卡设计师;请注意&#xff0c;其他设计器页面为在关卡设计器中选择的 View 提供设置;Properties &#xff08;属性&#xff09; 窗口&…

基于SpringBoot网上超市的设计与实现(论文+源码)_kaic

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此超市商品销售信…

【机器学习】任务七:聚类算法 (K-means 算法、层次聚类、密度聚类对鸢尾花(Iris)数据进行聚类)

目录 1.基础知识 1.1 K-Means 算法 1.2 层次聚类&#xff08;Hierarchical Clustering&#xff09; 1.3 密度聚类&#xff08;DBSCAN&#xff09; 1.4 距离和相似度度量方法 1.5 总结&#xff1a; 2.K-means 算法对鸢尾花&#xff08;Iris&#xff09;数据进行聚类 2.1…

dayjs日期格式化,开发uniapp或unicloud前后端进行时间格式转换

一、 为什么要用日期格式化 因为在开发项目过程中&#xff0c;会遇到各种各样的日期格式&#xff0c;有的显示完整的年-月-日 时:分:秒&#xff0c;而有的场景就只显示月-日等格式&#xff0c;还有就是显示当前时间和注册时间的间隔时长等&#xff0c;场景非常多&#xff0c;如…

[python]从零开始的API调用教程

一、API是什么&#xff1f; API即应用程序编程接口&#xff0c;是一组定义了不同软件系统或组件之间如何交互的规则和协议。API为开发者提供了一种简化的方式&#xff0c;通过预定义的函数或方法&#xff0c;来使用某个软件、库、操作系统或硬件的功能&#xff0c;而不需要深入…

图像编辑大一统?多功能图像编辑框架Dedit:可基于图像、文本和掩码进行图像编辑。

今天给大家介绍一个基于图像和文本的编辑的框架D-Edit&#xff0c;它是第一个可以通过掩码编辑实现图像编辑的项目&#xff0c;近期已经在HuggingFace开放使用&#xff0c;并一度冲到了热门项目Top5。 使用 D-Edit 的编辑流程。用户首先上传一张分割成多个项目的图像。微调 DPM…

CTFHUB技能树之文件上传——前端验证

开启靶场&#xff0c;打开链接&#xff1a; 看到提示是js前端验证 直接F12查看前端源代码&#xff1a; 可以看出对上传的文件做了限制&#xff0c;只能上传.jpg、.png、.gif文件 &#xff08;小插曲&#xff1a;本来我想着直接删除onsubmit处的代码的&#xff0c;但是删了之后…

沈阳乐晟睿浩科技有限公司:引领抖音小店迈向新纪元

在当今数字化浪潮汹涌的时代&#xff0c;电子商务以其独特的魅力和无限潜力&#xff0c;正深刻改变着人们的消费习惯与商业模式。在这场变革中&#xff0c;沈阳乐晟睿浩科技有限公司凭借其敏锐的市场洞察力和卓越的技术实力&#xff0c;成为了抖音小店领域的佼佼者&#xff0c;…

功能推荐 | TopOn 智能管家,开发者收益提升好帮手,一键托管自动提升ARPU!

01 什么是智能管家 智能管家&#xff0c;是TopOn SDK基于广告位填充率、广告源预估收益等大数据学习的基础上开发的一项新功能&#xff0c;它能根据当前开发者流量分组瀑布流配置的数据情况&#xff0c;自动判断对应广告源是否需要开启/关闭&#xff0c;以及是否需要增加Biddi…

SpringBoot整合mybatisPlus实现批量插入并获取ID

背景&#xff1a;需要实现批量插入并且得到插入后的ID。 使用for循环进行insert这里就不说了&#xff0c;在海量数据下其性能是最慢的。数据量小的情况下&#xff0c;没什么区别。 【1】saveBatch(一万条数据总耗时&#xff1a;2478ms) mybatisplus扩展包提供的&#xff1a;…

Verilator——最简单、最细节上手教程

目录 前言工具安装Verilator 安装GTKwave 安装 Verilator 基础用法fst格式和vcd格式的wave文件Verilator 的使用 Verilator 的进阶使用与GDB搭配与makefile搭配 Verilator 的高阶用法访问模块内部数据 前言 此教程会以ubuntu22.04为例 从如何安装&#xff0c;到如何使用 全程帮…

coze上构建必应搜索工作流

首先登入COZE网站&#xff0c;打开工作空间&#xff0c;进入后默认是个人空间&#xff0c;在其下方选择资源库&#xff0c;最后在右上角点击资源按钮&#xff0c;在弹出的列表中点击工作流。 构建必应搜索工作流 Coze官方介绍&#xff1a;必应搜索插件&#xff0c;其中插件输…

【网络】IP协议的地址管理

【网络】IP协议的地址管理 一. IP协议格式二. 地址管理1.动态分配IP地址2.NAT机制2.1 NAT机制下网络的请求/响应 3. 网段划分3.1 特殊的IP地址 4.路由选择5.DNS域名解析系统 一. IP协议格式 4位版本号(version): 指定IP协议的版本&#xff08;IPv4/IPv6&#xff09;, 对于IPv4来…

AI工具:最受欢迎与最佳体验的探索

在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的广泛应用正在彻底改变我们的生活方式、工作方式和社会交往。AI工具不仅在工业生产、医疗诊断、金融服务等领域发挥着关键作用&#xff0c;还深入日常生活&#xff0c;为人们带来便捷与高效。本文将探讨…

基于SpringBoot的旅店管理系统的设计与实现源码+Vue前端(酒店、民宿、功能较多)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

基于JSP实习管理系统【附源码】

基于SSM的学生管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1 系统概述 4.2系统功能结构设计 4.3数据库设计 4.3.1数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1管理员功能介绍 5.1.1管理员登录 5.1.2…

RuoYi-Vue若依 环境搭建 速成

一、若依简介 RuoYi-Vue 是一个开源的后台管理系统&#xff0c;适用于快速开发企业级应用。该平台由两部分组成&#xff1a;前端和后端。 &#xff08;1&#xff09;技术框架 前端技术&#xff1a; Vue.js: 前端框架使用 Vue.js&#xff0c;这是一种流行的JavaScript框架&a…