黑马优购学习笔记

本文介绍了uni-app的跨平台开发能力,推荐了@escook/request-miniprogram用于发起网络请求,并提供了配置示例。文章还讨论了分类页面的优化,包括滚动条问题和切换分类后的处理,以及搜索历史的本地存储。此外,提到了商品详情页的HTML渲染、图片底部间隙的解决、.webp图片在iOS上的适配,以及商品价格闪烁的避免策略。最后,文章涵盖了设置tabBar徽标、选择收货地址、获取微信用户信息和微信支付的流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. uni-app 简介

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

详细的 uni-app 官方文档,请翻阅 https://uniapp.dcloud.net.cn/

 2. 目录结构

3. 配置网络请求:

由于平台的限制,小程序项目中不支持 axios,而且原生的 wx.request() API 功能较为简单,不支持拦截器等全局定制的功能。因此,建议在 uni-app 项目中使用 @escook/request-miniprogram 第三方包发起网络数据请求。

官方文档:https://www.npmjs.com/package/@escook/request-miniprogram

最终,在项目的 main.js 入口文件中,通过如下的方式进行配置:

import { $http } from '@escook/request-miniprogram'
uni.$http = $http
$http.baseUrl = 'https://api-hmugo-web.itheima.net'   配置请求根路径
$http.beforeRequest = function (options) {
uni.showLoading({
title: '数据加载中...',          请求开始之前做一些事情
})
}
$http.afterRequest = function () {
uni.hideLoading()           请求完成之后做一些事情
}

4. 优化分类页面

(1) 左右导航栏一个滚动条问题解决

例如:
<view class="big">
	<scroll-view scroll-y="true" class="left">
	</scroll-view>
	<scroll-view scroll-y="true" class="right">
	</scroll-view>
</view>

page {
    // 设置page的高为100%,也就是窗口能看到的高度
    height: 100%;
}
.big {
    // scroll-view使用最重要的就是要给父容器设置高度
    // 如果不设置高度,就会出现两屏一起滚动,
    // 他们其实是使用了屏幕视图的滚动条了,而不是我们定义的scroll-view组件的滚动条
    height: 100%;
    display: flex;
    .left {...}
    .right {...}
}

(2)切换一级分类后重置滚动条的位置

1. 在 data 中定义 滚动条距离顶部的距离 :
data() {
return {
scrollTop: 0  // 滚动条距离顶部的距离
}
}

2. 动态为右侧的 <scroll-view> 组件绑定 scroll-top 属性的值:
<!-- 右侧的滚动视图区域 -->
<scroll-view :scroll-top="scrollTop"></scroll-view>

3. 切换一级分类时,动态设置 scrollTop 的值:
activeChanged(i) {  // 选中项改变的事件处理函数
this.scrollTop = this.scrollTop === 0 ? 1 : 0
// 让 scrollTop 的值在 0 与 1 之间切换,因为如果直接赋值为0,他的值没有变就不会改变滚动条距离
}

5.  将搜索历史记录持久化存储到本地

  uni.setStorageSync('kw', JSON.stringify(this.historyList))
  调用 uni.setStorageSync(key, value) 将搜索历史记录持久化存储到本地
  historyList:JSON.parse(uni.getStorageSync("kw"))||[]
  调用uni.getStorageSync("kw")获取本地存储数据

6. 渲染详情页面html标签结构

在页面结构中,使用 rich-text 组件,将带有 HTML 标签的内容,渲染为小程序的页面结构:

<rich-text :nodes="xxx.xxx"></rich-text>

7. 解决详情页面html标签结构渲染的图片底部空白间隙的问题: 

res.message.goods_introduce = res.message.goods_introduce.replace(/<img
/g, '<img style="display:block;" ')
使用字符串的 replace() 方法,为 img 标签添加行内的 style 样式,从而解决图片底部
空白间隙的问题
或replaceAll()方法
res.message.goods_introduce = res.message.goods_introduce.replaceAll("<img",
'<img style="display:block;" ')

8. 解决 .webp 格式图片在 ios 设备上无法正常显示的问题:

使用字符串的 replace() 方法,将 webp 的后缀名替换为 jpg 的后缀名
res.message.goods_introduce = res.message.goods_introduce.replace(/<img
/g, '<img style="display:block;" ').replace(/webp/g, 'jpg')

9. 解决商品价格闪烁的问题

1. 导致问题的原因:在商品详情数据请求回来之前,data 中 goods_info 的值为 {} ,因此初次渲染页面时,会导致商品价格、商品名称等闪烁的问题。

2. 解决方案:判断 goods_info.goods_name 属性的值是否存在,从而使用 v-if 指令控制页面 的显示与隐藏:

<template>
<view v-if="goods_info.goods_name">
<!-- 省略其它代码 -->
</view>
</template>

10. 渲染商品详情页面导航区域的 UI 结构

基于 uni-ui 提供的 GoodsNav 组件来实现商品导航区域的效果

11. 动态为 tabBar 页面设置数字徽标

需求描述:从商品详情页面导航到购物车页面之后,需要为tabBar中的购物车动态设置数字徽 标。

注意:除了要在 cart.vue 页面中设置购物车的数字徽标,还需要在其它 3 个 tabBar 页面中,为购 物车设置数字徽标。

此时可以使用 Vue 提供的 mixins 特性,提高代码的可维护性。

1. 在项目根目录中新建 mixins 文件夹,并在 mixins 文件夹之下新建 tabbar-badge.js 文
件,用来把设置 tabBar 徽标的代码封装为一个 mixin 文件:
import { mapGetters } from 'vuex'
export default {   //导出一个 mixin 对象
computed: {
   ...mapGetters('cart', ['total']),
},
onShow() {      //在页面刚展示的时候,设置数字徽标
  uni.setTabBarBadge({  //调用 uni.setTabBarBadge() 方法,为购物车设置右上角的徽标
     index: 2,
     text: this.total + '',  //注意:text 的值必须是字符串,不能是数字
  })        
},
}

2. 修改 home.vue,cate.vue,cart.vue,my.vue //这4个tabBar页面的源代码,分别导
入 @/mixins/tabbar-badge.js 模块并进行使用:
import badgeMix from '@/mixins/tabbar-badge.js'   //导入自己封装的 mixin 模块
export default {   //将badgeMix混入到当前的页面中进行使用
mixins: [badgeMix],
}
注意:这四个页面都要引入,不然vuex中数据更新后退回没有引入的页面tarbar数据不会更新

注意:这里不能用全局混入,因为进入没有tabBar的页面会报错

uni-number-box

带加减按钮的数字输入框。 

滑动删除的 UI 效果

组件名:uni-swipe-action

12.  实现选择收货地址的功能

调用小程序提供的uni.chooseAddress()  实现选择收货地址的功能:

返回一个promise,利用async await返回一个对象,这个对象就是收货地址的信息

注意:1. 需要先开通相关的接口权限

        2. 并在app.json中配置"requiredPrivateInfos": [ "chooseAddress"]才能使用

 官方:全局配置 | 微信开放文档

如果是在uniapp写的,拿打开 manifest.json 文件

在mp-weixin里添加

13. 点击登录按钮获取微信用户的基本信息

uni.getUserProfile({
           desc: "获取信息"       使用此方法可返回用户信息(例如头像,姓名等)
})

uni.login()    使用此方法可返回一个code

利用这两个方法返回的结果调用获取token的接口
注意:获取token的接口坏了,这里要自己写死一个token

14. 登陆成功后跳转到登陆之前的页面

在点击结算时或者其他需要先登录才能使用的功能时,如果当时未登录那就跳转到登陆页面,跳转时把跳转的方式和当前跳转前的页面路径保存到vuex或者内存中,在点击登陆后先判断有没有存的值,如果有就跳转到存到vuex或内存中的路径没有就不跳转

 15. 微信支付的流程

1. 创建订单

请求创建订单的 API 接口:把(订单金额、收货地址、订单中包含的商品信息)发送到服务器

服务器响应的结果:订单编号

2. 订单预支付

请求订单预支付的 API 接口:把(订单编号)发送到服务器

服务器响应的结果:订单预支付的参数对象 ,里面包含了订单支付相关的必要参数

3. 发起微信支付

调用 uni.requestPayment() 这个 API,发起微信支付;把步骤 2 得到的 “订单预支付对 象” 作为参数传递给 uni.requestPayment() 方法

监听 uni.requestPayment() 这个 API 的 success , fail , complete 回调函数

注意:个人无法实现微信支付功能

1.2. 结构化一下 1.3. 图形化一下 1.3.1. 运营商后台 1.3.2. 商家后台 1.3.3. 网页前台 参考京东 2. 技术选型 前端:angularJS + Bootstrap 后台:SSM( springmvc+spring+mybatis) 数据库:mysql,使用mycat读写分离 开发模式:SOA 服务中间件:dubbox,需要和zookeeper配合使用 注册中心:zookeeper 消息中间件:Activemq,使用spring-jms 负载均衡:nginx 搜索:solr集群(solrCloud),配合zookeeper搭建, 使用spring-data-solor 缓存:redis集群,使用spring-data-redis 图片存储:fastDFS集群 网页静态化:freemarker 单点登录:cas 权限管理:SpringSecurity, 跨域:cros 支付:微信扫描 短信验证:阿里大于 密码加密:BCrypt 富文本:KindEditor 事务:声明式事务 任务调度:spring task 所有的技术,都可能涉及到为什么用?怎么用?用的过程中有什么问题? 3. 框架搭建 3.1. 前端 理解baseControler.js、base.js、base_pagination.js,以及每一个xxxController.js里面都公共的做了些什么。 baseControler.js 分页配置 列表刷新 处理checkBox勾选 xxxControler.js 自动生成增删改查 base_pagination.js 带分页 base.js 不带分页 3.2. dao 使用了mybatis逆向工程 4. 模块开发 逐个模块开发就好 4.1. 学会评估模块难不难 一个模块难不难从几方面考虑。 涉及几张表? 1,2张表的操作还是没有什么难度的。 涉及哪些功能? 增删改查,批量删除。 前端展示? 分页列表、树形、面包屑、三级联动、内容格式化。 4.2. 举几个简单模块的例子 4.2.1. 品牌管理 单表 分页、新增、删除、修改 4.2.2. 规格管理 2张表 分页、新增、删除、修改、显示化(显示列表内容的一部分) 4.2.3. 模板管理 2张表 分页、新增、删除、修改、显示化(显示列表内容的一部分) 4.2.4. 分类管理 单表 4.2.5. 商家审核 单表 4.3. 举一个复杂模块 4.3.1. 商品新增 需要插入3张表,tb_goods、tb_goods_desc、tb_item 前端:三级联动、富文本、图片上传、动态生成内容 4.3.2. 商品修改 需要从3张表获取数据,然后进行回显。 4.4. 典型模块设计 4.4.1. 管理后台 商品新增、商品修改 4.4.2. 前台页面 搜索模块实现 物车模块实现 支付模块实现 秒杀模块实现 5. 开发过程中问题&化 1.1. 登录 单点登录怎么实现 session怎么共享 1.2. 缓存 哪些场景需要用到redis redis存储格式的选择 怎么提高redis缓存利用率 缓存如何同步 1.3. 图片上传 图片怎么存储 图片怎么上传 1.4. 搜索 ​ 怎么实现 数据量大、 并发量高的搜索 怎么分词 1.5. 消息通知 ​ 哪些情况用到activeMq 1.6. 化 seo怎么化 怎么加快访问速度 1.7. 秒杀 ​ 怎么处理高并发 ​ 秒杀过程中怎么控制库存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值