【uni-app从入门到实战】组件学习

创建组件

在 uni-app 中,可以通过创建一个后缀名为vue的文件,即创建一个组件成功,其他组件可以将该组件通过import的方式导入,在通过components进行注册即可。我们来试一下:

我们在项目中新建 components 目录,同时在其中创建 test.vue 文件,这样一个组件就创造好了

在这里插入图片描述


我们在 index.vue 中使用它:

<template>
	<view class="content">
		<test></test>
	</view>
</template>

<script>
	import test from "@/components/test.vue"
	export default {
		components:{
			test
		}
	}
</script>

在这里插入图片描述

组件生命周期

组件生命周期官方文档

<script>
	export default {
		name:"test",
		data() {
			return {
				num:3
			};
		},
		beforeCreate() {
			console.log("beforeCreate","在实例初始化之前被调用")
			console.log(this.num)
		},
		created() {
			console.log("created","实例创建完成")
			console.log(this.num)
		}
	}
</script>

打印结果:

beforeCreate 在实例初始化之前被调用
undefined
created 实例创建完成
3

可以看到在 beforeCreate时,数据其实还没有初始化,所以打印结果是 undefined
create时,实例创建完成,所以打印出了结果 3

我们接着看:

<template>
	<view id="myview">
		这是一个test组件
	</view>
</template>

<script>
	export default {
		......
		beforeMount() {
			console.log("beforeMount",document.getElementById('myview'))
		},
		mounted() {
			console.log("beforeMount",document.getElementById('myview'))
		}
	
	}
</script>

为了看效果,我们运行程序到浏览器,查看打印结果:

在这里插入图片描述


可以看到beforeMount时,组件还没有渲染到页面上
mounted时,组件就渲染到页面上了,所以在这个方法里操作 dom

beforeUpdateupdated仅H5平台支持,也就是在数据更新前后调用,这里不做演示

我们来演示 beforeDestroydestroyed,首先修改 index.vue,使用一个变量来隐藏或显示 test 组件,然后增加一个按钮来改变这个变量的值

	<view class="content">
		<test v-if="flag"></test>
		<button @click="changeFlag">点我切换组件显示</button>
	</view>
</template>

<script>
	import test from "@/components/test.vue"
	export default {
		components:{
			test
		},
		data(){
			return{
				flag:true
			}
		},
		methods:{
			changeFlag(){
				this.flag = !this.flag
			}
		}
	}
</script>

<style>
</style>

然后在 test.vue 中打印这两个生命周期变化

		beforeDestroy() {
			console.log("beforeDestroy","组件销毁前")
		},
		destroyed() {
			console.log("destroyed","组件销毁了")
		}

来看下运行结果:

在这里插入图片描述


总结:
create可以在其中初始化一些数据
mounted可以在其中操作dom
destoryed可以来销毁定时器,可以这样写:

<script>
	export default {
		name:"test",
		data() {
			return {
				initId:null
			};
		},
		created() {
			this.initId = setInterval(()=>{
				console.log("执行定时器")
			},1000)
		},
		destroyed() {
			clearInterval(this.initId)
		}
	}
</script>

组件之间的通讯方式

单项数据流

父给子组件传值

我们继续在上边的 index.vue 中写,我们把一个值为 “Hello” 的变量 title 传给 test 组件。使用 :title=‘title’传递给 test 组件。其中第一个 :title 相当于 key,在 test 组件中接收时,就用相同的 key 接收,当然可以起别的名字,相应的 test 组件用对应的名字接收即可。这里为了规范,我们就使用 title。后边引号内的 title 是要传递的值

<template>
	<view class="content">
		<test :title="title"></test>
	</view>
</template>

<script>
	import test from "@/components/test.vue"
	export default {
		components:{
			test
		},
		data(){
			return{
				title:'Hello'
			}
		}
	}
</script>

在 test 组件内使用 props 接收

<template>
	<view>
		这是一个test组件{{title}}
	</view>
</template>

<script>
	export default {
		name:"test",
		props:["title"]
	}
</script>

运行程序:

在这里插入图片描述

子给父组件传值

在 test.vue 中增加一个按钮,并添加点击事件,点击后使用this.$emit给父组件传值,第一个参数是自定义事件,这个需要在父组件增加对应方法。第二个参数就是要传过去的值

<template>
	<view>
		......
		<button @click="sendNum">给父组件传值</button>
	</view>
</template>

<script>
	export default {
		name:"test",
		data(){
			return{
				num:3
			}
		},
		methods:{
			sendNum(){
				this.$emit("myEvent",this.num)
			}
		},
		......
	}
</script>

在父组件 index.vue 中,使用子组件的地方注册子组件中的自定义事件@myEvent="getNum",当子组件触发 myEvent 方法时,会调用父组件的 getNum 方法,在这个方法中,我们接收传过来的参数即可拿到子组件传的数据:

<template>
	<view class="content">
		<test :title="title" @myEvent="getNum"></test>
		这是子组件传过来的num:{{num}}
	</view>
</template>

<script>
	import test from "@/components/test.vue"
	export default {
		components:{
			test
		},
		data(){
			return{
				......
				num:0
			}
		},
		methods:{
			getNum(num){
				this.num = num
			}
		}
	}
</script>

在这里插入图片描述

兄弟组件传值

页面通讯

思路是由 uni.$on来注册一个全局的自定义事件,然后由 uni.$emit 触发。我们新建 a.vue 和 b.vue,并在 index.vue 中使用

修改 index.vue

<template>
	<view class="content">
		<test-a></test-a>
		<test-b></test-b>
	</view>
</template>

<script>
	import testA from "@/components/a.vue"
	import testB from "@/components/b.vue"
	export default {
		components:{
			"test-a":testA,
			"test-b":testB
		}
	}
</script>

我们希望通过 a 、b 组件间通讯,通过 a 修改 b 中的 num 值。所以我们在 b 组件中注册一个事件,当有人触发事件时,修改 b 中 num 的值,传的参数是多少 num 就 += 多少

<template>
	<view>
		这是b组件:{{num}}
	</view>
</template>

<script>
	export default {
		name:"b",
		data() {
			return {
				num:0
			};
		},
		created() {
			uni.$on('updateNum',num=>{
				this.num+= num
			})
		}
	}
</script>

a.vue 中我们给 button 增加点击事件,通过uni.$emit调用在 b 组件中定义的方法 updateNum,并传入参数 10,所以每次点击按钮 b 中的 num 就增加 10

在这里插入图片描述

uni-ui组件库的介绍和使用

日历组件使用

扩展组件 uni-ui

uni-ui是DCloud提供的一个跨端ui库,它是基于vue组件的、flex布局的、无dom的跨全端ui框架

uni-ui不包括基础组件,它是基础组件的补充

我们来演示下使用日历组件点击下载&安装跳转 uni-calendar 日历页面,点击使用 HBuilderX 导入插件按钮

在这里插入图片描述


如果刚才的页面登录了账号的话,会打开 HBuilder 的这个页面,选择我们的项目导入日历插件(如果没有打开这个页面,请看下一小节的错误解决)

在这里插入图片描述


这样根目录下会增加 uni-calendar 目录和文件

在这里插入图片描述


我们在 index.vue 中使用下,直接放入以下代码即可:

<uni-calendar 
    :insert="true"
    :lunar="true" 
    :start-date="'2019-3-2'"
    :end-date="'2019-5-20'"
    @change="change"
     />

运行:

在这里插入图片描述

uni_modules处理外部应用请求未能完成

如果上一小节安装日历插件,HBuilder 有如下提示:

在这里插入图片描述


在这里插入图片描述


可以尝试打开工具——插件安装,找到 uni_modules 进行卸载

在这里插入图片描述


然后在安装新插件选项卡中,找到 uni_modules 重新安装即可

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340