携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云星级博主
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc
Uniapp代码实现
编写代码之前,先了解一下uniapp代码的结构
举几个常见的结构的作用:
- uniCloud 云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb
- components 符合vue组件规范的uni-app组件目录
- hybrid App端存放本地html文件的目录,详见
- pages 业务页面文件存放的目录
- ─static 存放应用引用的本地静态资源(如图片、视频等)的目录,注意: 静态资源只能存放于此。
- uni_modules 存放[uni_module].
- wxcomponents 存放小程序组件的目录,详见
- nativeplugins App原生插件 详见
- unpackage 非工程代码,一般存放运行或发行的编译结果
- main.js Vue初始化入口文件
- App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
- manifest.json 配置应用名称、appid、logo、版本等打包信息,详见
- pages.json 配置页面路由、导航条、选项卡等页面类信息,详见
- uni.scss 这里是uni-app内置的常用样式变量
基础代码的使用
包含了不同标签的用法
<template>
<!-- v-bind:组件属性要使用data 中定义的数据变量,或者组件属性要是使用表达式Eg:v-bind:data="1 + 2" ,使用v-bind指定,在使用的时候可以使用 :代替v-bind: 也是绑定的意思 -->
<!-- v-on:绑定事件,一般绑定的时候v-on可省略,直接使用@click,省略了v-on绑定触发的事件的处理方法 -->
<view v-bind:class="title" v-bind:data="true ? 'asd' : 'zxc'">
<!-- <view :class="title" v-bind:data="true ? 'asd' : 'zxc'"> -->
{{title}}
<button v-on:click="show">点我</button>
<!-- <button @click="show">点我</button> -->
<!-- v-model 是双向绑定的,就是下边输入框中的内容跟和title内容是绑定的,输入框中的数据改变会影响title的值,所有用到title值的地方也会发生变化,title中的值改变会影响输入框中的值 -->
<input v-model="title" />
<!--判断语句的使用 -->
<view v-if="index==1">aaa</view>
<view v-else-if="index==2">bbb</view>
<view v-else>ccc</view>
<!-- v-show 语句的使用 -->
<view v-show="flag">asd</view> <!-- 这个不管现实不显示都会占用一块地方,代码是在,而v-if不满足代码是不存在的 -->
<view>{{ flag ? '三元' : '四元' }}</view> <!-- 三元运算符的简单实用 -->
<!-- 空标签的使用,在源代码中block会自动移除 -->
<block v-if="flag">
sad
</block>
</view>
</template>
1.关于data 是为什么写成函数的形式,而不是map 的形式,因为函数每次页面的显示都会重新加载,而map是不会改变。
如下:
data:{
title: 'Hello'
},
data() {
return {
title: 'Hello'
}
}
上边是两种data 的使用方法,上边的哪一种是变量的形式而不是函数的形式,所以在页面重新加载的时候,data里边对应的值不会初始化
2.事件穿透解决方法
<template>
<view @click="show">
<!-- 下边这个按钮点击后会触发两次show函数,即show
函数会执行两次,一次是内部view 一次是外层view,这个叫做事件 穿透-->
<view @click="show">点击</view>
<!-- 解决方法:使用.stop 阻止事件穿透 -->
<view @click.stop="show">点击</view>
</view>
</template>
3.uni-app基础组件
-
滚动组件
<scroll-view class="scroll" :scroll-y="true" > <!-- scroll-y前边的双引号的作用是这样true就是一个变量而不是一个字符串了 --> <view v-for="(item,index) in pers" >{{item}}</view> </scroll-view> -
自定义组件
根目录下新建一个components文件夹,下边可以新建组件,一个组件即一个文件夹。因为有了easycom不用像是小程序中的需要注册引入之后才能使用,对于components文件夹下的内容相当于把三部合并为一步了。但是components文件夹下的需要文件夹和vue是同名的如下图的card关于自定义组件的使用:
父组件向子组件传递数据的时候是通过props
如下:自定义组件card
<template> <view :style="{background: color}"> hello </view> </template> <script> export default { name:"card", props:{ color:{ type:String, default:"white" } }, data() { return { }; } } </script>在pages/news/news.vue下进行调用
<template> <view> test <card color="red"></card> <!-- 通过传递不同的color值,达到不同的结果 --> <card color="blue"></card> </view> </template>子组件向父组件传递数据的时候,是通过触发事件函数,如下图
子组件向父组件传递数据可以通过自定义事件,父组件自定义事件,子组件触发父组件定义的事件,并传递数据。
插槽的占位使用
因为在使用自定义组件的时候,是通过<组件名></组件名> 但是如果需要<组件名>传输值</组件名> 加入这里有值想要插入到子组件指定的位置,可以在子组件中使用 指定位置
页面加载&跳转组件
onLoad() { uni.showToast({ title:"加载中...", icon:"loading", duration:2000 }) setTimeout(()=>{ uni.redirectTo(({ url: "/pages/index/index" }) },2000) }不同平台出现不同的内容
在view/template中的格式如下 格式: <!-- #ifdef APP --> 里边的APP可替换成H5等 <!-- #endif --> Eg: <!-- #ifdef APP --> <card @myclick="myclick" color="blue" >qweqweqwe</card> <!-- #endif --> 在js中 // #ifdef APP // #endif 在css中 /* #ifdef APP */ /* #endif */ -
uniapp 页面布局
一个vue只能有一个template 的页面
scss和scoped的使用
1. scss可以在使用类的class的时候用层级的css格式 2. scoped 可以隔离组件的样式,防止样式的污染 非H5端默认并未启用 scoped,如需要隔离组件样式可以在 style 标签增加 scoped 属性,H5端为了隔离页面间的样式默认启用了 scoped大小符号换算关系 2rpx = 1px
-
css的引入与使用
新建一个css的文件夹。
另外页面布局推荐使用flex,因为使用定位可能会对某个客户端不兼容。
生命周期
应用的生命周期
<script>
export default {
//引用初始化执行,全局只执行一次
onLaunch: function() {
//做一些登录的处理全局变量的相关处理
console.log('App Launch')
},
// 应用显示的时候执行,或者从后台进入前台
onShow: function() {
console.log('App Show')
},
//应用隐藏的时候执行,或者从前台进入后台
onHide: function() {
console.log('App Hide')
}
}
</script>
页面的生命周期
<script>
export default {
onLoad() {
console.log("页面加载完成的时候触发");
},
onReady() {
console.log('页面渲染完成的时候触发');
},
onShow() {
console.log("页面显示的时候触发");
},
onUnload() {
console.log("页面卸载的时候触发");
},
onHide() {
console.log("页面隐藏的时候出发");
}
}
</script>
组件的生命周期
在组件的vue中
<script>
export default {
beforeCreate() {
console.log("组件生命周期-实例初始化之后,数据观测和事件配置之前调用");
},
created() {
console.log("组件生命周期-实例初始化之后,数据观测和事件配置之后调用");
},
mounted() {
console.log("组件生命周期-实例挂载之后调用");
},
destroyed() {
console.log("组件生命周期-实例销毁后调用);
}
}
</script>
tabBar的使用
"tabBar": {
"color": "#7A7E83", 设置字体的颜色
"selectedColor": "#3cc51f", 设置选中之后的颜色
"borderStyle": "black", 设置边框的颜色
"backgroundColor": "#ffffff", 设置背景颜色
"list": [{ 这里边的数组每个就是对应一个组件和一个页面
"pagePath": "pages/index/index",
"iconPath": "static/image/logo.png",
"selectedIconPath": "static/image/logo.png",
"text": "首页"
}, {
"pagePath": "pages/news/news",
"iconPath": "static/image/logo.png",
"selectedIconPath": "static/image/logo.png",
"text": "我的"
}]
}