购物车(V2装饰器)

发布于:2025-04-07 ⋅ 阅读:(32) ⋅ 点赞:(0)

九、购物车(V2装饰器)

九、购物车(V2装饰器)

跟灯按弦超好玩碳纤维智能

经典格子元素,男童格子纯

您还未登录美蔻~

猜你喜欢

购物袋

去登录

2.9万+人付款

碳纤维一体琴身

.9万+人付款

¥599V9G

¥899O

尤克里里

棉衬衫

时尚料技

image.png

购物袋是空的

去逛逛

image.png

亚洲头围城市运动通勤电动车头盔

亚洲头围城市运动通勤电动车头盔

双镜四季骑行半盔PRO

亮碟多效合一洗涤块495G

¥158.00

(摩托车可...

FINISH亮煤..

颜色:哑光..

额色:磨砂.

¥198.00

额色:雅杏...

¥69.90

¥158.00

双层有送环国路

务公一业快厦

TE京EH公

HS小

上浙

image.png


1购物车
咱们购物车基于 V2 装饰器进行开发,底气来源于
自定义组件混用场景指导
1.1素材整合
observedv2和Trace
1数据模型和页面
2静态页面
2在 oh-package.json5 文件中导入 common/basic
git 记录
Cart-素材整合
1.2MkEmpty 组件封装(V2实现)
V2装饰器
先来搞定购物车中间部分的显示效果,通过组件来完成

跟灯按弦超好玩碳纤维智能

经典格子元素,男童格子纯

您还未登录美蔻~

猜你喜欢

购物袋

去登录

2.9万+人付款

碳纤维一体琴身

.9万+人付款

¥599V9G

¥899O

尤克里里

棉衬衫

时尚料技

image.png

购物袋是空的

去逛逛

image.png


核心步骤:
1创建组件并暴露
2根据文档实现功能
3页面中导入并测试使用
a已登录,无商品,点击去第一个 Tab(下一节做)
b未登录,点击去登录页
基础模版

属性名

类型

说明

默认值

tip

string

提示信息

空字符串

buttonText

string

按钮文本

空字符串

icon

ResourceStr

中间图标

ic_public_empty

onClickButton

()=>void

点击按钮的逻辑

空方法

参考代码
git记录
Cart-MkEmpty组件封装

1.3去首页
使用Emitter进行线程间通信
需求及分析:
1已登录,购物车没有商品的时候,点击切换 tab 到第一个【首页】
2feature/cart -> products/phone 可以通过??? 来实现通讯
3 products/phone 如何控制 tab 切换
核心步骤:
1增加 emmit 的事件 id 常量,并导出 (方便管理)
2phone/index 注册事件,接收参数
3feature/cart 触发事件,传递数据
4phone/index 控制 tab 切换
git 记录
Cart-去首页
1.4加入购物车
接口文档

需求:
1详情页点击添加到购物车
2更新服务器数据
核心步骤:
1抽取 api,丢到 common
2页面实现交互逻辑
atoken 校验-》sku 校验-》提交-》api调用-》
1通过一个类管理所有购物车接口,因为有一整套的 CRUD
2导出
3整合业务,在商品详情页调用 加入购物车 接口
git 记录
Cart-加入购物车
1.5个数及页面跳转

多个地方需要用到个数,并且在很多时候都需要刷新

1.5.1详情页面个数更新

需求:
1获取最新个数(通过接口)
2更新购物车个数(考虑其他界面获取)
核心步骤:
1抽取 api:
a有 Token
ⅰ获取数据,具体的值
b没 Token
ⅰ格式为 0
c更新到AppStorage
2组件中获取并渲染
git 记录
Cart-详情页个数更新

1.5.2首页更新数量

需求:
1首页增加角标
2获取个数并渲染
3如果是首次打开页面,获取个数(已登录的情况)
核心步骤:
1增加 Badge 组件
2通过 AppStorage 获取数据并渲染
3生命周期钩子中获取数据
1更新首页购物车数量
git记录
Cart-首页个数更新
1.5.3登录和登出更新数量
登录和登出:
1登录更新:
a账号密码登录,华为登录之后,保存用户信息,同时更新购物车数量
2登出更新:
a设置页,退出登录时,删除用户信息,同时更新购物车数量
bcart.count() --> 0
1保存用户信息、删除用户信息时,都要更新购物车数量
git记录
Cart-登录登出更新购物车数量
1.6跳转购物车页

需求:
1点击购物车图标,打开购物袋页面
2tabs打开时,没有返回按钮
3跳转打开时,显示返回按钮
注意:
1之前购物袋只是 Tabs 渲染的组件,并不是页面,没有注册页面路由。
核心步骤:
1feature/CartView
a增加 Builder 入口函数 和 NavDestination 组件
b配置路由表 route_map.json
c配置 module.json5
2详情页,点击跳转即可
a优化:详情页跳转的时候【显示返回按钮】,并可以点击【返回上一页】
b通过携带参数实现效果
1增加 Builder 入口函数 和 NavDestination 组件
2新建路由表文件,并配置路由表
3配置 module.json5,让模块的路由表生效
4页面跳转,并传参
5获取参数
git 记录
Cart-去购物车页
1.7购物车列表渲染
接口文档


需求:
1获取购物车数据并渲染
核心步骤:
1抽取接口
2获取数据之后通过 new 转对象(嵌套数据更新)
3这个过程需要在 2 种情况下执行(分两步完成)
a首次进入,有 token 就获取(生命周期钩子)
b添加商品到购物车中(详情页--》购物车页)
1.7.1默认渲染
git 记录
Cart-默认渲染
1.7.2更新购物车列表
组件可见区域变化事件
问题分析:
1购物车,每次打开重新获取列表数据
a不是页面,只有 aboutToAppear 钩子
b第一次打开之后就不会被销毁,不会再次触发
2详情页
a跳转去购物车是新页面,会触发 aboutToAppear 可以刷新
3tab 页
a切换到 购物车 tab 时需要获取列表(不会再次触发aboutToAppear)
思考:如何实现 购物车页面数据刷新?
1通过 emitter 触发刷新
2组件可视区域改变时刷新 onVisibleAreaChange

git 记录
Cart-更新购物车列表
1.8个数更新
接口文档


需求:
1修改【个数】时
2更新服务器,更新本地
3更新购物车个数
核心步骤:
1实现Count组件的个数渲染及禁用外观
2累加及递减逻辑:
a修改服务器数据(*)
b更新本地数据
c更新个数
d伴随 loading 效果
3选中:
a修改服务器数据(*)
b更新本地数据

git 记录
Cart-个数及选中状态更新


1.9MkCheckBox组件
checkBox

原生的 CheckBox 使用起来有一些不便,咱们来:
1试试这个不便之处
2然后自己实现个组件,替换到 购物车页面的 【列表项】和【全选】

如果不用双向绑定那么 选中状态 和 绑定的状态变量就没有关联
基础模版

属性名

类型

说明

默认值

checked

boolean

是否选中

false

boxSize

number

大小

18

onClickBox

()=>void

点击组件

()=>{}


git记录
Cart-MkCheckBox组件封装

1.10选中状态更新
接口文档


需求:
1修改【选中状态】时
2更新服务器,更新本地
核心步骤:
1点击选中:
a修改服务器数据(*)
b更新本地数据
git记录 Cart-选中状态更新
1.11全选
接口文档

Array.prototype.every() - JavaScript | MDN

every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。

MDN Web Docs



需求:
1点击列表项目,同步更新全选状态
2点击全选,批量设置每一项的选中状态
核心步骤:
1计算全选状态并绑定(方法):
a返回每一项是否被选中(selected==true)(every)
b点击子组件(CheckBox)通过回调函数通知父组件(强制刷新页面)
2抽取 api
3点击全选:
a获取本地选中状态
b调用接口更新服务器
c设置列表项的选中状态
git 记录
Cart-全选
1.12总价格
链接


需求:
1根据选中状态,个数,单价计算总价格
核心步骤:
1实现方法:
a筛选-》累加-》小数点 2 位-》转字符串
2组件中使用该方法
git 记录
Cart-总价格
1.13删除
接口文档

原产兰州,气清味美,甜百合干16...

3秒快速拆琴轻松保养ODIN奥丁12...

若羌红枣脆片138克

规格:410克

颜色:午夜.,

¥329.00

紫米410克

¥19.00

规格:138克

规格:168克

¥18.00

半42.80

删除

出明日R王

V

image.png

更新本地(数据及个数)

更新服务器

删除数据

抽取API

image.png


需求:
1点击删除,删除购物车数据
核心步骤:
1抽取接口(坑,delete 请求方法第二个参数和之前的不同)
2点击删除调用接口,删除服务器数据
3更新个数
4删除本地
5伴随 loading 效果

commons/basic/src/main/ets/utils/Request.ets

ArkTS复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

export class RequestAxios {

// get -> params -> { params: {} }

// T 响应的内容 的类型!!

static get<T>(url: string, params?: object): Promise<T> {

return axiosInstance.get<null, T>(url, { params })

}

static getPlus<T>(url: string, config?: AxiosRequestConfig): Promise<T> {

return axiosInstance.get<null, T>(url, config)

}

// post -> data -> { data: {} }

static post<T>(url: string, data?: object): Promise<T> {

return axiosInstance.post<null, T>(url, data)

}

static delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {

return axiosInstance.delete<null, T>(url, config)

}

static put<T>(url: string, data?: object): Promise<T> {

return axiosInstance.put<null, T>(url, data)

}

}

commons/basic/src/main/ets/apis/cart.ets

ArkTS复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

import { Log } from '@abner/log'

import { auth, Logger } from '../../../../Index'

import { RequestAxios } from '../utils/Request'

import { CartGoods } from '../viewmodel'

interface UpdateParams {

selected?: boolean

count?: number

}

interface AddParams {

skuId: string

count: number

}

interface CountResult {

count: number

}

interface CheckAllParams {

selected: boolean

}

// 删除的参数

interface DeleteParams {

ids: string[]

}

export const CartKey: string = 'cartCount'

export class Cart {

// 添加

add(data: AddParams) {

return RequestAxios.post<null>('/member/cart', data)

}

// 获取个数

async count() {

let count = 0

if (auth.getUser()

.token) {

const res = await RequestAxios.get<CountResult>('/member/cart/count')

count = res.data.result.count

}

AppStorage.setOrCreate(CartKey, count)

}

// 获取列表

async list() {

return RequestAxios.get<CartGoods[]>('/member/cart')

}

// 更新商品

async update(skuid: string, data: UpdateParams) {

return RequestAxios.put<CartGoods>(`/member/cart/${skuid}`, data)

}

// 全选

async checkAll(data: CheckAllParams) {

return RequestAxios.put<null>('/member/cart/selected', data)

}

// 删除

async remove(data: DeleteParams) {

return RequestAxios.delete<null>('/member/cart', { data: data })

}

}

export const cart = new Cart()


git 记录
Cart-删除购物袋商品

2bug-ForEach 的keyGenerator参数
ForEach 键值规则
ForEach的第三个参数如果不给,那么默认值
bug 复现
1保证购物车有数据,测试交互效果
2切换到其他tab,再切换购物车,测试交互效果
3修改选中状态,修改个数,无法触发【全选】 和 【价格】的重新计算

结论:
1默认的键值生成逻辑,在使用相同数据覆盖的时候不会触发子组件的重新生成
2子组件交互时修改的依旧是上一份数据,但是数据源已经更改所以无法触发 UI 更新
解决方案:
1自定义 keyGenerator 函数,希望子组件全部重新创建时,使生成结果和上一次不同
2可以使用时间戳,随机数,累加的数。。核心就是保证 循环的 key 发生改变
优化代码

3自定义弹窗优化

WATUNNILUAUNDMON AUT . ISTYA KNPANP LU31103 HNIPTN ST AHPSSAM ,ZOE

AM '70CEAT ST ANNS IN.LIA SHIP HOIPTNMNISNISN

LLDS DLI ADUY

NAIIADN HAAN

DPENCUSTOMDIALOG ARGS ERROR CODE IS 193302, MESSAGE IS DIALOG CONTENTENT ALREADY EXIST. THE COMPONTEN

ALREADY

HAS

BEEN OPENED.

OPENCUSTOMDIALAG ANGS ERFOR CODE IS 103302, NESSAGE IS DIALOG CONTENTENT ALREADY EXIST, THE COMPONTEN

HAS ALREADY BEEN OPENED.

N OPENED.

LREADY BEEN

CLOSECUSTOMDIALOG COMPLETE.

CLOSECUSTOMDIALOG AN

, MESSAGE IS DIALOG CONTENT NOT FOUND. THE COMPONENTCONTENT CANNOT BE FOUND.

ALOG ARGS ERROR CODE IS 103303, MESSAGE

MESSAGE IS DIALOG CONTENT NOT FOUND. THE COMPONENTCONTENT

S ERROR CODE IS 103303,

CLOSECUSTOMDIALOG

FOUND.

OGARGS

BE

CANNOT

image.png


3.1弹窗错误优化
错误信息 目前使用的弹窗会有错误提示,错误原因是:
●103302: 内容节点对应自定义弹窗已存在
●103303:无法找到内容节点对应的自定义弹窗
咱们来优化一下弹框的逻辑
1多次请求只有第一次弹框
2多次请求最后一次结束的时候关闭弹框

请求拦截器

请求1

请求2

请求3

响应拦截器

image.png


git 记录
fix-优化全局弹框错误提示

若有收获,就点个赞吧

盐焗西兰花

今天 14:08

172

IP 属地广东

举报

分享到:

张良

正文

Ctrl + ⇧ + 7有序列表

回复

6382字

语雀

关于语雀使用帮助数据安全服务协议English

张扬波

深圳前端+鸿蒙4期-就业班

搜索Ctrl + J

首页

目录

git团队协作、状态管理V2

uniapp开发鸿蒙应用

09鸿蒙项目2-一多项目

反馈+补充

课程资源

讲义

一、一多开发&项目搭建

二、首页模块

三、分类

四、普通搜索

五、语音搜索

六、我的

七、华为登录

八、详情

九、购物车(V2装饰器)

九、购物车(原V1 版本)

十、地址管理(作业)

十一、创建订单

十二、支付

十三、订单

十四、物流信息

十五、推荐商品(服务卡片)

10-其他补充

大纲

1. 购物车

1.1. 素材整合

1.2. MkEmpty 组件封装(V2实现)

1.3. 去首页

1.4. 加入购物车

1.5. 个数及页面跳转

1.5.1. 详情页面个数更新

1.5.2. 首页更新数量

1.5.3. 登录和登出更新数量

1.6. 跳转购物车页

1.7. 购物车列表渲染

1.7.1. 默认渲染

1.7.2. 更新购物车列表

1.8. 个数更新

1.9. MkCheckBox组件

1.10. 选中状态更新

1.11. 全选

1.12. 总价格

1.13. 删除

2. bug-ForEach 的keyGenerator参数

3. 自定义弹窗优化

3.1. 弹窗错误优化

Adblocker


网站公告

今日签到

点亮在社区的每一天
去签到