小程序提升篇-组件

news2024/9/22 15:37:06

提升篇学习目标

如何自定义小程序组件

小程序组件中behaviors的作用

安装和配置vant-weapp组件库

如何使用MobX实现全局数据共享

如何对小程序API进行Promise化

小程序组件学习目标

创建并引用组件(全局、局部、usingComponent

修改组件样式(option-stylesolation

定义和使用数据监听器(observes)

如何定义和使用纯数据字段(option-pureDataPattern)

如何实现组件父子通信三种方式(属性、事件、this.sllectComponent)

如何定义和使用behaviors

1.自定义组件

1.1创建和引用组件

1.1.1创建组件

  • component-新建test文件夹

  • test-新建Component

  • 输入名称会自动生成4个文件:.js, .json, .wxml, .wxss

1.1.2 引用自定义组件

分“局部引用”和“全局引用”

  • 局部引用:页面的.json文件中引入组件

//1.组件引用.json
{
  "usingComponents": {
      "my-test":"/component/test/test1"
  }
}
// 2.组件使用.wxml文件
<my-test><my-test>
  • 全局引用:app.json文件中引入

1.1.3组件和页面的区别

组件和页面都是由js、json、wxml、wxss文件组成的;js和json文件有明显不同

  • 组件json文件声明“component”: true 属性

  • 组件js文件调用的是Component()函数

  • 组件的事件处理函数需要定义到methods节点中

1.2 样式

1.2.1 样式隔离

样式隔离:当前组件样式只对当前组件生效,对其他的页面和其他组件没有影响,防止样式污染

样式注意点:app.wxss文件对组件样式无效

只有class选择器才有样式隔离效果,id选择器、属性选择器、标签选择器不受样式隔离影响

建议:在组件和引用页面,尽量使用class选择器!不要使用其他选择器!!

1.2.2修改组件样式的隔离选项

外界能控制组件内部的样式,可以js通过stylesolation修改组件的样式隔离项,可选值如下

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

1.3 数据、方法

  • data数据:在小程序组件中,用于组件模板的渲染和私有数据,需要定义在data节点中

  • methods方法:事件处理函数和自定义方法(建议_下划线开头,区分事件处理函数)

// component/test/test1.js
Component({
    options:{
        styleIsolation: 'isolated'
    },
    /**
     * 组件的属性列表
     */
    properties: {

    },

    /**
     * 组件的初始数据
     */
    data: {
        num: 0
    },

    /**
     * 组件的方法列表
     */
    methods: {
        addNum() {
            this.setData({
                num: this.data.num +1
            })
            this._showNum()
        },
        _showNum() {
            wx.showToast({
              title: 'num值是'+this.data.num,
              icon: 'none'
            })
        }
    }
})

1.4 properties属性

1.4.1 使用

properties是组件对外属性,用来接收外界传递组件中的数据

//js文件,定义属性   
 properties: {
        // 完整定义写法,需定义默认值,推荐写法
        max: {
            type: Number,
            value: 10
        },
        // 简化写法,不需要指定属性默认值
        max: Number
    },

//使用属性,wxml文件
<view><my-test max="9"></my-test></view>

1.4.2 data和properties的区别

在小程序组件中,properties属性和data数据的用法相同,都是可读可写的,区别是

  • data属性倾向于存储组件的私有数据

  • properties倾向于存储外界传递到组件中的数据

  • this.data === this.properties

1.4.3 setData修改properties的值

data数据和properties属性没有本质区别(本质是同一个对象),都可以为数据重新赋值

1.5 数据监听器

1.5.1 基础用法

用于监听和响应任何属性数据字段的变化,从而执行特定的操作,类似vue中watch

    observers: {
        //'监听属性(逗号分隔可多个)'
        'n1, n2': function(new1,new2){
            this.setData({
                num: new1+new2,
            })
        }
    },

1.5.2 监听对象属性变化

// 监听对象
        'num.a, num.b, num.c': function(a,b,c){
            this.setData({
                newNum : '${a}+${b}+${c}'
            })
        }

注意:js里面`${}`用来动态绑定属性变化

监听对象中所有属性变化,用**通配符表示

// 监听对象
        'num.**': function(obj){
            this.setData({
                newNum : '${obj.a}+${obj.b}+${obj.c}'
            })
        }

1.6 纯数据字段

不用于界面渲染的data字段,也不会传递给其他组件的

优点:提高页面更新的性能

options节点中,指定pureDataPattern为正则表达式

 options:{
        // 匹配所有的_开头的数据字段为纯数据字段
        pureDataPattern: /^_/,
    },

1.7 组件的生命周期

1.7.1 基本介绍

在小程序组件中,重要的生命周期函数有created、attached、detached三个

  • created不能调用setData,只能添加自定义属性字段

  • attached进行大多数初始化工作(如发请求获取初始数据),用的最多

  • detached适合做清理性质工作,如清理监听事件

1.7.2 lifetimes 节点

lifetimes节点用来定义小程序组件生命周期的

Component({
    // 推荐写法
    lifetimes: {
        attached(){},
        datached(){}
    },
})

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

自定义组件的行为依赖页面状态的变化,此时用到组件页面的生命周期

在自定义组件中组件页面的生命周期函数有3个:

1.7.4 pageLifetimes 节点

组件所在页面生命周期函数,需要定义在pageLifetimes节点中

 pageLifetimes: {
        show: function() {},
        hide: function() {},
        resize: function() {}
    },

1.8 插槽

在wxml结构中,可以使用<slot>节点(插槽),用来承载组件使用者提供的wxml结构

1.8.1 单个插槽

组件只允许使用一个插槽进行占位,这个叫单个插槽

1.8.2 启用多个插槽

在js文件启动

options:{
        // 启动多个插槽
        multipleSlots: true,
}

定义插槽:在wxml中使用<slot>定义多个插槽,用name区分不同的插槽

<slot name="s1"></slot>
<slot name="s2"></slot>

使用插槽:

        <my-test max="9">
            <view slot="s1">我是插槽一</view>
            <view slot="s2">我是插槽二</view>
        </my-test>

1.9 父子组件间的通信

  • 属性绑定:父向子组件指定属性设置数据,仅能设置json兼容的数据(普通类型数据)

//子组件js 
properties:{
    count: Num
}
// 子组件的wxml结构中
<test>{{count}}</test>
  • 事件绑定:子组件向父组件传递数据,可传递任意数据

  1. 父组件js中,定义一个函数,通过自定义事件传递给子组件

  syncCount(){
      console.log("syn");
  },
  1. 父组件wxml中,传递给子组件

<my-test max="9" bind:sync="syncCount">
  1. 子组件js中,调用this.triggerEvent('自定义事件名称',{参数对象}),将数据发送给子组件

methods: {
        addNum() {
            this.setData({
                num: this.data.num +1
            })
            this.triggerEvent('sync',{value: this.properties.count})
        }
  1. 父组件js中,通过e.detail获取子组件传递数据

  syncCount(){
      this.setData({
          count: e.detail.value
      })
  },
  • 获取组件实例

父用this.selectComponent('id 或者class选择器')获取子组件实例对象,直接访问子组件的数据和方法

父组件wxml文件

        <my-test bind:sync="syncCount" class="cl">
        </my-test>
        <button bindtap="getChild">获取子组件实例</button>

父js文件

  getChild(){
      const son = this.selectComponent('.cl')
      son.setData({count: son.properties.count +1})
      son.addCount() //调用子组件方法
  },

1.9 behaviors

用于实现组件间代码共享的特性,类似vue的mimins

1.9.1 工作方式

可以包含属性、数据、生命周期函数和方法;属性、数据、方法会合并到数组中

每个组件可以引用多个behavior,behavior可以引用其他的behavior

1.9.2 创建behavior

调用behavior()方法创建一个共享的behavior实例对象,供所有组件使用

在根目录创建behavior/my-behavior.js

module.exports = Behavior({
    data: {
        name: 'lisa'
    },
    properties: {},
    methods: {}
})

1.9.3 导入并使用

在组件中使用require() 导入,挂载后可访问behavior中的数据或者方法

js文件

const myBeha = require('../../behavior/my-behavior')
Component({
    behaviors: [myBeha],
})

1.9.4 可用节点

1.9.5 同名字段覆盖和组合规则

组件和引用的behavior中包含同名字段,参考以下规则:

  • 同名的数据字段(data)

  • 同名的属性(properties)和方法methods

  • 同名的生命周期函数

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

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

相关文章

Java JVM:字节码执行引擎(六)

执行引擎是 Java 虚拟机核心的组成部分之一&#xff0c;执行引擎由软件自行实现 目录一、运行时栈帧结构二、方法调用三、基于栈的字节码解释执行引擎四、OSGI&#xff1a;灵活的类加载器架构一、运行时栈帧结构 Java 虚拟机以方法作为最基本的执行单元&#xff0c;“栈帧”则…

如何用ffmpeg截取视频片段 以及 截取时间不准确的坑

之前在工作中&#xff0c;有遇到需要程序化截取视频片段的场景&#xff0c;这里使用ffmpeg命令行就可以很容易实现&#xff0c;这里也记录下我们使用过程中遇到的坑&#xff0c;希望对大家也有所帮助。    举个例子&#xff0c;当我们要截取视频文件中input.mp4的第15秒到第9…

【C语言练习】逻辑分析题

目录题目一&#xff1a;求名次题目详情&#xff1a;解题思路&#xff1a;题目二&#xff1a;找凶手题目详情&#xff1a;解题思路&#xff1a;题目一&#xff1a;求名次 题目详情&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A…

(02)Cartographer源码无死角解析-(52) 2D点云扫描匹配→ceres扫描匹配:CeresScanMatcher2D→栅格地图残差

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

上海洲邦携手图扑建设数字孪生工厂,获 2022 智能制造优秀场景

前言 12 月 2 日&#xff0c;工信部公示了 2022 年度智能制造示范工厂揭榜单位和优秀场景名单。图扑软件和上海洲邦合作建设的宁波甬友数字孪生工厂被评为优秀场景&#xff0c;全国共有 369 个智能制造典型场景入选。 《智能制造试点示范行动实施方案》包括智能制造优秀场景和…

ESP-IDF:快速排序测试

ESP-IDF:快速排序测试 /快速排序测试/ void printArray(int arr[], int len) { for (int i 0; i < len; i) { cout << arr[i] << " "; } cout << endl; } void QuickSort(int arr[], int start, int end) { int i start; int j end; // 找…

【IoT】蔽障智能车设计:带有无线调试系统的蔽障小车

说明 近年来随着计算机在社会领域的渗透和大规模集成电路的发展&#xff0c;单片机的应用正在不断地走向深入&#xff0c;由于它具有功能强&#xff0c;体积小&#xff0c;功耗低&#xff0c;价格便宜&#xff0c;工作可靠&#xff0c;使用方便等特点&#xff0c;因此越来越广…

Activiti7工作流-使用idea插件actiBPM设计请假流程---工作流工作笔记005

首先我们看一下我们之前写的测试类, ProcessEngine 这个流程引擎,打开 看源码可以看到有几个常用的, HistoryService就是用来管理之前_hi表的,关于历史的 TaskService用来管理任务的 RuntimeService用来管理_run那些运行时的表的 然后我们还可以通过,上面定义的processEngi…

程序员的成长离不开哪些软技能?

道破一个残忍的真相&#xff1a;一个程序员的成长往往是软技能&#xff1e;硬技能&#xff0c;想纯靠技术能力一路挺过35岁基本是不可能的任务&#xff0c;作为一个优秀的程序员&#xff0c;离不开以下这些软技能。 较真 所有在技术上的较真都是一次专业技能的提升&#xff0…

Ruoyi-Cloud框架学习-【07 新增功能模块】

根据该博客新建模块后&#xff0c;在添加具体的数据表实现增删改查 在ruoyi-cloud中建立数据表 新建business_device表中【与gen_table、gen_table_column在一个库】 CREATE TABLE business_device (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) COLLA…

USB转双串口芯片 CH342 兼容替代CP2105

概述CH342是一个USB总线的转接芯片&#xff0c;实现USB转两个异步串口。每个串口都支持高速全双工&#xff0c;支持奇偶校验&#xff0c;提供了常用的MODEM联络信号&#xff0c;用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级到USB总线。特点全速US…

PySpark数据分析基础:核心数据集RDD原理以及操作一文详解(一)

目录 前言 一、RDD概念 二、RDD与DataFrame之间的区别 特性区别 本质区别 三、PySpark中RDD的操作 1.aggregate 2.aggregateByKey 3.map 4.mapPartitions 5.getNumPartitions 6. glom() 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&am…

< 每日算法 - JavaScript解析:用两个栈实现队列 >

每日算法 - JavaScript解析&#xff1a;用两个栈实现队列一、任务描述&#xff1a;拓展知识二、问题解析三、解决方案&#xff1a;参考文献往期内容 &#x1f4a8;一、任务描述&#xff1a; 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和…

JS扩展运算符(...)的用法

参考链接&#xff1a; 本文可以说是完全抄写的参考链接的内容&#xff0c;本文的目的只用于自己进行记录&#xff0c;加深理解。原文参考链接 一、定义&#xff1a; 扩展运算符(...)是ES6的新增语法&#xff0c;用于取出参数对象中的所有可遍历属性&#xff0c;然后拷贝到当前…

vue移动端适配方案

一、基于rem的适配方案 rem是什么&#xff1f; rem是指相对于根元素的字体大小的单位&#xff0c;在日常开发过程中我们通常把根元素&#xff08;html/body&#xff09;的字体设置为10px,方便于我们计算&#xff08;此时子元素的1rem就相当于10px&#xff09;。 适用场景 不…

开学季,给上小学的孩子送什么比较好?小学生比较实用的礼物

很快来临开学的日子&#xff0c;对于上小学的孩子们&#xff0c;送写学习用具之类&#xff0c;或者是孩子自身喜欢的玩具也可以的&#xff0c;但是因为大部分小朋友在学习时都会眨眼睛&#xff0c;也有些近视的现象了&#xff0c;所以我会选择送护眼的用具比较合适的&#xff0…

DBCO-SS-NHS;CAS NO:1435934-53-4 二苯并环辛炔-二硫键-活性酯,科研实验用试剂

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;二苯并环辛炔-二硫键-活性酯&#xff1b;DBCO-SS-NHS CAS NO&#xff1a;1435934-53-4 分子量&#xff1a;565.66 分子式&#xff1a;C28H27N3O6S2 含 量&#xff1a;>95% 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治…

Kettle(三)数据写入错误如何处理?

Kettle作为数据治理工具&#xff0c;总是会涉及到数据的搬迁&#xff0c;在原始数据过大、种类过多时写入肯定会出现一些错误&#xff08;缺少必填项、数据格式错误、主键冲突等等&#xff09;&#xff0c;那么Kettle如何解决&#xff1f;其实Kettle与我们自己写程序的思维不会…

从零开发一个非常有意思的 Python 项目:手势识别

最近开发了一个手势处理的项目&#xff08;零基础也可以学&#xff0c;就是针对零基础的&#xff09;&#xff0c;我在这儿简单的复述一下原理&#xff0c;总体来说还是比较简单的&#xff0c;主要运用的知识就是opencv&#xff0c;python基本语法&#xff0c;图像处理基础知识…

OCR文字识别技术

OCR全称是optical character recognition&#xff0c;中文光学字符识别。主要技术是&#xff1a;把图像形状转变为文本字符。简单来说&#xff0c;OCR技术就是通过图像处理和模式识别技术对光学的字符进行识别&#xff0c;即&#xff0c;对文本资料进行扫描&#xff0c;然后对图…