前端uniapp知识点总结

1、谈谈你对uni-app的理解

  1. uni-app是一个使用Vue.js开发所有前端应用的框架,真正做到一套代码多端发行。开发者编写一套代码,可以发布到IOS、Android、Web(响应式)、以及各种小程序、快应用等多个平台。
  2. Uniapp中,使用Vue.js的语法开发,配合小程序的组件和API,兼容 Weex微信小程序原生渲染。
  3. 页面文件遵循vue单文件组件,组件标签靠近小程序规范(view 视图容器,icon 图标,text 文本组件),接口能力(JS API)靠近小程序规范,但需将前缀 wxmy 等替换为 uni
  4. 数据绑定及事件处理同 Vue.js 规范,同时补充了应用生命周期及页面的生命周期
  5. Uniapp工程中可用的构建模式有:开发模式、生产模式、H5模式、跨平台模式等。

2、uni中如何为不同的平台设置不同的代码(需补充)

通过条件注释来为不同平台设置不同的代码:实现跨端兼容。条件注释是以 #ifdef 或 #ifndef 加平台代值开头,以 #endif 结尾

uni-app分编译器运行时(runtime),编译器将开发者的代码进行编译,编译的输出物由各个终端的runtime进行解析,每个平台(Web、Android App、iOS App、各家小程序)都有各自的runtime。

编译器分vue2版和vue3版,vue2版:基于webpack实现,vue3版:基于Vite实现,性能更快。

  • 在web平台,将.vue文件编译为js代码。与普通的vue cli项目类似
  • 在微信小程序平台,编译器将.vue文件拆分生成wxml、wxss、js等代码
  • 在app平台,将.vue文件编译为js代码。进一步,如果涉及uts代码

3、创建项目

创建以 typescript 开发的工程,使用Vue3/Vite版

npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project

 

 1.vue.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 webpack 等编译选项, 

2.vite.config.js 是一个可选的配置文件,如果项目的根目录中存在这个文件,那么它会被自动加载,一般用于配置 vite 的编译选项 

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

{
"appid": "__UNI__XXXXXX,创建应用时云端分配的,不要修改。",
    "name": "应用名称,如uni-app",
    "description": "应用描述",
    "versionName": "1.0.0",
"app-plus": {
  "optimization": {
    "subPackages": true
  },
  "runmode" : "liberate" // 开启分包优化后,必须配置资源释放模式
}
}

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

4、 pages.json 文件中加载配置subPackages分包

4.1、分包与限制

subPackages分包加载配置,此配置为小程序的分包加载机制。微信小程序每个分包的大小是2M,总体积一共不能超过20M。

4.2、分包注意点

分包有这么几个注意点:

  1. 使用 subpackages 进行分包路径声明,subpackages 配置路径外的目录会被打包到主包中
  2. tabBar 里配置的路径必须放在主包里
  3. 不同的分包之间的资源不能相互引用,但都可引用主包中的资源

4.3、分包的性能提升

小程序分包是将小程序的代码和资源文件按照功能或页面进行拆分,分别打包成不同的子包。分包的主要目的是优化小程序的加载速度和性能,提升用户体验。以下是分包的一些好处:

  1. 减少首次加载时间:小程序的初始加载时间对用户体验至关重要。通过分包,可以将主包中的核心代码和页面进行拆分,使得用户在打开小程序时只需下载主包的内容,从而减少了首次加载的时间。

  2. 按需加载:分包可以根据用户的实际需求进行加载,而不是一次性加载所有的代码和资源文件。这样可以减少小程序的总体体积,提高加载速度,并降低用户流量消耗。

  3. 优化页面切换速度:分包可以使得小程序在页面切换时更加快速和流畅。当用户进入一个新的页面时,只需加载该页面所属的子包,而不需要重新加载整个小程序。

  4. 提高开发效率:分包可以使得开发团队更好地进行模块化开发和维护。不同的开发人员可以独立开发和管理各自负责的子包,减少代码冲突和合并的复杂性。

  5. 灵活部署和更新:通过分包,可以将小程序的不同功能或页面独立部署和更新。这样,当小程序的某个功能或页面需要进行修改或优化时,只需更新对应的子包,而不需要重新发布整个小程序。

4.4、分包流程

1、在 app.json 中配置路径

{
  "pages": [
    "pages/index/index",
    "pages/logs/logs"
  ],
	"subpackages": [
    {
      "root": "pages/packageA",
      "pages": [
        "child/child",
        "parent/parent"
      ]
    }
  ],
}

2、保存页面后,生成对应的文件目录

3、 更改项目中使用的路径

原本

gotoChild() {
    wx.navigateTo({
      url: '/pages/child/child',
    })
}

需要更改成最新路径后

gotoChild() {
    wx.navigateTo({
      url: '/pages/packageA/child/child',
    })
}

5、uni支持的文件类型

  • .vue
  • .js
  • .css
  • pages.json
  • 各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug

6、uniapp中封装接口请求相较于微信小程序有什么要注意的

uniapp和微信小程序都提供了网络请求API(uni.request(OBJECT) 和 wx.request(object)),但 uniapp 为了实现跨端兼容,需要注意网络请求跨域问题,微信小程序不用考虑多端兼容,也不会出现跨域问题。

uniapp中的跨域问题依然可以通过在 vue.config.js 中配置Proxy代理解决;

devServer ——> proxy ——> changeOrigin: true, //是否跨域

8、描述一下在Uniapp中,组件和页面的区别

在Uniapp中,页面和组件的区别在于,页面是一个具体的应用页面,拥有独立的路由地址和生命周期函数,而组件是应用页面中的局部组件,包含在页面中,没有独立的路由地址和生命周期函数。

9、uni-app中的生命周期

9.1、应用生命周期

onLanuch – uni-app 初始化完成时触发(全局只触发一次)
onShow – uni-app启动,或从后台进入前台显示
onHide – uni-app从前台进入后台
onError – 当uni-app 报错时触发
onUNiNViewMessage – 对 nvue 页面发送的数据进行监听
onUnhandledRejection – 对未处理的Promise拒绝事件监听函数
onPageNotFound – 页面不存在监听函数
onThemeChange – 监听系统主题变化

 9.2、页面生命周期

onInit – 监听页面初始化,参数同onLoad参数,为上个页面传递的数据,参数类型为Object,触发时机早于onLoad
onLoad – 监听页面加载,其参数为上个页面传递的数据,参数类型为Object
onShow – 监听页面显示,页面每次出现在屏幕上都触发,包括从下级页面返回露出当前页面
onReady – 监听页面初次渲染
onHide – 监听页面隐藏
onUnload – 监听页面隐藏
onResize – 监听窗口尺寸变化

 9.3、vue组件的生命周期

beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed

9.4、小程序的全局方法

  1. 下拉刷新:onPullDownRefresh

  2. 触底更新:onReachBottom()

  3. 右上角分享:onShareAppMessage

  4. 页面滚动:onPageScroll

  5. 分享到朋友圈:onShareTimeline

10、uni-app 中的本地缓存

同步存储:uni.setStorageSync(key,value),获取:uni.getStorageSync(key,value)。

异步存储:uni.setStorage(OBJECT),获取:uni.getStorage(OBJECT)。拥有回调函数。

uni.setStorage({
	key: 'storage_key',
	data: 'hello',
	success: function () {
		console.log('success');
	}
});

移除一个:uni.removeStorage(OBJECT)

清除所有:uni.clearStorage()

11、uni-app路由与跳转 

uni.navigateTo 跳转页面
uni.redirect 销毁当前页跳转到指定页面
uni.switchTab 跳转至tab页面
uni,reLaunch 销毁所有页面跳转至指定页面
uni.navigateBack 返回上一页
exit 退出小程序,target = "miniProgram"时生效

12、描述一下在Uniapp中如何实现动态路由。

在Uniapp中,可通过vue-router实现动态路由。具体实现方式是,在定义路由时,使用动态路由参数设置路由的路径,然后在组件中通过$route.params来获取路由参数,以便进行页面的动态渲染。

//在起始页面跳转到test.vue页面并传递参数
uni.navigateTo({
	url: 'test?id=1&name=uniapp'
});

// 在test.vue页面接受参数
export default {
	onLoad: function (option) { //option为object类型,会序列化上个页面传递的参数
		console.log(option.id); //打印出上个页面传递的参数。
		console.log(option.name); //打印出上个页面传递的参数。
	}
}

13、如何让图片宽度不变,高度自动变化,保持原图宽高比不变?

给image标签添加 mode='widthFix'

14、用uniapp有遇到一些兼容性问题吗?

  1. 布局兼容性:不同平台的屏幕尺寸和分辨率可能存在差异,因此在进行布局时需要考虑不同平台的适配性。uni-app 提供了一些适配方案,如使用百分比布局、flex 布局和 rpx 单位等,可以根据需求选择合适的方案进行布局。

  2. API 兼容性:不同平台对于原生 API 的支持程度可能有所不同。在使用 uni-app 提供的 API 或调用原生 API 时,需要注意查阅官方文档,了解各个平台的差异和兼容性情况。例如在微信小程序中,uni.getLocation 方法返回的结果包含经度(longitude)和纬度(latitude)信息,可以直接使用。但在 H5 平台中,由于浏览器的限制,uni.getLocation 方法可能需要用户授权,并且返回的结果可能包含更多的信息,如精度、海拔等。

15、回跳了两层页面

要实现a页面跳转到b页面,再从b页面跳转到c页面,c页面返回只能返回到a,不能返回到b页面,可以使用uni.navigateBack({delta: 2})方法,其中delta表示返回的页面层数。

16、小程序的微信授权登录流程

  1. 在微信开发者平台注册小程序并获取到 AppID。

  2. 在 uni-app 项目中,使用 uni.login 方法获取到用户的临时登录凭证 code。

  3. 调用微信小程序的 wx.login 方法,将获取到的 appid , appsecret 和 code 发送给后端服务器。

  4. 后端服务器使用微信提供的接口,通过 appid , appsecret 和 code 换取用户的 openid 和 session_key。后端从数据库中查找 openid ,如果有记录,后端服务器将获取到的 openid 和 session_key 返回给前端。如果没有查到记录,说明该用户没有注册,数据库返回错误信息给后端,后端返回错误信息给前端。对于每个小程序,微信都会将用户的微信ID映射出一个小程序 openid,作为这个用户在这个小程序的唯一标识

  5. 前端用户获取 openid 和 session_key后,可以将其存储在本地,用于后续的登录验证。

<template>
  <view>
    <button @tap="login">微信授权登录</button>
  </view>
</template>

<script>
export default {
  methods: {
    login() {
      uni.login({
        provider: 'weixin',
        success: (loginRes) => {
          if (loginRes.code) {
            // 登录成功,获取到临时登录凭证 code
            const code = loginRes.code;
            // 调用后端接口进行登录验证和获取用户信息
            this.getUserInfo(code);
          } else {
            console.log('登录失败!' + loginRes.errMsg);
          }
        },
        fail: (error) => {
          console.log('登录失败!' + error.errMsg);
        }
      });
    },
    getUserInfo(code) {
      uni.getUserInfo({
        provider: 'weixin',
        success: (res) => {
          const userInfo = res.userInfo;
          // 将 code 和 userInfo 发送给后端服务器进行登录验证和处理
          // ...
        },
        fail: (error) => {
          console.log('获取用户信息失败!' + error.errMsg);
        }
      });
    }
  }
}
</script>

17、微信小程序的支付流程

  1. 用户点击下单;调用wx.login 获取临时登录凭证code,发送到后端换取openId;
  2. 将商品信息(id、数量等)+ 用户的openId一并通过购买接口发送服务端;
  3. 服务器综合以上信息生成订单+签名(根据微信支付SDK要求生成),向微信支付后台发送支付请求,获取其返回的预付款订单id(prepay_id),同时再次根据微信支付SDK要求生成预付款订单签名,二者一并响应给小程序端;
  4. 小程序端调用wx.requestPayment()发起微信支付,此时微信内部的支付窗口被唤醒,用户输入支付密码或指纹;
  5. 微信支付后台处理支付,将结果同时推送给小程序端和我们自己的服务端;

18、微信发布流程

  • 在uni-app端完成微信小程序的打包;
  • 在微信开发者工具中将代码上传到微信公众平台,形成体验版;
  • 测试人员根据扫描体验版二维码进行最后的测试工作;
  • 测试通过后,点击提交审核,进入审核流程,通常24小时就能出结果;
  • 审核通过后,用户即可通过维系小程序搜索到我们的小程序;同时我们还可以在微信公众平台生成小程序的葵花码,交给推广人员进行推广

参考:面试官:说说微信小程序的登录流程? | web前端面试 - 面试官系列

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx的性能优化、安全以及防盗链配置

目录 一、nginx的日志分割 二、nginx性能优化之启用epoll模型 三、nginx性能优化之设置worker进程数并与cpu进行绑核 四、nginx性能优化之调整worker的最大打开文件数和最大处理连接请求数量 五、nginx性能优化之启用gzip压缩&#xff0c;提高传输&#xff0c;减少带宽 六…

自行编写一个简单的shell!

本文旨在编写一个简单的shell外壳程序&#xff01;功能类似于shell的一些基本操作&#xff01;虽然不能全部实现shell的一些功能&#xff01;但是通过此文章&#xff0c;自己写一个简单的shell程序也是不成问题&#xff01;并且通过此文章&#xff0c;可以让读者对linux中一些环…

入门Redis学习总结

记录之前刚学习Redis 的笔记&#xff0c; 主要包括Redis的基本数据结构、Redis 发布订阅机制、Redis 事务、Redis 服务器相关及采用Spring Boot 集成Redis 实现增删改查基本功能 一&#xff1a;常用命令及数据结构 1.Redis 键(key) # 设置key和value 127.0.0.1:6379> set …

[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用)

文章目录 介绍一、实现原理二、通过注册表设置代理2.1 开启代理2.2 关闭代理2.3 添加代理地址2.4 删除代理设置信息 三、代码实战3.1 程序控制代理操作控制3.1.1 开启全局代理3.1.2 添加代理地址3.1.3 关闭代理开关3.1.4 删除代理信息 3.2 拦截所有请求 介绍 有一天突发奇想&am…

Avaya Aura Device Services 任意文件上传漏洞复现

0x01 产品简介 Avaya Aura Device Services是美国Avaya公司的一个应用软件。提供一个管理 Avaya 端点功能。 0x02 漏洞概述 Avaya Aura Device Services 系统PhoneBackup接口处存在任意文件上传漏洞&#xff0c;攻击者可绕过验证上传任意文件获取服务器权限。 0x03 影响范围…

代码随想录算法训练营第四十天|139.单词拆分,多重背包,背包问题

139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&a…

【C++】输入输出流 ⑤ ( cin 输入流对象 | cin.ignore() 函数 | cin.peek() 函数 | cin.putback() 函数 )

文章目录 一、cin.ignore() 函数1、cin.ignore() 函数简介2、cin.ignore() 函数原型3、代码示例 - cin.ignore() 函数 二、cin.peek() 函数1、cin.peek() 函数简介2、代码示例 - cin.peek() 三、cin.putback() 函数1、cin.putback() 函数简介2、代码示例 - cin.putback() 一、c…

智能优化算法应用:基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于粒子群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.粒子群算法4.实验参数设定5.算法结果6.参考文…

IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 创建好的工程如下&#xff1a; src/main…

探索 PDM:新一代的 Python 包管理工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com PDM&#xff08;Python Development Master&#xff09;是一款新一代的 Python 包管理工具&#xff0c;旨在提供更为现代化、可靠且灵活的解决方案。与传统的 pip 和 Poetry 相比&#xff0c;PDM 在依赖版本管理…

点云 ros PointCloud2格式与livox CustomMsg格式介绍

点云 ros PointCloud2格式与livox CustomMsg格式介绍 PointCloud2 点云格式livox CustomMsg 点云格式 PointCloud2 点云格式 PointCloud2 是ros的一种点云格式 具体官方数据 http://docs.ros.org/en/jade/api/sensor_msgs/html/msg/PointCloud2.html std_msgs/Header header…

Qt/C++音视频开发57-切换音视频轨道/切换节目流/分别切换音频视频轨道

一、前言 对各种音视频文件格式的支持&#xff0c;是一个播放器的基础功能。一般的音视频文件只有1路流&#xff0c;比如音频文件只有1路音频流&#xff0c;视频文件只有1路音频1路视频流&#xff0c;实践过程中发现&#xff0c;还有一种ts格式的文件&#xff0c;可能有多路流…

基于SSM的成绩管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

qt:QMessageBox的常见用法

头文件&#xff1a;#include <QMessageBox> Infomation消息对话框 初始化格式&#xff1a; QMessageBox * msgBox new QMessageBox(QMessageBox::Information, "我是标题", "我是提示文字", 按钮); 按钮可以是以下取值&#xff0c;会在按键上显示…

C++中STL的容器vector

文章目录 什么是vectorvector与普通顺序表不同的点 vector的成员函数operatoroperator[]begin与end与iteratorsize()capacityresizeemptyreservepush_backpop_backinserteraseswapclear成员变量 总结 什么是vector vector&#xff1a;是数据结构里面的顺序表&#xff0c;开辟一…

JVM类加载器ClassLoader的源码分析

1、ClassLoader与现有类加载器的关系 ClassLoader与现有类加载器的关系&#xff1a; ClassLoader是一个抽象类。如果我们给定了一个类的二进制名称&#xff0c;类加载器应尝试去定位或生成构成定义类的数据。一种典型的策略是将给定的二进制名称转换为文件名&#xff0c;然后去…

LeetCode Hot100 39.组合总数

题目&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限…

[报错]记录IDEA远程开发报错:java: Cannot run program.....

报错内容 IDEA在进行远程开发的时候报错&#xff0c;内容如下&#xff1a; java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

空中消防员:无人机森林防火应用全面升级

森林是生态系统的重要组成部分&#xff0c;也是人类得以生存的关键。我国森林面积广大&#xff0c;存在火灾频发的困境。提升森林火灾防控能力是维护生态平衡、保护资源和保障人民生命安全的必要步骤。随着无人机技术的发展&#xff0c;其在无人机森林防火中的应用为传统巡查工…

【EI会议征稿中】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2023&…