【前端之旅】uni-app学习笔记

简介: 【前端之旅】uni-app学习笔记

image.png

一、uni-app的介绍


uni-app 官方网页是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。

即使不跨端,uni-app同时也是更好的小程序开发框架,具有vue和微信小程序的开发经验,可快速上手uni-app


为什么要去学习uni-app?

相对开发者来说,减少了学习成本,因为只学会uni-app之后,即可开发出iOS、Android、H5、以及各种小程序的应用,不需要再去学习开发其他应用的框架,相对公司而言,也大大减少了开发成本。


1、环境搭建

安装前端开发工具 HbuilderX (App开发版) 下载地址


安装微信开发者工具 下载地址


2、利用HbuilderX初始化项目

点击HbuilderX菜单栏文件>项目>新建

选择uni-app,填写项目名称,项目创建的目录

这样既可创建自己的项目


3、运行项目


在菜单栏中点击运行,运行到浏览器,选择浏览器即可运行


在微信开发者工具里运行:进入uniapp项目,点击工具栏的运行 -> 运行到小程序模拟器 -> 微信开发者工具,即可在微信开发者工具里面体验uni-app


在微信开发者工具里运行:进入uniapp项目,点击工具栏的运行 -> 运行到手机或模拟器 -> 选择调式的手机


注意:


如果是第一次使用,需要先配置小程序ide的相关路径,才能运行成功

微信开发者工具在设置中安全设置,设置服务端口开启


二、uni-app 基本语法


1、介绍项目目录和文件作用

image.png


pages是所有的页面存放目录。


static静态资源目录,如图片等资源。


App.vue文件是项目的根组件,所有页面都是在App.vue下进行切换的,是页面入口文件,可以调用应用的生命周期函数。


main.js文件是项目的入口文件,主要作用是初始化vue实例并使用需要的插件。


manifest.json 文件是应用的配置文件,用于指定应用的名称、图标、权限等。


pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。


uni.scss文件的用途是为了方便整体控制应用的风格,比如按钮颜色、边框风格,uni.scss文件里预置了一批scss变量预置。


unpackage是打包目录,在这里有各个平台的打包文件。


components组件存放目录


为了实现多端兼容,综合考虑编译速度、运行性能等因素,uni-app 约定了如下开发规范:


页面文件遵循 Vue 单文件组件 (SFC) 规范

组件标签靠近小程序规范,详见uni-app 组件规范

接口能力(JS API)靠近微信小程序规范,但需将前缀 wx 替换为 uni,详见uni-app接口规范

数据绑定及事件处理同 Vue.js 规范,同时补充了App及页面的生命周期

为兼容多端运行,建议使用flex布局进行开发


2、全局配置和页面配置


1)通过pages.json中globalStyle进行全局配置

用于设置应用的状态栏、导航条、标题、窗口背景色等。详细文档

属性 类型 默认值 描述
navigationBarBackgroundColor HexColor #F7F7F7 导航栏背景颜色(同状态栏背景色)
navigationBarTextStyle String white 导航栏标题颜色及状态栏前景颜色,仅支持 black/white
navigationBarTitleText String 导航栏标题文字内容
backgroundColor HexColor #ffffff 窗口的背景色
backgroundTextStyle String dark 下拉 loading 的样式,仅支持 dark / light
enablePullDownRefresh Boolean false 是否开启下拉刷新,详见页面生命周期
onReachBottomDistance Number 50 页面上拉触底事件触发时距页面底部距离,单位只支持px,详见页面生命周期


2)创建新的message页面

右键pages新建message目录,在message目录下右键新建.vue文件,并选择基本模板


<template>
  <view>
    这是信息页面
  </view>
</template>
<script>
</script>
<style>
</style>

3)通过pages来配置页面

属性 类型 默认值 描述
path String 配置页面路径
style Object 配置页面窗口表现,配置项参考 pageStyle

pages数组数组中第一项表示应用启动页


"pages": [ 
    {
      "path":"pages/message/message"
    },
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "uni-app"
      }
    }
  ]

通过style修改页面的标题和导航栏背景色,并且设置h5下拉刷新的特有样式

"pages": [
    //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
    {
      "path":"pages/message/message",
      "style": {
        "navigationBarBackgroundColor": "#007AFF",
        "navigationBarTextStyle": "white",
        "enablePullDownRefresh": true,
        "disableScroll": true,
        "h5": {
          "pullToRefresh": {
            "color": "#007AFF"
          }
        }
      }
    }
  ]

4)配置底部导航栏 tabbar

如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页。


Tips


当设置 position 为 top 时,将不会显示 icon

tabBar 中的 list 是一个数组,只能配置最少2个、最多5个 tab,tab 按数组的顺序排序。

属性说明:

属性 类型 必填 默认值 描述 平台差异说明
color HexColor tab 上的文字默认颜色
selectedColor HexColor tab 上的文字选中时的颜色
backgroundColor HexColor tab 的背景色
borderStyle String black tabbar 上边框的颜色,仅支持 black/white App 2.3.4+ 支持其他颜色值
list Array tab 的列表,详见 list 属性说明,最少2个、最多5个 tab
position String bottom 可选值 bottom、top top 值仅微信小程序支持


其中 list 接收一个数组,数组中的每个项都是一个对象,其属性值如下:

属性 类型 必填 说明
pagePath String 页面路径,必须在 pages 中先定义
text String tab 上按钮文字,在 5+APP 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标


iconPath String 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 postion 为 top 时,此参数无效,不支持网络图片,不支持字体图标
selectedIconPath String 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 postion 为 top 时,此参数无效

案例代码:


"tabBar": {
    "list": [
      {
        "text": "首页",
        "pagePath":"pages/index/index",
        "iconPath":"static/tabs/home.png",
        "selectedIconPath":"static/tabs/home-active.png"
      },
      {
        "text": "信息",
        "pagePath":"pages/message/message",
        "iconPath":"static/tabs/message.png",
        "selectedIconPath":"static/tabs/message-active.png"
      },
      {
        "text": "我们",
        "pagePath":"pages/contact/contact",
        "iconPath":"static/tabs/contact.png",
        "selectedIconPath":"static/tabs/contact-active.png"
      }
    ]
  }

5)condition启动模式配置

启动模式配置,仅开发期间生效,用于模拟直达页面的场景,如:小程序转发后,用户点击所打开的页面。


属性说明:

属性 类型 是否必填 描述
current Number 当前激活的模式,list节点的索引值
list Array 启动模式列表

list说明:

属性 类型 是否必填 描述
name String 启动模式名称
path String 启动页面路径
query String 启动参数,可在页面的 onLoad 函数里获得


3、组件的基本使用


uni-app提供了丰富的基础组件给开发者,开发者可以像搭积木一样,组合各种组件拼接称自己的应用

uni-app中的组件,就像 HTML 中的 div 、p、span 等标签的作用一样,用于搭建页面的基础结构。

1) text文本组件的用法

text 组件的属性


属性 类型 默认值 必填 说明
selectable boolean false 文本是否可选
space string . 显示连续空格,可选参数:enspemspnbsp
decode boolean false 是否解码

text 组件相当于行内标签、在同一行显示

除了文本节点以外的其他节点都无法长按选中

代码案例

<view>
  <!-- 长按文本是否可选 -->
  <text selectable='true'>我嫩爹</text>
</view>
<view>
  <!-- 显示连续空格的方式 -->
  <view>
    <text space='ensp'>我嫩爹</text>
  </view>
  <view>
    <text space='emsp'>我嫩爹</text>
  </view>
  <view>
    <text space='nbsp'>我嫩爹</text>
  </view>
</view>
<view>
  <text>skyblue</text>
</view>
<view>
  <!-- 是否解码 -->
  <text decode='true'>&nbsp; &lt; &gt; &amp; &apos; &ensp; &emsp;</text>
</view>

2) view视图容器组件的用法

View 视图容器, 类似于 HTML 中的 div


View组件的属性

属性名 类型 默认值 说明
hover-class String none 指定按下去的样式类。当 hover-class=“none” 时,没有点击态效果
hover-stop-propagation Boolean false 指定是否阻止本节点的祖先节点出现点击态
hover-start-time Number 50 按住后多久出现点击态,单位毫秒
hover-stay-time Number 400 手指松开后点击态保留时间,单位毫秒

代码案例

<view class="box2" hover-class="box2_active">
  <view class='box1' hover-class='active' hover-stop-propagation,
        hover-start-time="2000",hover-stay-time='2000'>
  </view>
</view>

3) button按钮组件的用法

button组件的属性

属性名 类型 默认值 说明
size String default 按钮的大小
type String default 按钮的样式类型
plain Boolean false 按钮是否镂空,背景色透明
disabled Boolean false 是否按钮
loading Boolean false 名称是否带 loading 图标

button 组件默认独占一行,设置 size 为 mini 时可以在一行显示多个。

案例代码

<button size='mini' type='primary'>前端</button>
<button size='mini' type='default' disabled='true'>前端</button>
<button size='mini' type='warn' loading='true'>前端</button>

4)image组件的使用

image 图片

属性名 类型 默认值 说明 平台差异说明
src String 图片资源地址
mode String ‘scaleToFill’ 图片裁剪、缩放的模式


Tips


组件默认宽度 300px、高度 225px;

src 仅支持相对路径、绝对路径,支持 base64 码;

页面结构复杂,css样式太多的情况,使用 image 可能导致样式生效较慢,出现 “闪一下” 的情况,此时设置 image{will-change: transform} ,可优化此问题。


4、uni-app中的样式


rpx即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx 实际显示效果会等比放大。


使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,用;表示语句结束


支持基本常用的选择器class、id、element等


在 uni-app 中不能使用 * 选择器。


page 相当于 body 节点


定义在 App.vue 中的样式为全局样式,作用于每一个页面。在 pages 目录下的 vue 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 App.vue 中相同的选择器。


uni-app 支持使用字体图标,使用方式与普通 web 项目相同,需要注意以下几点:


字体文件小于 40kb,uni-app 会自动将其转化为 base64 格式;


字体文件大于等于 40kb, 需开发者自己转换,否则使用将不生效;


字体文件的引用路径推荐使用以 @ 开头的绝对路径。


 @font-face {
     font-family: test1-icon;
     src: url('~@/static/iconfont.ttf');
 }

如何使用scss或者less


5、 uni-app中的数据绑定


在页面中需要定义数据,和我们之前的vue一摸一样,直接在data中定义数据即可


export default {
  data () {
    return {
      msg: 'hello-uniapp'
    }
  }
}

插值表达式的使用

利用插值表达式渲染基本数据

{{msg}}


在插值表达式中使用三元运算

{{ flag ? '肯定值':'否定值' }}


基本运算

{{1+1}}


v-bind动态绑定属性

在data中定义了一张图片,我们希望把这张图片渲染到页面上


export default {
  data () {
    return {
      img: 'http://sunmiong.jpg'
    }
  }
}

利用v-bind进行渲染


还可以缩写成:


v-for的使用

data中定以一个数组,最终将数组渲染到页面上


data () {
  return {
    arr: [
      { name: 'sunming', age: 18 },
      { name: '孙不坚', age: 18 }
    ]
  }
}

利用v-for进行循环

名字:{{item.name}}---年龄:{{item.age}}


三、uni-app 高级语法

1、uniapp中的事件

事件绑定

在uni中事件绑定和vue中是一样的,通过v-on进行事件的绑定,也可以简写为@

点我啊


事件函数定义在methods中


methods: {
  tapHandle () {
    console.log('真的点我了')
  }
}

事件传参

默认如果没有传递参数,事件函数第一个形参为事件对象。


// template
<button @click="tapHandle">点我啊</button>
// script
methods: {
  tapHandle (e) {
    console.log(e)
  }
}

如果给事件函数传递参数了,则对应的事件函数形参接收的则是传递过来的数据。


// template
<button @click="tapHandle(1)">点我啊</button>
// script
methods: {
  tapHandle (num) {
    console.log(num)
  }
}

如果获取事件对象也想传递参数。


// template
<button @click="tapHandle(1,$event)">点我啊</button>
// script
methods: {
  tapHandle (num,e) {
    console.log(num,e)
  }
}

2、uniapp的生命周期


应用的生命周期

生命周期的概念:一个对象从创建、运行、销毁的整个过程被成为生命周期。


生命周期函数:在生命周期中每个阶段会伴随着每一个函数的触发,这些函数被称为生命周期函数


uni-app 支持如下应用生命周期函数:

函数名 说明
onLaunch uni-app 初始化完成时触发(全局只触发一次)
onShow uni-app 启动,或从后台进入前台显示
onHide uni-app 从前台进入后台
onError uni-app 报错时触发


页面的生命周期

uni-app 支持如下页面生命周期函数:

函数名 说明 平台差异说明 最低版本
onLoad 监听页面加载,其参数为上个页面传递的数据,参数类型为Object(用于页面传参),参考示例
onShow 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady 监听页面初次渲染完成。
onHide 监听页面隐藏
onUnload 监听页面卸载

3、下拉刷新


开启下拉刷新

在uni-app中有两种方式开启下拉刷新


需要在 pages.json 里,找到的当前页面的pages节点,并在 style 选项中开启 enablePullDownRefresh

通过调用uni.startPullDownRefresh方法来开启下拉刷新

通过配置文件开启

创建list页面进行演示

<template>
  <view>
    <view v-for="(item,index) in arr" :key="index">
      {{item}}
    </view>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        arr: ['sunming','孙铭','孙不坚1208']
      }
    }
  }
</script>
<style>
</style>

通过pages.json文件中找到当前页面的pages节点,并在 style 选项中开启 enablePullDownRefresh


{
  "path":"pages/list/list",
    "style":{
      "enablePullDownRefresh": true
    }
}

通过API开启

api文档

uni.startPullDownRefresh()


监听下拉刷新

通过onPullDownRefresh可以监听到下拉刷新的动作

export default {
  data () {
    return {
      arr: ['sunming','孙铭','孙不坚1208']
    }
  },
  methods: {
    startPull () {
      uni.startPullDownRefresh()
    }
  },
  onPullDownRefresh () {
    console.log('触发下拉刷新了')
  }
}

关闭下拉刷新

uni.stopPullDownRefresh()


停止当前页面下拉刷新。


案例演示


<template>
  <view>
    <button type="primary" @click="startPull">开启下拉刷新</button>
    <view v-for="(item,index) in arr" :key="index">
      {{item}}
    </view>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        arr: ['sunming','孙铭','孙不坚1208']
      }
    },
    methods: {
      startPull () {
        uni.startPullDownRefresh()
      }
    },    
    onPullDownRefresh () {
      this.arr = []
      setTimeout(()=> {
        this.arr = ['sunming','孙不坚1208','孙铭']
        uni.stopPullDownRefresh() //关闭上拉刷新
      }, 1000);
    }
  }
</script>

4、上拉加载

通过在pages.json 文件中找到当前页面的pages节点下style中配置onReachBottomDistance可以设置距离底部开启加载的距离,默认为50px。


通过onReachBottom监听到触底的行为

<template> 
  <view>
    <button type="primary" @click="startPull">开启下拉刷新</button>
    <view v-for="(item,index) in arr" :key="index">
      {{item}}
    </view>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        arr: ['sunming','孙不坚1208','孙铭']
      }
    },
    onReachBottom () {
      console.log('触底了')
    }
  }
</script>
<style>
  view{
    height: 100px;
    line-height: 100px;
  }
</style>

5、网络请求


在uni中可以调用uni.request方法进行请求网络请求


uni.request

在各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。


参数说明

参数名 类型 必填 默认值 说明 平台差异说明
url String 开发者服务器接口地址
data Object/String/ArrayBuffer 请求的参数 App(自定义组件编译模式)不支持ArrayBuffer类型
header Object 设置请求的 header,header 中不能设置 Referer。 App、H5端会自动带上cookie,且H5端不可手动修改
method String GET 有效值详见下方说明
timeout Number 60000 超时时间,单位 ms H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序

dataType String json 如果设为 json,会尝试对返回的数据做一次 JSON.parse
responseType String text 设置响应的数据类型。合法值:text、arraybuffer 支付宝小程序不支持
sslVerify Boolean true 验证 ssl 证书 仅App安卓端支持(HBuilderX 2.3.3+)
withCredentials Boolean false 跨域请求时是否携带凭证(cookies) 仅H5支持(HBuilderX 2.6.15+)
firstIpv4 Boolean false DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
success Function 收到开发者服务器成功返回的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)


method 有效值


必须大写,有效值在不同平台差异说明不同。

method App H5 微信小程序 支付宝小程序 百度小程序 字节跳动小程序
GET
POST
PUT x
DELETE x x
CONNECT x x x x
HEAD x x x
OPTIONS x x
TRACE x x x x

success 返回参数说明

参数 类型 说明
data Object/String/ArrayBuffer 开发者服务器返回的数据
statusCode Number 开发者服务器返回的 HTTP 状态码
header Object 开发者服务器返回的 HTTP Response Header
cookies Array.<string> 开发者服务器返回的 cookies,格式为字符串数组

data 数据说明


最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。转换规则如下:


对于 GET 方法,会将数据转换为 query string。例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18。

对于 POST 方法且 header['content-type'] 为 application/json 的数据,会进行 JSON 序列化。

对于 POST 方法且 header['content-type'] 为 application/x-www-form-urlencoded 的数据,会将数据转换为 query string。

示例


uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    data: {
        text: 'uni.request'
    },
    header: {
        'custom-header': 'hello' //自定义请求头信息
    },
    success: (res) => {
        console.log(res.data);
        this.text = 'request success';
    }
});

返回值


如果希望返回一个 requestTask 对象,需要至少传入 success / fail / complete 参数中的一个。例如:


var requestTask = uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    complete: ()=> {}
});
requestTask.abort();

如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象:Promise 封装


通过 requestTask,可中断请求任务。


requestTask 对象的方法列表

方法 参数 说明
abort 中断请求任务
offHeadersReceived 取消监听 HTTP Response Header 事件,仅微信小程序平台支持,文档详情
onHeadersReceived 监听 HTTP Response Header 事件。会比请求完成事件更早,仅微信小程序平台支持,文档详情

示例

const requestTask = uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    data: {
        name: 'name',
        age: 18
    },
    success: function(res) {
        console.log(res.data);
    }
});
// 中断请求任务
requestTask.abort();

Tips


请求的 header 中 content-type 默认为 application/json。

避免在 header 中使用中文,或者使用 encodeURIComponent 进行编码,否则在百度小程序报错。

网络请求的 超时时间 可以统一在 manifest.json 中配置 networkTimeout

H5 端本地调试需注意跨域问题,参考:调试跨域问题解决方案

注意由于百度小程序iOS客户端,请求失败时会进入fail回调,需要针对百度增加相应的处理以解决该问题。

注意小程序端不支持自动保持 cookie,服务器应避免验证 cookie。如果服务器无法修改,也可以使用一些模拟手段,比如这样的工具https://github.com/charleslo1/weapp-cookie 可以请求时带上 cookie 并将响应的 cookie 保存在本地。

H5端 cookie 受跨域限制(和平时开发网站时一样),旧版的 uni.request 未支持 withCredentials 配置,可以直接使用 xhr 对象或者其他类库。

根据 W3C 规范,H5 端无法获取 response header 中 Set-Cookie、Set-Cookie2 这2个字段,对于跨域请求,允许获取的 response header 字段只限于“simple response header”和“Access-Control-Expose-Headers”(详情

uni-app 插件市场有flyio、axios等三方封装的拦截器可用

低版本手机自身不支持 ipv6,如果服务器仅允许 ipv6,会导致老手机无法正常运行或访问速度非常慢

localhost、127.0.0.1等服务器地址,只能在电脑端运行,手机端连接时不能访问。请使用标准IP并保证手机能连接电脑网络

debug 模式,安卓端暂时无法获取响应头,url中含有非法字符(如未编码为%20的空格)时会请求失败

iOS App第一次安装启动后,会弹出是否允许联网的询问框,在用户点击同意前,调用联网API会失败。请注意判断这种情况。比如官方提供的新闻模板示例(HBuilderX新建项目可选择),会判断如果无法联网,则提供一个错误页,提示用户设置网络及下拉刷新重试。

良好体验的App,还会判断当前是否处于飞行模式(参考)、是wifi还是3G(参考

部分安卓设备,真机运行或debug模式下的网速,低于release模式很多。

使用一些比较小众的证书机构(如:CFCA OV OCA)签发的 ssl 证书在安卓设备请求会失败,因为这些机构的根证书不在系统内置根证书库,可以更换其他常见机构签发的证书(如:Let’s Encrypt),或者配置 sslVerify 为 false 关闭 ssl 证书验证(不推荐)。

单次网络请求数据量建议控制在50K以下(仅指json数据,不含图片),过多数据应分页获取,以提升应用体验。

发送get请求

<template>
  <view>
    <button @click="sendGet">发送请求</button>
  </view>
</template>
<script>
  export default {
    methods: {
      sendGet () {
        uni.request({
          url: 'http://localhost:1000/user/getAll',
          success(res) {
            console.log(res)
                        console.log('我成功发送了请求')
          }
        })
      }
    }
  }
</script>

发送post请求

<template>
  <view>
    <button @click="sendPost">发送请求</button>
  </view>
</template>
<script>
  export default {
    methods: {
      sendPost () {
        uni.request({
          url: 'http://localhost:1000/user/getAll',
                    data: {
                 text: 'uni.request'
            },
                    method: 'POST',
          success(res) {
            console.log(res.data)
                        console.log('我成功发送了Post请求')
          }
        })
      }
    }
  }
</script>

6、 数据缓存


uni.setStorage

官方文档


将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。


代码演示

<template>
  <view>
    <button type="primary" @click="setStor">存储数据</button>
  </view>
</template>
<script>
  export default {
    methods: {
      setStor () {
        uni.setStorage({
          key: 'id',
          data: 100,
          success () {
            console.log('存储成功')
          }
         })
      }
    }
  }
</script>
<style>
</style>

uni.setStorageSync

将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。


代码演示


<template>
  <view>
    <button type="primary" @click="setStor">存储数据</button>
  </view>
</template>
<script>
  export default {
    methods: {
      setStor () {
        uni.setStorageSync('id',100)
      }
    }
  }
</script>
<style>
</style>

uni.getStorage

从本地缓存中异步获取指定 key 对应的内容。


代码演示


<template>
  <view>
    <button type="primary" @click="getStorage">获取数据</button>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        id: ''
      }
    },
    methods: {
      getStorage () {
        uni.getStorage({
          key: 'id',
          success:  res=>{
            this.id = res.data
          }
        })
      }
    }
  }
</script>

uni.getStorageSync

从本地缓存中同步获取指定 key 对应的内容。


代码演示

<template>
  <view>
    <button type="primary" @click="getStorage">获取数据</button>
  </view>
</template>
<script>
  export default {
    methods: {
      getStorage () {
        const id = uni.getStorageSync('id')
        console.log(id)
      }
    }
  }
</script>

uni.removeStorage

从本地缓存中异步移除指定 key。


代码演示

<template>
  <view>
    <button type="primary" @click="removeStorage">删除数据</button>
  </view>
</template>
<script>
  export default {
    methods: {
      removeStorage () {
        uni.removeStorage({
          key: 'id',
          success: function () {
            console.log('删除成功')
          }
        })
      }
    }
  }
</script>

uni.removeStorageSync

从本地缓存中同步移除指定 key。


代码演示

<template>
  <view>
    <button type="primary" @click="removeStorage">删除数据</button>
  </view>
</template>
<script>
  export default {
    methods: {
      removeStorage () {
        uni.removeStorageSync('id')
      }
    }
  }
</script>

7、上传图片、预览图片


上传图片(uni.chooseImage)

uni.chooseImage方法从本地相册选择图片或使用相机拍照。


案例代码

<template>
  <view>
    <button @click="chooseImg" type="primary">上传图片</button>
    <view>
      <image v-for="item in imgArr" :src="item" :key="index"></image>
    </view>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        imgArr: []
      }
    },
    methods: {
      chooseImg () {
        uni.chooseImage({
          count: 9,
          success: res=>{
            this.imgArr = res.tempFilePaths
          }
        })
      }
    }
  }
</script>

预览图片(uni.previewImage)

结构


<view>
  <image v-for="item in imgArr" :src="item" @click="previewImg(item)" :key="item"></image>
</view>

预览图片的方法


previewImg (current) {
  uni.previewImage({
      current,
      urls: this.imgArr
  })
}

8、条件注释实现跨端兼容


条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。


**写法:**以 #ifdef 加平台标识 开头,以 #endif 结尾。


平台标识

平台 参考文档
APP-PLUS 5+App HTML5+ 规范
H5 H5
MP-WEIXIN 微信小程序 微信小程序
MP-ALIPAY 支付宝小程序 支付宝小程序
MP-BAIDU 百度小程序 百度小程序
MP-TOUTIAO 头条小程序 头条小程序
MP-QQ QQ小程序 (目前仅cli版支持)
MP 微信小程序/支付宝小程序/百度小程序/头条小程序/QQ小程序


组件的条件注释

代码演示

<!-- #ifdef H5 -->
<view>
  h5页面会显示
</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view>
  微信小程序会显示
</view>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view>
  app会显示
</view>
<!-- #endif -->

api的条件注释

代码演示

onLoad () {
  //#ifdef MP-WEIXIN
  console.log('这是微信小程序')
  //#endif
  //#ifdef H5
  console.log('这是h5页面')
  //#endif
}

样式的条件注释


代码演示


/* #ifdef H5 */
view{
  height: 100px;
  line-height: 100px;
  background: red;
}
/* #endif */
/* #ifdef MP-WEIXIN */
view{
  height: 100px;
  line-height: 100px;
  background: green;
}
/* #endif */

9、uniapp中的导航跳转


利用声明式导航(navigator)进行跳转

navigator详细文档:文档地址


跳转到普通页面

<navigator url="/pages/about/about" hover-class="navigator-hover">
  <button type="default">跳转到关于页面</button>
</navigator>


跳转到底部导航栏tabbar处页面


<navigator url="/pages/message/message" open-type="switchTab">
  <button type="default">跳转到message页面</button>
</navigator>

利用编程式导航进行跳转

编程式导航跳转文档


利用uni.navigateTo进行导航跳转

保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。


跳转到about页面


通过navigateTo方法进行跳转到普通页面


goAbout () {
  uni.navigateTo({
    url: '/pages/about/about',
  })
}

利用uni.switchTab进行导航跳转

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。


跳转到message页面


通过switchTab方法进行跳转


goMessage () {
  uni.switchTab({
    url: '/pages/message/message'
  })
}

利用uni.redirectTo进行导航跳转

关闭当前页面,跳转到应用内的某个页面。


<!-- template -->
<button type="primary" @click="goMessage">跳转到message页面</button>
<!-- js -->
goMessage () {
  uni.redirectTo({
      url: '/pages/message/messag'
  })
}

利用导航跳转传递参数

在导航进行跳转到下一个页面的同时,可以给下一个页面传递相应的参数,接收参数的页面可以通过onLoad生命周期进行接收


传递参数的页面


goAbout () {
  uni.navigateTo({
    url: '/pages/about/about?id=80',
  });
}

接收参数的页面


<script>
  export default {
    onLoad (options) {
      console.log(options)
    }
  }
</script>


四、uni-app 组件使用


1、组件的创建


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


创建test组件,在component中新建test.vue文件


<template>
  <view>
    这是一个自定义组件
  </view>
</template>
<script>
</script>
<style>
</style>

在其他组件中导入该组件并注册

import login from "@/components/test.vue"


注册组件

components: {test}


使用组件


组件的生命周期函数

详见Vue-API文档

函数 属性
beforeCreate 在实例初始化之后被调用。
created 在实例创建完成后被立即调用。
beforeMount 在挂载开始之前被调用。
mounted 挂载到实例上去之后调用。注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTick
beforeUpdate 数据更新时调用,发生在虚拟 DOM 打补丁之前。 仅H5平台支持
updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 仅H5平台支持
beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用。
destroyed Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

2、组件的通讯


父组件给子组件传值

通过props来接受外界传递到组件内部的值


<template>
  <view>
    这是一个自定义组件 {{msg}}
  </view>
</template>
<script>
  export default {
    props: ['msg']
  }
</script>
<style>
</style>

其他组件在使用test组件的时候传递值

<template>
  <view>
    <test :msg="msg"></test>
  </view>
</template>
<script>
  import test from "@/components/test/test.vue"
  export default {
    data () {
      return {
        msg: 'hello'
      }
    },
    components: {test}
  }
</script>

子组件给父组件传值

通过$emit触发事件进行传递参数


<template>
  <view>
    这是一个自定义组件 {{msg}}
    <button type="primary" @click="sendMsg">给父组件传值</button>
  </view>
</template>
<script>
  export default {
    data () {
      return {
        status: '打篮球'
      }
    },
    props: {
      msg: {
        type: String,
        value: ''
      }
    },
    methods: {
      sendMsg () {
        this.$emit('myEvent',this.status)
      }
    }
  }
</script>

父组件定义自定义事件并接收参数

<template>
  <view>
    <test :msg="msg" @myEvent="getMsg"></test>
  </view>
</template>
<script>
  import test from "@/components/test/test.vue"
  export default {
    data () {
      return {
        msg: 'hello'
      }
    },
    methods: {
      getMsg (res) {
        console.log(res)
      }
    },
    components: {test}
  }
</script>

相关文章
|
7月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
318 5
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
941 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
11月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
606 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
515 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
828 0
|
机器学习/深度学习 人工智能 自然语言处理
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
DeepSeek Artifacts是Hugging Face推出的免费AI编程工具,基于DeepSeek V3,支持快速生成React和Tailwind CSS代码,适合快速原型开发和前端组件构建。
2749 39
DeepSeek Artifacts:在线实时预览的前端 AI 编程工具,基于DeepSeek V3快速生成React App
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
908 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
509 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
458 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
650 26

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1036
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    443
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    346
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    330
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    443
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    619
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    906
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    233
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    740
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    409