小程序(三)

news2024/11/27 2:49:05

十三、自定义组件

(二)数据方法声明位置

在js文件中

A、数据声明位置:data中

B、方法声明位置methods中,这点和普通页面不同

Component({

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

  },

  /**
   * 组件的初始数据
   */
  data: {
   isChecked: false
  },

  /**
   * 组件的方法列表
   */
  methods: {
   //更新复选框的值
   updateValue(){
    this.setData({
      isChecked:!this.data.isChecked
    })
    console.log(this.data.isChecked)
   }
  }
})

(三)Properties

Properties是指组件的对外属性,主要用来接受组件使用者传递给组件内部的数据,和data一同用于组件的模版渲染。

注意:

  1. 设置属性类型需要使用type属性,属性类型是必填项,value属性为默认值。
  2. 属性类型只可以为五种,分别是:String、Number、Boolean、Object、Array。也可以为null表示不限制类型。

我们现在要将数据传递给组件,然后再组件中显示:

  • 在组件中声明要接收的数据和默认值
  properties: {
 
      firstValue:{
      value:'我是默认值',//我是默认值
      style: String
      },
      age:{
        value:23,
        style: Number
      }
  },
  • 在组件中使用
<view>{{firstValue}}、{{age}}</view>
  • 在页面中使用并传递数据
<my_view firstValue="杨大炮" age="23"></my_view>

(四)插槽(slot)

在使用基础组件时,可以在组件中间书写基础组件,这些基础组件会根据在组件中声明的slot位置,插入组件进行显示。

插槽分为默认插槽和具名插槽。如果要开启具名插槽需要再组件js中开启配置项:

options:{
    multipleSlots:true   
  },

然后多个插槽需要增加name属性以区分,在页面中使用时,使用slot属性来确定插入位置。

下面例子:

  • 开启具名插槽(见上)
  • 声明插槽位置:
<text>我是组件中的内容</text>
<view>占位</view>
<slot name="topSlot"></slot>
<text>我是组件中的内容</text>
<view>占位</view>
<slot name="bottomSlot"></slot>
  • 页面中使用,并插入组件
<my_view>
<text slot="topSlot">长安陌上无穷树,</text>
<view></view>
<text slot="bottomSlot">唯有垂杨管别理。</text>
</my_view>

(五)自定义组件数据监视

要在js文件中使用observers属性声明要监视的属性:

  • key:要监视的属性名、value:一个函数,会传入一个参数,参数值是最新改变的值。
observers:{
  'people.name':function(newValue){
    //监视器可以监视对象内部,或者数组内部的数据变化
    console.log(newValue);
  },
  num: function(newValue){
    //监视数据时会传入变化后的数据。
    console.log(newValue);
  }
},

数据:

data: {
    people:{
      name:"陈大炮",
      age: 22
    },
    num: 23
  },

可见,监视属性也可以监视对象属性的变化。监视多个属性可以如上声明多个key:value,也可以如下面方式。

  • 如果要统一监视多个属性
observers:{
  'people.name, num':function(newValue,newValueTwo){
    //监视器可以监视对象内部,或者数组内部的数据变化
    console.log(newValue,newValueTwo);
  },
  • 监视对象中所有属性
observers:{
  'people.**':function(newPeople){
    //参数传入的是新的对象
    console.log(newPeople);
  },

(六)子组件向父组件传递数据

子组件通过triggerEvent方法将自定义事件名,和要传递的数据,页面组件(父组件)使用bind触发子组件传递的事件,则子组件传递的数据就会被放在父组件的event对象的detail属性中。

1、组件中绑定点击事件,触发后将自定义事件传递到父组件

<button type="primary" bind:tap="sendData">发送数据</button>

2、sendData方法如下:

sendData(){
//第一个参数是要发送给父组件的自定义事件名字
//第二个参数是要发送的数据
     this.triggerEvent('giveData',this.data.people);
   }  

3、在父组件中绑定自定义事件,并自定义方法处理得到的子组件状态

<scanme bind:giveData="getData"></scanme>

4、getData方法逻辑如下:

getData(event){
  //得到的子组件状态保存在event.detail中,detail是自定义事件的属性值
      console.log(event.detail);
  }

(七)获取子组件对象

获取子组件对象后,就可以获取子组件对象的所有数据和方法,非常的奈斯!父组件通过调用this.selectComponent方法获取子组件对象。

1、给子组件定义class属性或者id属性

<scanme bind:giveData="getData" class="son"></scanme>

2、通过函数获取子组件对象

<button bind:tap="getMySon" type="warn" plain>获取我的Son</button>
getMySon(){
     let mySon = this.selectComponent(".son");
     //this.selectComponent("#son");//也可以使用ID选择器
     console.log(mySon);
   }

(八)组件的生命周期

生命周期常用的有:created、attached、detached;show、

hide(关于组件所在页面的生命周期)

lifetimes:{
    //创建组件之后执行的函数
    created(){
     //这里不能调用setData函数,但是可以声明组件要使用的属性,供后续生命周期函数使用
     var smallName = "";
     this.setData({
       smallName:"天下无双,谁与争锋!"
     }) //无效,但属性仍存在
    },
    //组件准备完毕,挂在到页面后执行的函数
    //1、这里可以使用setData函数,并且可以使用created函数中声明的属性
    attached(){
       this.setData({
         'people.name':this.data.smallName,
       })
    },
    //组件被销毁,会调用该函数
    detached(){
      console.log("我是你的组件,我被你销毁了,啊啊!");
    },
    //组件所在页面从后台切前台的时候被调用
    show(){
      console.log("我被人从后台切到前台了!");
    },
    //组件被从前台切到后台,或者切换到其他tabBar页面时会被调用!
    hide(){
      console.log("我被人从后台切到前台了!");
    }
    
  }
  • 如何模拟组件被销毁?
<scanme wx:if="{{isShow}}"> </scanme>
<!--通过函数改变isShow的值即可,控制销毁还是重建!-->
<button bind:tap="destroyComponent">销毁组件</button>

(九)使用Component开发页面(Page)

Pages文件夹中的页面中js中Page可以用Component来代替,这样也可以开发页面,使用组件开发页面可以实现更强大的功能!

1、若用此方式,配置项中要和组件的配置项一致,同时json文件中一定要有usingComponent配置项

2、js文件中声明的方法要跟Component一样放在methods配置项中

3、可以使用Properties配置项来接收从其他页面跳转过来时的数据

  • Component({
      methods:{
       //方法应该放在此处
      },
        data:{
          isShow: true //控制组件的生死!
        },
        //使用properties来接收从其他页面跳转过来的数据
        properties:{
          name:String,
          age: Number,
        },
        //监视页面,当数据发生变化时,从控制台展示数据
        observers:{
          "name,age":function(newName,newAge){
            console.log(newName,newAge);
          }
        }
        
    })

    (十)组件逻辑的复用

如果我们创建的很多组件中都有相同的逻辑,将一样的逻辑多次书写,不仅会造成内容的重复,造成代码冗余,更重要的是咱们累呀!哈哈!

使用behavior可以实现组件代码复用;这里假设我们要在组件scanyou中使用组件scanme的逻辑。

一个behavior中可以包含多个属性、方法、声明周期函数等(一句话,组件js中有的,这里都可以有)

1、将要复用的代码提取到behavior.js文件(该文件需要自己创建)中

const behavior =Behavior({

 
  data: {
    people:{
      name:"陈大炮",
      age: 22
    },
    num: 23
  },
observers:{
  
},
  /**
   * 组件的方法列表
   */
  methods: {
   sendData(){
     this.triggerEvent('giveData',this.data.people);
   }   
  },
  lifetimes:{
    //创建组件之后执行的函数
    created(){
     //这里不能调用setData函数,但是可以声明组件要使用的属性,供后续生命周期函数使用
     var smallName = "";
     this.setData({
       smallName:"天下无双,谁与争锋!"
     }) //无效,但属性仍存在
    },
    //组件准备完毕,挂在到页面后执行的函数
    //1、这里可以使用setData函数,并且可以使用created函数中声明的属性
    attached(){
       this.setData({
         'people.name':this.data.smallName,
       })
    },
    //组件被销毁,会调用该函数
    detached(){
      console.log("我是你的组件,我被你销毁了,啊啊!");
    },
    //组件所在页面从后台切前台的时候被调用
    show(){
      console.log("我被人从后台切到前台了!");
    },
    //组件被从前台切到后台,或者切换到其他tabBar页面时会被调用!
    hide(){
      console.log("我被人从后台切到前台了!");
    }
    
  }
});
//暴露
export default behavior;

2、导入到要使用的组件中

import behavior from "./behavior";

// components/scanme/scanme.js
Component({
  //使用
  behaviors:[behavior]
})

3、注意点:

        (1)当组件内properties、data中单层属性或者方法与behaviors属性、方法发生冲突时,以组件内部属性值为主(就近原则

        (2)当有对象属性发生冲突时,会组合对象中的属性,成为一个新的对象。

        (十一)引入外部样式

当页面使用某个组件,想要将自己的样式应用到组件上时,需要用到外部样式!

1、在组件js文件中声明,接受到外部样式后的命名:

  //2、使用外部样式,当组件被使用时通过open-class传入外部样式
  externalClasses:['open-class']

2、在父组件(页面组件)中将自己的样式传入(类名):

<scanme open-class="out-div"> </scanme>

3、在组件中要用到样式之地使用open-class作为类名即可:

<text class="open-class">{{people.name}}</text>

问题:当自己样式和外部样式发生冲突应该如何抉择?

解答:没有规定,需要声明优先级来解决,这里将外部优先级提高:

        两个冲突样式:

/* components/scanme/scanme.wxss */
.in-color{
  color: yellow  !important/*这里给内部样式声明了优先级*/
}

/**index.wxss**/

.out-div{
  color:green
}

故,上面例子,如果两者同时应用了,则以声明优先级的in-color类对应的属性为主!

(十二)使用npm引入外部包

前情提要:小程序现在支持通过npm下载的第三方包(前提是开发者要遵循小程序npm包开发标准),但是下载后的npm包在node_modules中的内容不会被小程序编译,上传,使用,故在使用npm下载完包后,还要多出一步构建的步骤:

1、初始化npm对项目的构建:

npm init -y
  • 完成后,项目中会多出如下三个文件:package.json 、package-lock.json 、node_modules

2、使用npm安装vant-webapp组件(该组件仅举例,其支持小程序)

 npm i @vant/weapp -S --production

3、点击工具栏构建按钮,构建:

  • 构建完成后,会在项目根目录下生成文件夹miniprogram_npm,其中是构建后的项目包。

(十三)复杂项目下目录结构的整理

当我们的小程序项目大小达到一定规模之后,一定需要对文件夹进行整理,将核心代码放到一个文件夹中等等。这时候我们就需要在project.config.json中进行配置:

首先我们需要将相关文件夹都放在miniprogram中,然后把如下文件夹都移进去作为项目的源码。

这时,小程序当然会报错!因为我们变换结构之后,没有告诉项目,新的项目结构逻辑。

  • 更改配置文件project.json如下:
"miniprogramRoot": "miniprogram/", 
"setting": {
    "packNpmManually": true,    
    "packNpmRelationList": [
      {
        "packageJsonPath": "./package",
        "miniprogramNpmDistDir": "./miniprogram"
      }
    ]

后两项配置意思为指定npm包json路径,和项目构建后npm包存放位置。packNpmManually意味开启自定义npm包路径。miniprogramRoot指定跟路径所在位置。

(十四)使用组件库(vant)

该组件库是有赞团队开发的使用于小程序的组件库。上面已经将该库引入并npm构建完毕了!

A、图片组件

下面我们参考文档中图片组件内容进行演示​​​​​​​Vant Weapp - 轻量、可靠的小程序 UI 组件库

1、引入

"usingComponents": {
  "van-image": "@vant/weapp/image/index"
}

2、使用

<!-- 这里注意,src以项目跟路径为/,则要使用静态图片不需要./直接/即可 -->
<van-image width="333" height="250" src="/static/suolong.jpg" />

3、圆角

<van-image width="333" height="250" 
round
src="/static/suolong.jpg" />

4、利用插槽使用加载中组件

 "van-loading": "@vant/weapp/loading/index"

         4.1、在组件中添加属性,并使用加载组件:

<van-image width="333" height="250" 
round
use-loading-slot
src="/static/suolong.jpg" >
<van-loading slot="loading" type="spinner" size="20" vertical />
</van-image>

5、绑定点击事件

<van-image width="333" height="250" 
src="/static/suolong.jpg" 
bind:click="showMeInto">
</van-image>
showMeInto(){
    console.log("我最喜欢02了!")
  }

B、按钮组件

使用步骤略过,这里重点介绍如何使用外部样式引入,参考:Vant Weapp - 轻量、可靠的小程序 UI 组件库

1、首先关闭最新小程序样式,因为小程序最新样式无法完全覆盖。app.js中删除如下选项:

 "style": "v2",

 2、根据文档使用custom-class传入页面需要组件实现的属性:

<van-button type="primary" custom-class="me">主要按钮</van-button>
.me{
  background-color: yellow;
}

这样就可以应用外部属性了。

注意:若要在组件中使用vant则需要关闭组件的样式隔离,在js文件中将:

  // 解除样式隔离
  options:{
    styleIsolation:'shared'
  },

因为解除了样式隔离,所以要注意,不要让组件被页面同名样式污染

3、可以使用全局变量来应用样式:

首先在app.wxss中声明全局变量:

page{
  --color: green;
}

在局部样式中使用:

  color: var(--color) !important;

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

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

相关文章

在Ubuntu安装Carla时按照官方的教程将下载好的资源包解压放到Unreal\CarlaUE4\Content\Carla后执行./Update.sh

在Ubuntu安装Carla时按照官方的教程将下载好的资源包解压放到 Unreal\CarlaUE4\Content\Carla后执行./Update.sh 结果出现&#xff0c;将原来的Carla文件夹备份了有创建了一个新的空白Carla文件夹 原来自己下载解压后就不用再执行./Update.sh这个了&#xff0c;这个命令就是…

【Redis分布式缓存】分片集群

Redis 分片集群 搭建分片集群 集群结构 分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 这里我们会在同一台虚拟机中开启6个redis实例&…

逻辑回归和神经网络(原理+应用)

目录 一、背景介绍 二、题目要求 三、逻辑回归&#xff08;Logistic Regression&#xff09;与神经网络 四、输入输出变量 五、效果评估Gains介绍 六、模型构建 具体应用&#xff1a;预测客户是否有意预订有线电视交互服务 一、背景介绍 当今时代&#xff0c;有线电视交…

【JavaEE 初阶(四)】多线程进阶

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…

JS控制台代码:淘宝PC网页付款页面定时确认付款

淘宝定时抢东西用的 必须先输入完正确密码&#xff0c;考虑上了网络延迟&#xff0c;程序提前一秒钟点击确认&#xff0c;可自行修改&#xff1a; function checkTime() {var now new Date();var hours now.getHours();var minutes now.getMinutes();var seconds now.getS…

线程池核心原理浅析

前言 由于系统资源是有限的&#xff0c;为了降低资源消耗&#xff0c;提高系统的性能和稳定性&#xff0c;引入了线程池对线程进行统一的管理和监控&#xff0c;本文将详细讲解线程池的使用、原理。 为什么使用线程池 池化思想 线程池主要用到了池化思想&#xff0c;池化思想…

vivado 低级别 SVF JTAG 命令

低级别 SVF JTAG 命令 注释 &#xff1a; 在 Versal ™ 器件上不支持 SVF 。 低级别 JTAG 命令允许您扫描多个 FPGA JTAG 链。针对链操作所生成的 SVF 命令使用这些低级别命令来访问链中的 FPGA 。 报头数据寄存器 (HDR) 和报头指令寄存器 (HIR) 语法 HDR length […

健康知识集锦

页面 页面代码 <% layout(/layouts/default.html, {title: 健康知识管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"box-header"><div class"box-title"&g…

CDGA|电子行业数据治理六大痛点及突围之道

CDGA|电子行业数据治理六大痛点及突围之道 随着信息技术的迅猛发展&#xff0c;电子行业对数据的需求和依赖日益增强。然而&#xff0c;数据治理作为确保数据质量、安全性及有效利用的关键环节&#xff0c;在电子行业中却面临着一系列痛点。本文将深入探讨电子行业数据治理的六…

基于LMV358的负电源架构

嘿UU们&#xff0c;中午好啊&#xff01;吃了没&#xff1f;算算时间我的餐桌上应该快上杨梅和鱼胶冻了。 今天看某群&#xff0c;突然想到Jim williams的书里一个架构&#xff0c;但老爷子的东西是正负输出的&#xff0c;而且略微有点麻烦&#xff0c;我就想怎么样整个更适合…

实现网站HTTPS访问:全面指南

在当今网络安全至关重要的时代&#xff0c;HTTPS已经成为网站安全的基本标准。HTTPS&#xff08;超文本传输安全协议&#xff09;通过在HTTP协议基础上加入SSL/TLS加密层&#xff0c;确保了数据在用户浏览器和服务器之间的传输是加密的&#xff0c;有效防止数据被窃取或篡改&am…

专题六_模拟(2)

目录 6. Z 字形变换 解析 题解 38. 外观数列 解析 题解 6. Z 字形变换 6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 解析 题解 class Solution { public:string convert(string s, int numRows) {// 42.专题六_模拟_N 字形变换_C// 处理边界情况if (numRows …

多线程典型例子(4)——线程池

文章目录 一、线程池的基本情况1.1、使用线程池的必要性1.2、线程池为什么比直接在系统中创建线程更高效&#xff1f;1.2.1、纯内核态操作1.2.2、纯用户态操作 1.3、那为什么用户态操作比内核态操作更高效&#xff1f;二、如何在Java中使用线程池2.1、ExecutorService2.1、Thre…

常见JavaWeb混合Vue.js课设中的要点

在校期间我们要做很多课设&#xff0c;实际上&#xff0c;学校教的大概率不足以让多数学生独立做出系统。在网上随便一搜&#xff0c;大抵都是千篇一律的“XXXX”管理系统。这些项目出于方便&#xff0c;往往采用vue作为前端框架而不用原生的JavaScript。 vue的本质要点是避免原…

FPGA HDMI Sensor无线航模摄像头

FPGA方案&#xff0c;接收摄像头sensor 图像数据后&#xff0c;通过HDMI输出到后端 客户应用&#xff1a;无线航模摄像头 主要特性&#xff1a; 1.支持2K以下任意分辨率格式 2.支持多种型号sensor 3.支持自适应摄像头配置&#xff0c;并补齐输出时序 4.可定制功能&#xff…

一文详解|影响成长的关键思考(二)

之前写过一篇《一文详解&#xff5c;影响成长的关键思考》&#xff0c;里面对自己工作前几年的心法进行了总结&#xff0c;并分享了出来。现在又工作了一段时间后&#xff0c;有了一些新的体会&#xff0c;想进一步分析一下&#xff0c;于是便有了此文。的确&#xff0c;思考也…

2024服贸会,参展企业媒体宣传报道攻略

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年中国国际服务贸易交易会&#xff08;简称“服贸会”&#xff09;是一个重要的国际贸易平台&#xff0c;对于参展企业来说&#xff0c;有效的媒体宣传报道对于提升品牌知名度、扩大…

docker学习笔记(五):harbor仓库搭建与简单应用

harbor私有仓库 简介 Docker容器应用的开发和运行离不开可靠的镜像管理&#xff0c;虽然Docker官方也提供了公共的镜像仓库&#xff0c;但是从安全和效率等方面考虑&#xff0c;部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管…

【快捷部署】022_ZooKeeper(3.5.8)

&#x1f4e3;【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

晶片的厚度会影响晶振的频率吗?

晶振&#xff0c;是一种能够产生稳定频率的电子元件&#xff0c;广泛应用于各种电子设备中。晶振的频率参数&#xff0c;即其振荡产生的频率大小&#xff0c;是晶振性能的重要指标之一。石英晶体的切割方式显得至关重要。不同的切割方式&#xff0c;如AT-cut、CT-cut、SC-cut等…