大马小马 發表於 2022-8-1 08:52:00

黑马-uni-app

<p>####uni-app的基本使用</p>
<p>参考视屏:03-项目目录和开发规范简单介绍_哔哩哔哩_bilibili</p>
<p>笔记:2022.08.01~2022.08.10</p>
<p>1.~~~Uni-App从入门到实战-黑马程序员杭州校区出品<br>视屏地址 :https://www.bilibili.com/video/BV1BJ411W7pX?p=1&amp;vd_source=d0acf1b50d58a251fbd395d941b1268c<br>2.~~~配置环境;<br>hbuilderx和微型小程序开发<br>2.1 <br>熟悉开发操作;<br>在hbuilder中出创建一个uni-app项目;<br>3.~~~基础介绍;<br>3.1 介绍项目目录和文件作用;<br>`pages.json` 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等</p>
<p>`manifest.json` 文件是应用的配置文件,用于指定应用的名称、图标、权限等。</p>
<p>`App.vue`是我们的跟组件,所有页面都是在`App.vue`下进行切换的,是页面入口文件,可以调用应用的生命周期函数。</p>
<p>`main.js`是我们的项目入口文件,主要作用是初始化`vue`实例并使用需要的插件。</p>
<p>`uni.scss`文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格,`uni.scss`文件里预置了一批scss变量预置。</p>
<p>```unpackage``` 就是打包目录,在这里有各个平台的打包文件</p>
<p>```pages``` 所有的页面存放目录</p>
<p>```static``` 静态资源目录,例如图片等</p>
<p>```components``` 组件存放目录<br>3.2 设置pages.json中的globalStyle属性(全局配置样式);<br>eg:<br>"globalStyle": {<br>                "navigationBarTextStyle": "black",//导航栏标题颜色及状态栏前景颜色,仅支持 black/white<br>                "navigationBarTitleText": "uni-app",//导航栏标题文字内容 <br>                "navigationBarBackgroundColor": "#55ff00",//导航栏背景颜色(同状态栏背景色) <br>                "backgroundColor": "#ffaaff",//窗口的背景色   <br>                "enablePullDownRefresh": true,//是否开启下拉刷新,详<br>                "backgroundTextStyle": "light"//下拉 loading 的样式,仅支持 dark / light    <br>        },<br>3.3 创建一个新的页面;<br>3.3.1 在pages文件夹中创建一个新的文件夹(名为message),还得在该新文件夹中创建一个vue文件;<br>3.3.2 然后得在pages.json中的pages数组中写一个对象,配置其的path(路径)和style(样式);<br>3.3.3 放在最前面的对象,就会被当作是首页展示; <br>3.4 tabbar;<br>就是小程序下面的tab栏;<br>3.4.1 tabbar有一个list属性,在里面可以配置一个个对象为tab选项,在对象里面得配置text,pagePath,iconPath,selectedIconPath等属性;<br>3.4.2 <br>eg: "tabBar": {<br>                "list": [<br>        {"text": "首页",<br>        "pagePath": "pages/index/index",<br>        "iconPath": "static/tabs/home.png",<br>        "selectedIconPath": "static/tabs/home-active.png"}//可以多个<br>]<br>}<br>3.4.3 tabBar的一级属性还有:<br>"color": "#a0033a",//默认颜色<br>"selectedColor": "#B3EE3A",        //被选中颜色;<br>"backgroundColor": "#e6ded9",//背景色;<br>"borderStyle": "black",//边框色;<br> "position": "top",//tab位置,只适合用在微信小程序上<br>3.5 condition;<br>是整个pages.json文件的二级属性,因为是json,所以最外层整体是一个对象;<br>启动模式配置;<br>仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。 (eg:广告)<br>3.5.1 配置:<br>eg:"condition": {<br>"current": 0,<br>"list": [<br>{"<br>name": "详情页",<br>"path": "pages/detail/detail",<br>"query": "id = 80"}<br>        ]<br>}<br>4.~~~uni-app组件的基本使用;<br>4.1 text组件;<br>4.1.1 有selectable,space属性;<br>selectable 表示是否可以选中;<br>space 表示的是如何编译空格;(ensp(两个空格算一个字符),emsp(一个空格一个字符),nbsp(一处空格一个字符));<br>4.1.2 <br>eg:&lt;text selectable space="emsp"&gt;唱歌 <br>跳舞打篮球&lt;/text&gt; <br>4.1.3 写于view中的东西自成一个块元素;<br>4.2 view组件;<br>类似html中的div使用;<br>4.2.1 hover-class//按下跳转样式事件;<br>4.2.2 hover-stop-propagation//停掉当前对象事件冒泡到别处;<br>4.2.3 :hover-start-time="2000" //延时事件执行;<br>4.2.4 :hover-stay-time='2000' //延时事件保留时长;<br>4.2.5 <br>eg: &lt;view class="box2" hover-class="box2_active"&gt;<br>&lt;view class='box1' hover-class='active' hover-stop-propagation :hover-start-time="2000" :hover-stay-time='2000'&gt;</p>
<p>&lt;/view&gt;<br>&lt;/view&gt;<br>4.3 button组件;<br>4.3.1 行内属性:<br>size(按钮的大小),<br>type(按钮的样式类型),<br>plain(按钮是否镂空,背景色透明 ),<br>disabled(是否为可用按钮),<br>loading(名称是否带 loading t图标);<br>eg:<br>&lt;button size='mini' type='primary'&gt;前端&lt;/button&gt;<br>&lt;button size='mini' type='default' disabled='true'&gt;前端&lt;/button&gt;<br>&lt;button size='mini' type='warn' loading='true'&gt;前端&lt;/button&gt;<br>4.4 媒体组件:image;<br>4.4.1 行内属性:src(图片资源地址 ),mode(图片裁剪、缩放的模式)<br>&lt;image&gt;` 组件默认宽度 300px、高度 225px;<br>4.4.2 <br>eg:<br>&lt;image src="http://destiny001.gitee.io/image/cxk.gif" mode="aspectFit"&gt;&lt;/image&gt; <br>//aspectFit是保留长边,也就是图片完全显示;<br>aspectFill为显示原有整体比例,会被截取;<br>4.5 uni-app中的样式;<br>4.5.1 rpx的使用(响应式单位);<br>一种根据屏幕宽度自适应的动态单位;<br>eg:.box1{<br>                width: 375rpx;<br>                height: 375rpx;<br>                background: #0000ff;<br>                font-size: 30rpx;<br>                color: #fff;<br>        }<br>4.5.2 @import的使用;<br>先创建一个css文件,再在vue文件中的style中引入;<br>eg:@import url(a.css);<br>4.5.3 uni-app的一些默认点;<br>网页中的page就相当于html的body;<br>支持基本常用的选择器class、id、element等 ;<br>全局,局部样式:定义在 App.vue 中的样式为全局样式,作用于每一个页面。在 pages 目录下 的 vue 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 App.vue 中相同的选择器;<br>4.5.4 导入图标;<br>4.5.4.1字体文件的引用路径推荐使用以 ~@ 开头的绝对路径。<br>必须将iconfont.css中的引用路径都改成以~@开头的绝对路径;<br>然后再在App.vue中引入@import url("./static/fonts/iconfont.css"); <br>然后再在作用域中使用eg:&lt;view class="iconfont icon-tupian"&gt;&lt;/view&gt; <br>4.5.6 结合scss,less的使用;<br>5.~~~ uni-app数据绑定;<br>在页面中需要定义数据,和我们之前的vue一摸一样,直接在data中定义数据即可;<br>用法就是跟vue语法相同;<br>5.1 插值表达式;<br>eg:<br>export default {<br>data () {<br>    return {<br>      msg: 'hello-uni'<br>    }<br>}<br>}<br>使用:&lt;view&gt;{{msg}}&lt;/view&gt;<br>5.2 v-bind语法;<br>eg:先在data中定义img为一张图片的路径;<br>&lt;image v-bind:src="img"&gt;&lt;/image&gt;<br>或者:&lt;image :src="img"&gt;&lt;/image&gt;<br>5.3 v-for语法;<br>标识符:key;<br>v-for="(item,index) in arr"<br>5.4 事件;<br>跟vue一样的写法;<br>5.4.1 有传参时候;<br>则当前的事件对象的在传参中写出;<br>eg:&lt;button @click="tapHandle(1,$event)"&gt;点我啊&lt;/button&gt;<br>tapHandle (num,e) {<br>      console.log(num,e)<br>    }<br>5.4.2 无传参时候;<br>默认就自带一个参数,就是事件对象;<br>eg:<br> &lt;button @click="tapHandle"&gt;点我啊&lt;/button&gt;<br> tapHandle (e) {<br>      console.log(e)<br>    }<br>6.~~~ uni的生命周期;<br>生命周期的概念:一个对象从创建、运行、销毁的整个过程被成为生命周期。<br>6.1 应用的生命周期函数;<br>//因为是应用的,即全局的,所以写于App.vue文件中;(四个)<br>onLaunch: function() {//初始化完成时触发(全局只触发一次)<br>                        console.log('App Launch')<br>                },<br>                onShow: function() {//启动,或从后台进入前台显示<br>                        console.log('App Show')<br>                },<br>                onHide: function() {//从前台进入后台   <br>                        console.log('App Hide')<br>                },<br>                onError:function(err){//报错时触发      <br>                        console.log("出错了",err)<br>                }<br>6.2 页面的生命周期函数;<br>//常用的共有5个,可写于每个vue文件当中;<br>onLoad(options) {<br>//监听页面加载,其参数为上个页面传递的数据,参数类型为Object(用于页面传参)<br>                console.log("页面加载了;",options)<br>                },<br>onShow() {<br>//监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面<br>                console.log("页面显示了") <br>        }, <br>onReady(){ <br>//监听页面初次渲染完成<br>                console.log('页面初次渲染完成')<br>        }, <br>onHide(){ <br>//监听页面隐藏<br>                console.log('页面隐藏了') <br>        }, <br>onUnload(){};//暂时不用;用于监听页面卸载;<br>6.2.1 监听下拉刷新页面生命周期函数;<br>onPullDownRefresh(){};<br>6.2.2 关闭下拉刷新动画;<br>uni.stopPullDownRefresh()<br>6.2.3 调用下拉刷新功能;<br>uni.startPullDownRefresh();<br>6.2.4 监听上拉拉刷新页面生命周期函数;<br>onReachBottom(){console.log('触底了')};<br>//通过在pages.json文件中找到当前页面的pages节点下style中配置onReachBottomDistance可以设置距离底部开启加载的距离,默认为50px<br>7.~~~#### 网络请求;<br>对于服务器的配置还不是很熟悉;<br>7.1 **发送get请求**<br>uni.request({});<br>主要配置到的两个属性;<br>url: 'http://localhost:8082/api/getlunbo',//这个得先在本地开启服务器;<br>success(res){console.log(res)}//成功回调函数;<br>8.~~~ 数据缓存<br>**发送post请求**<br>将数据临时存储到本地,而不是数据库中;<br>将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。<br>8.1 set,get,remove;<br>8.1.1 <br>uni.setStorage({});//将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。<br>eg:<br>uni.setStorage({<br>key: 'id',<br>data: 100,<br>success () {<br>console.log('存储成功')<br>}<br>})<br>8.1.2 uni.setStorageSync({});//将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。<br>eg:uni.setStorageSync('id',100)<br>8.1.3 <br>uni.getStorage({});//从本地缓存中异步获取指定 key 对应的内容。<br>eg:<br>uni.getStorage({<br>key: 'id',<br>success:res=&gt;{<br>console.log('获取成功',res,res.data)<br>this.id = res.data<br>}<br>})<br>8.1.4 uni.getStorageSync({});//从本地缓存中同步获取指定 key 对应的内容。<br>eg:<br>getStorage () {<br>const id = uni.getStorageSync('id')<br>console.log(id)<br>}<br>8.1.5 <br>uni.removeStorage({});//从本地缓存中异步移除指定 key。<br>eg:<br>uni.removeStorage({<br>key: 'id',                                        success: function () {<br>console.log('删除成功')<br>}<br>})<br>8.1.6 uni.removeStorageSync({});<br>//从本地缓存中同步移除指定 key。<br>eg:<br>removeStorage () {                        uni.removeStorageSync('id')<br>}<br>9.~~~ 上传图片,且预览;<br>9.1 选择图片:<br>uni.chooseImage({});<br>eg:<br>uni.chooseImage({<br>count:5,//限制上传数目<br>success:(res)=&gt;{//成功回调函数;<br>console.log(res)<br>this.imgArr = res.tempFilePaths//将图片链接数组带回本地数据;<br>}<br>})<br>9.2 预览图片:<br>uni.previewImage({})<br>eg:<br>previewImg(current){<br>uni.previewImage({<br>urls: this.imgArr,//图片链接数组;<br>current//指定预览图片链接;<br>})<br>}<br>10.~~~ 条件注释实现跨端兼容;<br>条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。<br>即各色各样的平台,各色各样的画面;<br>10.1 <br>**写法:**以 #ifdef 加平台标识 开头,以 #endif 结尾。<br>10.1.1 eg:网页元素:<br>&lt;!-- #ifdef H5 --&gt;<br>&lt;view&gt;<br>h5页面会显示<br>&lt;/view&gt;<br>&lt;!-- #endif --&gt;<br>&lt;!-- #ifdef MP-WEIXIN --&gt;<br>&lt;view&gt;<br>微信小程序会显示<br>&lt;/view&gt;<br>&lt;!-- #endif --&gt;<br>10.1.2 eg:api、js代码中元素:<br>onLoad () {<br>//#ifdef MP-WEIXIN<br>console.log('微信小程序')<br>//#endif<br>//#ifdef H5<br>console.log('h5页面')<br>//#endif<br>}<br>10.1.3 eg:样式的条件注释<br>```css```<br>/* #ifdef H5 */<br>view{<br>height: 100px;<br>line-height: 100px;<br>background: red;<br>}<br>/* #endif */<br>/* #ifdef MP-WEIXIN */<br>view{<br>height: 100px;<br>line-height: 100px;<br>background: green;<br>}<br>/* #endif */<br>11.~~~ uni中的导航跳转;<br>11.1 声明式导航;<br>写法:<br>navigator标签,且里面要写好url属性和值,然后如果要跳转到tab页面的话,还得加个open-type="switchTab";<br>//open-type还有其他属性值de 用法;<br>11.2 编程式导航:<br>调用api方法;<br>写法:<br>直接跳转<br>uni.navigateTo({<br>url:"/pages/detail/detail"<br>})<br>销毁其他非tab页面;<br>uni.switchTab({//跳转到tab页得这样写;<br>url: '/pages/message/message'<br>})<br>11.3 传参;<br>11.3.1 调用onLoad(){}//加载完成生命周期函数;<br>在定义跳转方向中的vue文件中定义:goAbout () {<br>uni.navigateTo({<br>    url: '/pages/about/about?id=80',<br>});<br>}<br>在被跳转到的vue文件中写onLoad生命周期函数:<br>eg:onLoad (options) {<br>console.log(options)<br>}//输出传过来的参数对象;<br>12.~~~ uni-app中组件的创建;<br>12.1 创建和使用,还有生命周期函数这些,都和vue里的组件使用差不多;<br>13.~~~ 组件通讯;<br>13.1 父传子;<br>直接在组件标签中定义动态绑定属性,然后再在组件中的props配置项中接收,然后以接收的名字来使用;<br>eg:<br>&lt;test :msg="msg"&gt;&lt;/test&gt;<br>-----------------------------------<br>&lt;script&gt;<br>        export default {<br>                props: ['msg']<br>        }<br>&lt;/script&gt;<br>-------------------------------<br>&lt;view&gt;<br>        这是一个自定义组件 {{msg}}<br>&lt;/view&gt;<br>13.2 子传父;<br>用到自定义事件,$emit;<br>现在子组件设置方法触发this.$emit方法,来回调父组件中的自定义事件,且传值;然后在自定义事件所触发的方法里面操作子传父数据;<br>eg:<br>子:这是一个自定义组件&lt;button type="primary" @click="sendMsg"&gt;给父组件传值&lt;/button&gt;<br>方法:<br>sendMsg () {<br>this.$emit('myEvent',this.status)<br>}<br>父:<br>&lt;view&gt;<br>&lt;test :msg="msg" @myEvent="getMsg"&gt;&lt;/test&gt;<br>&lt;/view&gt;<br>methods: {<br>getMsg (res) {<br>console.log(res)<br>        }<br>},<br>13.3 兄弟组件之间传值;<br>13.3.1在被修改数据的组件中先定义好一个自定义事件;<br>eg:<br>created(){//写于生命周期当中;<br>uni.$on("updateNum",num =&gt;{this.num+=num})<br>}<br>13.3.2 在触发组件当中来触发此事件:<br>addNum(){<br>uni.$emit("updateNum",10);//且传参数;<br>}<br>就类似vue的全局总线用法;<br>14.~~~ uni-ui 的 使用;<br>14.1 先去插件库中下载到hbuildx里面,然后再结合操作文档来写;<br>15.~~~ 项目实战,即实操;<br>15.1 获取轮播图的数据;<br>15.2 对uni.request进行二次封装,就像封装axios一样;用到了promise,async,await; 具体看代码;<br>eg:<br>const BASE_URL = 'http://localhost:8082'<br>export const myRequest = (options) =&gt; {<br>        return new Promise((resolve, reject) =&gt; {<br>                uni.request({<br>                        url: BASE_URL + options.url,<br>                        method: options.method || 'GET',<br>                        data: options.data || {},<br>                        success: (res) =&gt; {<br>                                if (res.data.status !== 0) {<br>                                        return uni.showToast({<br>                                                title: '获取数据失败'<br>                                        })<br>                                }<br>                                resolve(res)<br>                        },<br>                        fail: (err) =&gt; {<br>                                uni.showToast({<br>                                        title: '请求接口失败'<br>                                })<br>                                reject(err)<br>                        }<br>                })<br>        })<br>}<br>15.3 uni轮播图的制作;<br>15.3.1 用到了swiper标签,及其属性;<br>15.4 导航栏的基本制作;<br>15.4.1 用到了小图标<br>~@/static/font//修改iconfont.css里面的路径;<br>15.5 完成商品推荐列表和导航栏;<br>15.6下拉刷新,上拉加载更多;<br>15.7 地图标签的使用;<br>15.8 scroll-view标签,可滚动的区域;<br>15.9 vue中过滤器配置项的使用,即格式化时间格式;<br>filters:{<br>                        formatDate(date){<br>                                const nDate = new Date(date)<br>                                const year = nDate.getFullYear()<br>                                const month = nDate.getMonth().toString().padStart(2,0)<br>                                const day = nDate.getDay().toString().padStart(2,0)<br>                                return year +"-"+ month +"-"+ day<br>                        }<br>                }<br>15.10 $emit.$on的使用;<br>15.11onLoad(options){}//options就是从另一个页面过来的形参;<br>15.12 rich-text富文本标签的使用;//能够解析里面HTML结构的代码;<br>15.13 uni-goods-nav组件的使用;<br>15.14 <br>16.~~~ 进行打包处理:<br>16.1 小程序打包;<br>静态资源换成线上资源<br>16.2 进行上传给微信团队审核<br>16.3 h5打包;<br>16.4 安卓打包;<br>17.~~~</p><br><br>
来源:https://www.cnblogs.com/ycheibi/p/16538922.html
頁: [1]
查看完整版本: 黑马-uni-app