uniapp——第3篇:自定义组件、组件间传数据

news2024/12/22 18:08:36

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,还有一定要会Vue!(Vue2\Vue3)都要会!!!不然不好懂

一、组件是啥玩意?

我之前讲vue2的文章讲过

Vue全家桶:vue2+vue3全部搞懂:第八篇,重要!正式工程化项目开发——开始怎么写代码-CSDN博客

我直接借用里面的截图,懒得写了

简单说,<view>、<button>、<scroll-view>、<input>......这些都是组件,每一个元素、盒子都算组件,但是这些是前端开发者们设置好的。那么我们这节课要讲的是如何自己写一个组件,比如我要用一个元素叫<damn!>

组件又分:根组件、普通组件

根组件:App.vue文件就是根组件!它包括了整个页面的各大块

普通组件:【整个页面的各大块(头部、侧边、底部、中间......)】 以及 【各大快里的各小块(头部里的小按钮、搜索框、小图标.......)】

简单来说,一个.vue文件就是一个组件

二、怎么自己创建组件

我自己根据vue2的工程化开发写过一篇

https://blog.csdn.net/m0_73991249/article/details/136435311?spm=1001.2​​​​​​014.3001.5501

vue官方文档也有介绍

组件基础 | Vue.js

uniapp的官方文档也有,不过会跟vue的有一丢丢区别,下面会讲到

uni-app官网

那么具体怎么弄?

第一步:自己手动新建一个叫component的文件夹

文件夹名字别写错,只有写对了,右键它才会有“创建组件”

需要注意的是,组件的命名不能乱命名,要遵循两个规则:

1、“小驼峰”(不同单词拼接首字母大写)    2、或者“-连接”(不同单词拼接中间用“-”)

第二步:重点来了!!看看uniapp神奇的方便的一点

vue里面,我们创建好组件之后,需要在要用的地方import导入才能用

下面是vue里面的例子:

然而在uniapp里不用!!创建完就可随便用

下面是uniapp的例子

你只需要在components文件夹里创建好组件,然后直接在要用的地方【<自定义组件></自定义组件>】就行了!

三、组件之间怎么传数据?

还是一样,我的这个文章讲过vue里面组件怎么传输数据:https://blog.csdn.net/m0_73991249/article/details/136435311?spm=1001.2014.3001.5501#t17

不过当时写得很乱,而且跟uniapp有那么一点点区别,那么这里再来清晰捋一遍

父传子

首先第一步:创建好组件

创建了父组件和子组件,在父组件里使用子组件了

然后第二步:子组件里定好传数据的变量名字

我们希望在父组件里给子组件设置展示不同的文字和图片

那么先在子组件里用【defineProps( )】传入一个数组,然后再数组里定义【允许父亲传过来的变量名】

我这么解释吧,你想要你老板给你正常发工资,那你就要去自己办几张银行卡,然后通过一个“邮箱”(defineProps)把你的银行卡卡号(['xxx','xxx'])发给你老板,不然你老板不知道怎么发给你啊,总不能他给你办好卡然后再通知你吧?

第三步:父组件拿那些传数据变量名开始传数据

在父组件里,在父组件的子组件标签里写上子组件自己定义的变量名,静态传数据的话就直接当成一个属性写就行了,动态传数据的话要用v-bind:

还是大白话,员工把银行卡卡号发给老板了,那老板就对应着银行卡卡号发钱,保险金发保险金的卡,工资发工资的卡,年终奖发年终奖的卡......

第四步:子组件怎么在vue部分使用父组件传来的数据值?

不能直接拿传数据的变量名来用,要再用一个变量名接收整个defineProps的所有数据

翻译大白话:好,现在你手头一堆银行卡了,你总不能全把卡号记下来,然后真去一个卡对应下载一个app去查看余额吧?不是有微信和支付宝嘛!你直接用一个支付宝把所有银行卡添加进去,然后想看那张卡的余额,直接通过支付宝查看不就好了

第五步:怎么去修改父组件传来的值?

子组件现在是可以用父亲的数据了,但是你不能直接改父组件的数据啊,父组件传过来的只是一个“只读”权限的数据

这时候就可以用computed计算属性来直接修改了

翻译成大白话:你老板给你发多少工作就是多少工资,你没有能力去改变你老板想给你发多少钱。但是你可以通过“黑科技”、“收买会计”、“偷偷改账本”(computed)来把老板要发你的工资修改成你满意的数目,有点抽象....自行理解吧

这里可以对比一下vue的父组件传子组件,uniapp跟vue没有太大差别,只是把子组件的【props】换成【defineProps】

props校验

Props | Vue.jsvue的官方文档有详情

还是之前vue说过的,你给(vue2里面是:props)defineProps( )里面传对象形式参数,然后再在里面的每一个传数据变量都设置成对象,那就可以限制父组件传入正常的数据值过来了,而不是乱传错误值

一些校验项:

defineProps({
  // 基础类型检查
  // (给出 `null` 和 `undefined` 值则会跳过任何类型检查)
  propA: Number,
  // 多种可能的类型
  propB: [String, Number],
  // 必传,且为 String 类型
  propC: {
    type: String,
    required: true
  },
  // Number 类型的默认值
  propD: {
    type: Number,
    default: 100
  },
  // 对象类型的默认值
  propE: {
    type: Object,
    // 对象或数组的默认值
    // 必须从一个工厂函数返回。
    // 该函数接收组件所接收到的原始 prop 作为参数。
    default(rawProps) {
      return { message: 'hello' }
    }
  },
  // 自定义类型校验函数
  // 在 3.4+ 中完整的 props 作为第二个参数传入
  propF: {
    validator(value, props) {
      // The value must match one of these strings
      return ['success', 'warning', 'danger'].includes(value)
    }
  },
  // 函数类型的默认值
  propG: {
    type: Function,
    // 不像对象或数组的默认,这不是一个
    // 工厂函数。这会是一个用来作为默认值的函数
    default() {
      return 'Default function'
    }
  }
})

But!!!为了更好的可读性,我们不应该一个数据类型一个数据类型的传(比如标题值传标题值、图片值传图片值),应该换一种方式

采用直接在父组件传对象的形式,你文字、照片统一打包成一个对象传过来

注意,要传对象形式的数据,要把default默认值项写成函数,把值通过return传出去

别忘了在父组件里的子组件标配加入要传的数据变量

用大白话给大伙捋一下:

props校验就是,你老板瞎鸡掰乱发,一会发一个月一毛钱,一会发一小时一万块,一会给你卡里转一笔黑钱......那你这边就要设置一些“法律措施”来限制你老板这么乱搞。在你发员工信息邮箱的时候,你就要把对应的每一张银行卡要发什么钱、对应的法律文件都添加进去。

父组件传对象就是,你老板现在要发布工作任务给各个部门、各个员工,他不可能一份文件一份文件这样分开发吧?肯定是打包一个个压缩文件(对象),然后再多选微信联系人(v-for)转发出去。别光记得多选联系人,却忘了多选文件转发(传数据)

然后你员工子组件,再根据不同的压缩文件、任务,把里面细分的任务、功能,分别实现

子传夫

有的时候子组件也需要传数据给父组件 

比如我下面这个例子:需求是点击子组件里的按钮,子组件发送一个随机数给父组件,父组件拿到后在父组件里展示出来

第一步:通过$emit( )函数传输数据

子组件里某个地方当触发一个事件的时候,绑定上$emit( )函数,通过$emit( )函数传输数据

$emit( )函数里,第一个参数是“自定义事件”,第二个参数是你要传的数据值

翻译大白话就是:富二代败家子没钱了,想找老爸老妈爆金币但又不好意思,就找他的一个朋友或者表姐表弟($emit( )函数)帮忙,那么朋友、姐弟就告诉他:“你给两个信息我:1、你想一个借口给我,我才好跟你爸妈提要钱    2、你想要多少钱?”

那么我们假设败家子给出的信息是:1、我出车祸了   2、要100万美刀

第二步:在父组件里给子组件绑定上同名的自定义事件来获取数据

刚刚子组件自定义了一个事件,那么就需要在父组件里去触发这么一个自定义事件,一触发了,就能拿到子组件的数据值

前面我们也学过,页面对页面之间发送参数数据的时候,是通过事件对象获取的数据值;那么子组件传父组件一样,在父组件里当触发了自定义事件之后,绑定执行一个函数,这个函数里调用【事件对象】参数,就能获取到子组件的值

翻译大白话:败家仔的死党、姐弟帮他发了条短信给败家子的父母,败家子的父母一看短信:“WTF?儿子出车祸了?!”,很显然败家子自创的这个“车祸事件”触发了父母的爱子情怀,父母马上询问需要多少钱——好了,获取到儿子想要100万美刀的信息。

这里“自定义事件”一定要同名,比如你想,败家子想的借口是“车祸事件”,你传到他父母那边是“买车事件”,他父母肯定接下来儿子发的信息都懒得看,吊毛小子又想找我爆金币,懒得理他!

当然还可以把子组件传数据的部分移到<script>部分去写

这里对一下vue的子传夫,uniapp其实基本也是一样

特有:defineExpose暴露子组件属性

defineExpose这个玩意,可以直接暴露子组件里的所有变量、函数方法

第一步:在子组件创建defineExpose,把子组件的变量或者函数放进去

defineExpose( )里的对象里放的是自定义变量,对应外面、子组件里的变量或函数,相当于给子组件的又起一个变量名,这个变量名是其他组件在外面也可以用的变量名,当然如果和子组件自身的变量一样的话,就可以省略写成下面这样:

第二步:在父组件用【子组件.value】就可以获取到子组件的属性

下面这个例子是用ref绑定DOM元素,在vue里获取到子组件,然后在onMounted加载DOM元素时期再输出子组件里的变量、函数

四、插槽<slot></slot>

这玩意其实我觉得可有可无,如同鸡肋一般,食之无味弃之可惜。但是不少布局确实需要用到它

比如下面这个图,其实每一块盒子都可以是自定义的组件,那么多个相同组件之间,有时只需要在【相同的位置】有一点【不同的内容】,好比下面这里右上角那块一个是【日期】、一个是【More+】,还有标题那个位置也是文字内容不同、但都在左上角,这些东西就可以用到插槽

插槽也就是在固定位置定好了,然后在父组件页面里,根据自己的需要往这里塞不同的内容罢了(其实我觉得用view或者用更小的自定义组件也完全可以代替,开发插槽的人真是闲得没事干)

不具名插槽:

在子组件里写入一个<slot></slot>插槽

然后在父组件里用到子组件的时候,随便往子组件里写内容,这些内容会自动全部到子组件的<slot></slot>插槽的区域里

具名插槽:

那么加入一个组件里想要设置多个插槽怎么办?

直接写<slot>?

那么在父组件里往子组件里写东西的时候,这些内容会在子组件的所有<slot>插槽区域都出现

那么就需要用【具名插槽】,这样一来,在不同的具名插槽放不同内容就不会错了

但是在父组件里注意,不能直接些内容了

要用<template>搭配v-slot指令,就能绑定这块区域内容放到哪一个slot插槽了!

v-slot还可以简写——> #xxx

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

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

相关文章

(css)步骤条el-steps区分等待、进行中、完成三种状态的图片

(css)步骤条el-steps区分等待、进行中、完成三种状态的图片 效果&#xff1a; <el-steps :active"active" finish-status"success" class"steps"><el-step title"选择.."></el-step><el-step title"..规则&…

Docker容器化技术(docker-compose示例:部署discuz论坛和wordpress博客,使用adminer管理数据库)

安装docker-compose [rootservice ~]# systemctl stop firewalld [rootservice ~]# setenforce 0 [rootservice ~]# systemctl start docker[rootservice ~]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64创建目录 [rootse…

【Leetcode】1969. 数组元素的最小非零乘积

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个正整数 p 。你有一个下标从 1 1 1 开始的数组 n u m s nums nums &#xff0c;这个数组包含范围 [ 1 , 2 p − 1 ] [1, 2^p - 1] [1,2p−1] 内所有整数的二进制形式&…

Python通过Ctypes调用C++类,实测有效

文章目录 前言创建vs dll工程添加外部库编辑代码编译测试参考 前言 在软件开发中&#xff0c;有时候需要Python与C相结合&#xff0c;以充分发挥两者的优势 。Python作为一种高级编程语言&#xff0c;具有简洁易读的特点&#xff0c;适用于快速开发和原型设计。而C则是一种性能…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc&#xff08;HarmonyOS Device Connector&#xff09;是 HarmonyOS 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取&#xff0c;存放于 /Huawei/Sdk/openhar…

Vmware使用ubuntu报错空间不够

Vmware使用ubuntu报错空间不够 1.vmware修改2.进入镜像进行修改2.1需要下载GParted软件 1.vmware修改 这个需要把硬盘的大小进行扩展 2.进入镜像进行修改 2.1需要下载GParted软件

JAVA每日面经——JVM篇(包含JVM优化)

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、什么是JVM&#xff1f;二、JVM由…

综合知识篇13-软件开发模型考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html案例分析篇00-【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例…

小程序应用市场的前世今生

最开始的开始&#xff0c;为软件开发者提供软件发布、运营和推广服务的平台称之为软件应用市场&#xff0c;其发展经历了以下3个阶段&#xff1a; 起源阶段&#xff1a;应用市场的起源可以追溯到桌面互联网时代&#xff0c;当时软件的开发和分发主要依靠软件网站。软件开发者可…

【C语言】【牛客】BC136 KiKi判断上三角矩阵

文章目录 题目 BC136 KiKi判断上三角矩阵思路代码呈现 题目 BC136 KiKi判断上三角矩阵 链接: link 思路 这题很简单但是再牛客中属于中等题 我们通过读题发现 2<n<10 &#xff0c;所以我们首先创建一个变量 n 以及一个 10*10 个元素数组 然后题目是判断该矩阵是否是…

windows下常用的DOS命令

DOS&#xff08;Disk Operating System&#xff09;是 Windows 操作系统中的命令行接口&#xff0c;也可以叫命令行窗口。一提到这个&#xff0c;很多初入行计算机的朋友们就是很犯怵&#xff0c;不知所错&#xff0c;好高端&#xff0c;有没有。界面如下&#xff1a; 普通用户…

联想笔记本的声音键没有反应怎么办?

如果我的联想笔记本电脑上的声音按钮没有响应&#xff0c;该怎么办&#xff1f; 如果我的联想笔记本电脑上的声音按钮没有响应&#xff0c;该怎么办&#xff1f; 按下按钮后我无法控制声音。 我该怎么办&#xff1f; 以下是我为您整理的关于联想笔记本声音按键无反应的相关资料…

流畅的 Python 第二版(GPT 重译)(九)

第四部分&#xff1a;控制流 第十七章&#xff1a;迭代器、生成器和经典协程 当我在我的程序中看到模式时&#xff0c;我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象&#xff0c;至少对我来说&#xff0c;这表…

01分布式搜索引擎ES

分布式搜索引擎ES 1.初识elasticsearch1.1.了解ES1.2.倒排索引1.3.es的一些概念 2.索引库操作2.1.mapping映射属性2.2.索引库的CRUD 3.文档操作3.1.新增文档3.2.查询文档3.3.删除文档3.4.修改文档3.5.总结 4.RestAPI4.0.导入Demo工程4.1.创建索引库4.2.删除索引库4.3.判断索引库…

CodeWhisperer插件

一、前言 产品官网地址&#xff1a;What is CodeWhisperer? - CodeWhisperer Amazon CodeWhisperer 是一个通用的、由机器学习驱动的代码生成器&#xff0c;可实时为您提供代码建议。在您编写代码时&#xff0c;CodeWhisperer 会根据您现有的代码和注释自动生成建议。您的个…

Power BI学习(数据可视化)

另一个也可以的工具是&#xff1a;Tableau 还有一个是&#xff1a;神策&#xff0c;主要是用于互联网的app的数据埋点 数据分析的过程&#xff1a; 数据源--数据清洗&#xff08;power query&#xff09;-构建指标 新建度量值&#xff08;power pivot&#xff09;-可视化&…

SecureCRT:高效安全的远程连接工具

SecureCRT是一款功能强大的终端仿真工具&#xff0c;主要用于连接和运行包括Windows、UNIX和VMS在内的远程系统。它支持多种协议&#xff0c;如SSH1、SSH2、Telnet、SFTP、Rlogin、Serial、SCP等&#xff0c;确保用户与目标设备之间的通信安全&#xff0c;并防止网络攻击和窥探…

git如何在某个commitId的状态提交到一个分支

有些时候&#xff0c;我们在使用子仓库&#xff0c;或者其他情况&#xff0c;会有一个状态是当前的git仓库是在一个commitId上&#xff0c;而没有在一个分支上&#xff1a; 这时如果想要把基于这个commitId创建一个分支&#xff0c;可以使用下面这个命令&#xff1a; git push…

ReaLTaiizor开源.NET winform控件库学习使用

一、ReaLTaiizor项目介绍 1.1 介绍及地址 基于MIT license开源、免费、美观的.NET WinForm UI控件库&#xff1a;ReaLTaiizor ReaLTaiizor是一个开源免费的.NET WinForms控件库&#xff0c;它提供了广泛的组件和丰富的主题选项&#xff08;用户友好、注重设计&#xff09;&am…

ping 通ip,ping 不通域名

在linux 系统中&#xff0c;ping 通ip,ping 不通对应的域名时&#xff0c;可直接修改系统配置文件 vi /etc/hosts 加入 ip 域名