Uni-app 笔记二 (项目笔记)-程序员宅基地

技术标签: 笔记  # vue3  # 小程序--uni-app  # TS  uni-app  

/**
 * @author wn
 * @date 2023/07/26 10:14:15
 * @description:uniapp 笔记
 */

/*
1 安全区域
屏幕去掉 状态栏 +刘海 剩余展示内容的区域 --
可通过 uni.getSystemInfoSync() 获取屏幕 上边界 到安全区 顶部 的距离。
safeAreaInsets = {top: 59, left: 0, right: 0, bottom: 34}

"navigationStyle": "custom", // 隐藏默认导航,自定义
页面 直接顶到 windows 最上方

这时 paddingTop:安全距离
view 中的 内容就不会被遮挡

const { safeAreaInsets } = uni.getSystemInfoSync()
const top = ref<number | undefined>()
top.value = safeAreaInsets?.top

:style="{ paddingTop: top + 'px' }"

自定义状态栏 返回按钮 --可以使用 navigator + icon 自定义图标
                            open-type="navigateBack" 对应 uni.navigateBack 设置 路由

2 icon  使用 iconFont

3 font-size 有继承size时  可以指定 百分比
  font-size: 80%;

4 伪元素  可以通过 display:flex; 与 text的内容 排列
  .caption {
	display: flex;
	justify-content: center;
	align-items: center;
	&::before,
	&::after {
		content: '';
		width: 20rpx;
		height: 20rpx;
		background: url(@/static/images/bubble.png) center/contain;
	}
}

5 uniAPP css  使用 标签选择器 报警告  要避免

6 v-if 导致 setup 执行了两次
  v-show 不会 onMounted中也不会

7  注意  page { height: 100%; }
  基于 scroll-view 组件实现 下拉刷新 上拉加载
  配置 refresher-enabled     属性,开启自定义下拉刷新交互
  监听  @refresherrefresh    事件,判断用户是否执行了下拉操作
  配置  refresher-triggered  属性,是否关闭下拉状态  true 开始动画 false 关闭动画
  配置  @scrolltolower       滚动到底部/右边,会触发  事件 -- 上拉加载

8 生成骨架屏
  微信开发者工具 --左边页面 右下角--三个点--生成骨架屏
  --xxx.skeleton.wxml 和 xxx.skeleton.wxss--
  将二者封装成 xxx.skeleton.vue组件  这里生成的是整个页面的骨架屏
  要是只需要部分 比如 navBar 不需要  template 中 删除 结构即可

  <XXXSkeleton v-if="isLoading" />
  <template v-else>
    <xxx1.vue />
    <xxx2.vue />
  </template>

9 navigator 参数传递
  navigator 通过url传递的参数  会在 page 的 props中接收到
  传递的参数应该是基本类型(如字符串、数字等),或者是经过JSON序列化的对象
  <navigator
  :url="'/pages/navigate/navigate?item='+ encodeURIComponent(JSON.stringify(item))">

  const { item } = defineProps<{ item:string }>()
  const obj = JSON.parse(decodeURIComponent(item))

  自定义状态栏

10 小程序的 tap 事件  等同于 click

11 setup 的执行时机 在 onLoad 之前
   setup > onLoad > beforeCreated

12 uni-popup 弹出层组件
  插入内容  uni-popup-message   uni-popup-dialog  uni-popup-share
  uni-popup 组件实例 通过 open close 打开与关闭

  const popupRef = ref<{
  open: (type?: UniHelper.UniPopupType) => void
  close: () => void
}>()
  popup.value?.open("top")
  popup.value?.close()

  禁止滚动穿透

13 微信登录  获取微信用户基本信息(昵称、性别、手机号码等)
   用户在使用小程序时,其实已登录微信,其本质上就是:微信授权给小程序读取微信用户信息
   1 前端:调用 wx.login() 接口获取登录凭证(code)
     后端:通过凭证(code)向微信服务器生成 用户登录态
     用户登录态,不包含用户昵称、性别、手机号码等信息,作用是用于后端与微信服务器通讯
     onLoad-->
     const { code } = await wx.login()

   2 微信登录接口(后台 API)
   button -- open-type="getPhoneNumber"
   点击 弹窗--允许后
   触发 @getphonenumber 回调中 获取 -- LoginParams
     type LoginParams = {
       code: string
       encryptedData: string
       iv: string
      }

   回调中 -- 调用 后台 API -- 获取 -- LoginResult

export type LoginResult = {
  id: number // 用户ID
  avatar: string // 头像
  account: string // 账户名
  nickname?: string // 昵称
  mobile: string // 手机号
  token: string // 登录凭证
}

14 pages.json -- "navigationBarTextStyle": "white"
   导航栏标题-文字颜色  还可以设置当前页面 状态栏 电池,时间等文字颜色
   仅支持 black/white

15 分包 1 按模块管理页面,方便项目维护。
       2 减少主包体积,用到的时候再加载分包,属于性能优化解决方案
   通过 插件 uni-create-view 可以快速新建分包页面,自动配置分包路由。
   注意: 自动生成的分包页面 需要修改下 分包加载规则 的 路径
   subPackages--[]

   分包预下载 -- preloadRule
   当用户进入【某个】页面时,由框架自动预下载 分包,提升进入后续分包页面时的启动速度

16 表单校验 -- uni-forms -- uni-forms-item
   1 表单校验 2 自定义校验规则 3 动态表单校验 -- v-model的巧妙赋值 (name:value)
   触发时机 validate-trigger= "bind" -- 数据改变时
           blur--input失去焦点  submit 提交数据时

17 滑动删除 uni-swipe-action--uni-swipe-action-item
   可以通过 1 数据 2 插槽 -- 生成 左右滑块内容
   点击滑块触发 click 事件 -- 只对1数据渲染生效
           2插槽渲染的  通过插槽自身的点击事件触发 @tap
   滑块 开关  触发 change 事件

18 SKU 组件 -- gitee 中 源码中  components--下载  导入自己项目中  components
   组件市场 下载 组件 按照文档使用
    <vk-data-goods-sku-popup
      ref="skuPopup"
      v-model="skuKey"          true为打开组件,false为关闭组件
      border-radius="20"        顶部圆角值
      :localdata="goodsInfo"    数据源
      :mode="skuMode"           1:都显示 2:只显示购物车 3:只显示立即购买
      @open="onOpenSkuPopup"    打开组件时
      @close="SkuPopup"         关闭组件时
      @add-cart="addCart"       加到购物车时--选完SKU才会触发	selectShop 当前选择的sku数据
      @buy-now="buyNow"         立即购买时--选完SKU才会触发	selectShop 当前选择的sku数据
    ></vk-data-goods-sku-popup>
    还可以通过 属性 配置
    最大最小购买数量 点击步长 库存显隐 主题  右上角关闭按钮及样式  立即购买与加入购物车 文字内容 样式 背景
    商品缩略图背景  按钮可点不可点 样式

    localdata -- 数据格式
    数据定义重点看
    (sku_list--sku_name_arr) --> (spec_list)

   {
     "_id":"001",         // 商品ID
     "name": "iphone11",  // 商品名称
     "goods_thumb":"",    // 商品头像
     // 该商品对应的sku列表 -- 也就是最终的 选完规格后的 库存商品
    "sku_list": [
        {
      "_id": "001",           // SKU ID
      "goods_id": "001",      // 商品ID
      "goods_name": "xx",     // 商品名称
      "image": ""             // SKU头像
      "price": 19800,         // SKU 价格
      "stock": 100            // 库存
      // 该SKU由哪些规格组成(规格是有顺序的,需要与spec_list的数组顺序对应)
      "sku_name_arr": ["红色", "128G", "公开版"],
        }
    ],
     // 商品规格列表
    "spec_list": [
        {
            "name": "颜色", // 第一组规格名
            // 第一组规格的 第一项规格值名称    二项规格值名称  三项规格值名称
            "list": [{"name": "红色"},{"name": "黑色"},{"name": "白色"}]
        },
        {
            "name": "内存",
            "list": [{"name": "128G"},{"name": "256G"}]
        },
        {
            "name": "版本",
            "list": [{"name": "公开版"},{"name": "非公开版"}]
        }
    ]
}
sku_name_arr 数组的第一个值sku_name_arr[0] = spec_list[0].list中的任意一个元素的name属性的值
                               spec_list[0].list中必须要有且只有一个元素的name属性的值为"红色"

19 组件类型生命
 1 自定义组件   --   custom.vue
 2 组件类型     --   import custom from '@/components/custom.vue'
                    typeof custom
 3 组件实例     --   InstanceType<typeof custom>

 方式二
 1 import type { Component } from '@uni-helper/uni-app-types'
 2 定义 props  -- interface CustomProps {
                   name:string
                  }
 3 Component<T> 等同于  typeof T
   Component<CustomProps> === typeof custom
 4 组件实例     --   InstanceType<Component<CustomProps>>

最后 -- 全局组件类型声明--这样自定义的组件就有类型了
declare module 'vue' {
	export interface GlobalComponents {
		'custom': typeof custom
    'custom2': Component<CustomProps>
	}
}

20 滚动驱动的动画 -- this.animate(selector, keyframes, duration, ScrollTimeline)
    this.animate(
    '.avatar', // 选择器 多个空格隔开

    [{
    borderRadius: '0',
    borderColor: 'red',
    transform: 'scale(1) translateY(-20px)',
    offset: 0,
  }, {
    borderRadius: '25%',
    borderColor: 'blue',
    transform: 'scale(.65) translateY(-20px)',
    offset: .5,
  }],

    2000,

    {
    scrollSource: '#scroller', // 以谁滚动触发动画
    timeRange: 2000,
    startScrollOffset: 0,
    endScrollOffset: 85,
  })

  纯 CSS 实现
  https://segmentfault.com/a/1190000044039882#item-5

21 开发环境 -- boolean
   import.meta.env.DEV      开发
   import.meta.env.PROD     发布

22 微信支付 -- 获取微信支付参数 + 发起微信支付
   const onOrderPay = async () => {
	// 开发环境 DEV
	if (import.meta.env.DEV) {
		// 开发环境 -- 模拟支付
		await getPayMockApi({ orderId: id })
	} else {
		// 正式环境支付 -- 1.获取支付订单信息,
		const res = await getWxPayApi({ orderId: id })

		// uni.requestPayment(res) -- res:UniApp.RequestPaymentOptions
		// 2.调用微信支付API -- 弹框输密码
		await wx.requestPayment(res)
	}
*/


 ===========================项目打包============================

 ======微信小程序端========
 1 运行打包命令 pnpm build:mp-weixin -- vsCode
 2 预览和测试,微信开发者工具导入生成的 /dist/build/mp-weixin 目录 -- 微信开发者工具
 3 上传小程序代码 -- 微信开发者工具 -- 上传
 4 提交审核和发布 -- 微信公众平台 -- 版本管理 -- 提交审核
 打包成其他小程序端的步骤类似,只是更换了 打包命令 和 开发者工具 。

 =======H5============
 1 运行打包命令 pnpm build:h5 -- vsCode
 2 预览和测试,使用浏览器打开 /dist/build/h5 目录下的 index.html 文件
 3 由运维部署到服务器
  // manifest.json
{
    
   // 网页端特有配置
  "h5": {
    
    "router": {
    
      "base": "./"   // 基础路径:./ 为相对路径
    }
  }
}

======打包为 APP=======
HBuilderX
1 手机预览与调试
2 导入HBuilderX-->选中项目根目录-->运行(运行到手机或模拟器)-->下载真机运行插件-->运行到Android App基座

打包APP -- 云打包
1 Manifest 中 获取 DCloud AppId
2 发行(原生APP 云打包)-->注册 DCloud 账号--> 登陆 DCloud-->
3 发行(原生APP 云打包)
使用云端证书(详情中  DCloud AppId -- 获取证书 -- Android 云端证书--创建证书)
正式打包
传统打包 或者 快速安心打包
打包
安装云打包插件
打包

======打包为 IOS=======
HBuilderX + MacBook + iphone
1 手机预览与调试
2 导入HBuilderX-->选中项目根目录-->运行(运行到手机或模拟器)-->运行到 IOS App基座
建议运行到模拟器上 真机版本太多了
mac 安装  Xcode  提供 iPhone 模拟器
运行 到 IOS App基座 时就会有 多个版本的 模拟器

打包IOS -- 云打包
需要 ios IDP/IEP 证书 -- 申请 每年几百元

证书私钥密码
证书profile文件
私钥证书

花钱就有了
其他按步骤进行填写

正式打包
传统打包 或者 快速安心打包
打包

====================================
各平台兼容
1 小程序端 不支持 * 选择器
  运行直接报错 --> 并集选择器 view,text,image{
     }

2 页面视口差异 page
  H5-- 整个页面都是 视口 (上下 通过定位画出)
  小程序端 + APP-- 顶部导航栏 + 视口(webview区域) + 底部 tabBar
  (非tabBar页 或 者自定义导航栏 -->视口webview区域会相应延伸)

  A 视口内容 -- 是否 会被 上下 遮挡 (H5)
  page {
    
	height: 100% !important;
 }
因为内部的继承关系  100% 可以让 H5的视口--page 在 中间,不会被上下部分因为定位遮挡
 B 定位 组件的位置 -- 是否 会被 上下 遮挡 (H5)
 --window-bottom  App 小程序 都是 0 ,H5 tabBar高度
 --window-top     App 小程序 都是 0 ,H5 导航栏高度
 position:fixed;
 bottom:var(--window-bottom);

3 H5 style 默认开启 scoped
 开发者工具生成的 骨架屏 是根据页面样式 + 其他样式生成的
 打包到 H5 或者 APP 后
 因为 默认开启了 scoped
 骨架屏 依赖的 一些组件样式  比如 首页(轮播图,分类,猜你喜欢) 的样式引用不到
 骨架屏 样式 异常
将 scss 写到独立的  category.scss ,hot.scss 中
组件 和 骨架屏 style 中 分别引用
骨架屏中
#ifdef H5 || APP-PLUS

@import '../styles/category.scss';
@import '../styles/hot.scss';

#endif

4 组件兼容
编译到不同的平台时  相同的组件可能会 编译成 不同的 组件树
例如 navigator --> a
标签 与 结构 父子嵌套 都会变化 --导致样式 失效 -- flex失效  类名丢失 等
根据平台 通过条件编译调整 css 样式 即可

5 js 的 跨端 条件编译 -- 根据文档查阅即可
微信支付
选择图片
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014105655/article/details/135910681

智能推荐

hdu 1229 还是A+B(水)-程序员宅基地

文章浏览阅读122次。还是A+BTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24568Accepted Submission(s): 11729Problem Description读入两个小于10000的正整数A和B,计算A+B。...

http客户端Feign——日志配置_feign 日志设置-程序员宅基地

文章浏览阅读419次。HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息。FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。BASIC:仅记录请求的方法,URL以及响应状态码和执行时间。NONE:不记录任何日志信息,这是默认值。配置Feign日志有两种方式;方式二:java代码实现。注解中声明则代表某服务。方式一:配置文件方式。_feign 日志设置

[转载]将容器管理的持久性 Bean 用于面向服务的体系结构-程序员宅基地

文章浏览阅读155次。将容器管理的持久性 Bean 用于面向服务的体系结构本文将介绍如何使用 IBM WebSphere Process Server 对容器管理的持久性 (CMP) Bean的连接和持久性逻辑加以控制,使其可以存储在非关系数据库..._javax.ejb.objectnotfoundexception: no such entity!

基础java练习题(递归)_java 递归例题-程序员宅基地

文章浏览阅读1.5k次。基础java练习题一、递归实现跳台阶从第一级跳到第n级,有多少种跳法一次可跳一级,也可跳两级。还能跳三级import java.math.BigDecimal;import java.util.Scanner;public class Main{ public static void main(String[]args){ Scanner reader=new Scanner(System.in); while(reader.hasNext()){ _java 递归例题

面向对象程序设计(荣誉)实验一 String_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。-程序员宅基地

文章浏览阅读1.5k次,点赞6次,收藏6次。目录1.串应用- 计算一个串的最长的真前后缀题目描述输入输出样例输入样例输出题解2.字符串替换(string)题目描述输入输出样例输入样例输出题解3.可重叠子串 (Ver. I)题目描述输入输出样例输入样例输出题解4.字符串操作(string)题目描述输入输出样例输入样例输出题解1.串应用- 计算一个串的最长的真前后缀题目描述给定一个串,如ABCDAB,则ABCDAB的真前缀有:{ A, AB,ABC, ABCD, ABCDA }ABCDAB的真后缀有:{ B, AB,DAB, CDAB, BCDAB_对存储在string数组内的所有以字符‘a’开始并以字符‘e’结尾的单词做加密处理。

算法设计与问题求解/西安交通大学本科课程MOOC/C_算法设计与问题求解西安交通大学-程序员宅基地

文章浏览阅读68次。西安交通大学/算法设计与问题求解/树与二叉树/MOOC_算法设计与问题求解西安交通大学

随便推点

[Vue warn]: Computed property “totalPrice“ was assigned to but it has no setter._computed property "totalprice" was assigned to but-程序员宅基地

文章浏览阅读1.6k次。问题:在Vue项目中出现如下错误提示:[Vue warn]: Computed property "totalPrice" was assigned to but it has no setter. (found in <Anonymous>)代码:<input v-model="totalPrice"/>原因:v-model命令,因Vue 的双向数据绑定原理 , 会自动操作 totalPrice, 对其进行set 操作而 totalPrice 作为计..._computed property "totalprice" was assigned to but it has no setter.

basic1003-我要通过!13行搞定:也许是全网最奇葩解法_basic 1003 case 1-程序员宅基地

文章浏览阅读60次。十分暴力而简洁的解决方式:读取P和T的位置并自动生成唯一正确答案,将题给测点与之对比,不一样就给我爬!_basic 1003 case 1

服务器浏览war文件,详解将Web项目War包部署到Tomcat服务器基本步骤-程序员宅基地

文章浏览阅读422次。原标题:详解将Web项目War包部署到Tomcat服务器基本步骤详解将Web项目War包部署到Tomcat服务器基本步骤1 War包War包一般是在进行Web开发时,通常是一个网站Project下的所有源码的集合,里面包含前台HTML/CSS/JS的代码,也包含Java的代码。当开发人员在自己的开发机器上调试所有代码并通过后,为了交给测试人员测试和未来进行产品发布,都需要将开发人员的源码打包成Wa..._/opt/bosssoft/war/medical-web.war/web-inf/web.xml of module medical-web.war.

python组成三位无重复数字_python组合无重复三位数的实例-程序员宅基地

文章浏览阅读3k次,点赞3次,收藏13次。# -*- coding: utf-8 -*-# 简述:这里有四个数字,分别是:1、2、3、4#提问:能组成多少个互不相同且无重复数字的三位数?各是多少?def f(n):list=[]count=0for i in range(1,n+1):for j in range(1, n+1):for k in range(1, n+1):if i!=j and j!=k and i!=k:list.a..._python求从0到9任意组合成三位数数字不能重复并输出

ElementUl中的el-table怎样吧0和1改变为男和女_elementui table 性别-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏2次。<el-table-column prop="studentSex" label="性别" :formatter="sex"></el-table-column>然后就在vue的methods中写方法就OK了methods: { sex(row,index){ if(row.studentSex == 1){ return '男'; }else{ return '女'; }..._elementui table 性别

java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下-程序员宅基地

文章浏览阅读1.1k次。java文件操作之移动文件到指定的目录_java中怎么将pro.txt移动到design_mode_code根目录下

推荐文章

热门文章

相关标签