微信小程序黑马优购遇到的问题和心得

简介: 微信小程序黑马优购遇到的问题和心得

案列学习


如果不想在consolo中输出

image.png

可以在image.png中为image.png项目设置 这个属性image.png

  1. Flex

image.png如果一行放不下 第二个可以让他们换行

image.png默认横向布局现在改为纵向布局

align-items: center;
  justify-content: center;

 改为水平垂直居中

justify-content: space-around;

均匀分配周围的空间

完美居中

display: flex;

 flex-wrap: wrap;

 justify-content: space-around;


1.给类似这种css盒子每个都加边框线 但是又不重复


image.png

技巧

首先给外面大盒子加上 上和左边框线

然后给里面每一个小盒子加上一个右和下边框线这样就会每一个盒子都会有边框线


1.给view和文字设置好看的样式


text-shadow: 0 0 5px #fff;
  box-shadow: 1rpx 1rpx 6rpx #aaa;

动态设置页面标题

wx.setNavigationBarTitle({
      title:this.data.title
    })

1.触发弹窗


image.png

wx.showToast({
        title: 'count:'+this.data.count
        // icon:"none"  //可以设置是否有弹窗图标
      })

1.直接在字符串中使用传过来的参数

"r,g,b":function(newr,newg,newb){
      this.setData({
        rgb:`${newr},${newg},${newb}`      //注意这里是大括号 !!!
      })
    }

8.自定义tabBar

(1)配置文件  //从这以后代码自动渲染自定义tabBar


在 app.json 中的 tabBar 项指定 custom 字段,同时其余 tabBar 相关配置也补充完整。

所有 tab 页的 json 里需声明 usingComponents 项,也可以在 app.json 全局开启。

{
  "tabBar": {
    "custom": true,  //添加这一行代 声明进行自定义tabBar
    "color": "#000000",
    "selectedColor": "#000000",
    "backgroundColor": "#000000",
    "list": [{
      "pagePath": "page/component/index",
      "text": "组件"
    }, {
      "pagePath": "page/API/index",
      "text": "接口"
    }]
  },
  "usingComponents": {}}

(2)添加 tabBar 代码文件  

在代码根目录中创建一下文件

custom- tab-bar/index.js
custom-tab-bar/index.json
custom-tab- bar/i ndex . wxml
custom-tab- bar/ index. WXSS

(3)去Vant Weapp寻找自定义样式

(4) 给自己定义页面设置跳转tabBar

onChange(event) {
      console.log(event);
      this.setData({ active: event.detail });
  //跳转路由  在这里设置跳转tabBar的路由
      wx.switchTab({
   url: this.data.list[event.detail].pagePath,
      })
    },

9.设置全屏滚动窗高度

1.数据里面设置高度变量 wh:0

2.在页面刚加载的时候调用uniapi

onLoad(){
const sysInfo=uni.getSystemInfoSync()
this.wh=sysInfo.windowHeight
}

3.在对应的scroll-view 标签里面设置动态style

:style="{height: wh+'px'}"

10.返回数据结构+数据重命名

async getCateList(){
const {data:res}=await uni.$http.get("/api/public/v1/categories")
console.log(res);
}

11.动态定义选中的框

image.png

实现这种效果


1.创建一个active 变量

2.在标签里面设置动态class


:class="['left-scroll-view-item',i==active?'active':'']"

通过点击事件方法来修改变量达到这种效果


12水平垂直居中样式

display: flex;
flex-direction: column;
justify-content: center;
align-items: center;

1.scroll-view重置scroll-top 来增强用户体验感的方法

1.定义scrollTop数据

2.给标签添加动态属性

1.通过方法的动态给scrollTop设置值来使scroll-top属性重置

2.大坑 当scrollTop前后要改变的值是相同的时候 页面效果不变 所以进行小技巧 运用三元运算来使scrollTop的值动态改变 改变的值为1或者0这样就可以动态重置 1像素点改变用户是感觉不到的

this.scrollTop=this.scrollTop===0?1:0

1.设置吸顶样式

position: sticky;
top:0;
z-index: 999;

15.防抖处理

在data中定义一个数据timer:null

image.png

16.美化搜索结果内容及文本超出用...替代


.sugg-list{
padding: 0 5px;
.sugg-item{
display: flex;
// 弹性盒子纵向居中
align-items: center;
// 弹性盒子两端对齐
justify-content: space-between;
font-size: 12px;
padding: 13px 0;
border-bottom: 1px solid #efefef;
.goods-name{
// 文本不换行
white-space: nowrap;
// 超出隐藏
overflow: hidden;
// 超出的用...表示
text-overflow: ellipsis;
}
}
}

17.搜索栏历史记录的小细节 去除冗余项

通过set函数来使里面的 新增加的历史搜索记录放在最前面 且不会冗余

const set=new Set(this.historuList)
//删除冗余的历史记录
set.delete(this.kw)
//将set对象转换为数组
this.historuList=Array.from(set)
//将新增加的数据添加到数组中
this.historuList.unshift(this.kw)

数据持久化本地  //应用于历史搜索啦那种

存入

uni.setStorageSync(
"kw",JSON.stringify(this.historuList)
)
uni . setStorageSync(
"kw" , JSON. stringify(this. historuList)
)

读取

this.historuList = JSON.parse(uni.getStorageSync("kw")||'[]')
this.historulist = JSON.parse(uni. getStorageSync("kw" )

1.view里面的内容 上下两边排列

display: flex;
flex - direction: column;
justify-content: space-arseund;
flex-direction: cotgdNe
// 将内容纵向排列
justify-content: space-arsound
//将内容两边对齐 上头下头对齐

20.使用过滤器给数字加上两位小数点


与data平齐 设置toFixed过滤函数

filters:{
tofixed( num){
return Number (num) . toFixed(2)
}
}

调用的时候巨简单

image.png


21.通过展开运算符进行数据的拼接image.png

image.png

获取更多数据的时候贼好使


22.下来获取更多数据


进行数据的拼接image.png


23函数形参 默认值的方法


这是方法一

巨好使 而且如果不赋值的话就是默认的定义这种情况 如果赋值参数的话 那么这个默认值就会改变

uni.$showMsg=function(title="数据加载失败!",duration=1500){
uni.showToast({
title,
duration,
icon:"none"
})
}

方法二

image.png


23.传递回调函数 并判断是否存在 如果存在就运行 不存在的话就过 最简单的方法


1.定义传参的函数

image.png

2.调用函数

image.png

关键语句贼好使


24.json数据的快速定义 es6语法

image.png 快速传参


25.图片预览 类似于淘宝拼多多那种预览形式


uni.previewImage({
//预览时显示第几张图片
current:i,
//预览时显示的图片数组
urls:this.goods_info.pics.map(x=>x.pics_big)
})

image.png


26.给图片去除间隙


html里面是直接给图片加display:block 属性

小程序可以用 rich-text nodes 渲染html标签的时候可以直接在标签属性里面加 style设置

replace 替换规则

replace(/

ios手机显示webp图片无法正常显示

需要将通过正则将webp改为ipg


29.解决文本闪烁问题 通常是没有数据 后加载数据造成的这种情况


给外面的view设置 v-if 属性 判断有没有这个数据 有的话显示 没有的话就隐藏

30.调用文件根目录

./当前光标位置

@/跟目录


30.vue find函数


image.png

返回的是查找对象

1.watch可以监听  computed 计算属性


32.find函数来增加代码可维护性


const findResult=this.options.find(x=>x.text==='购物车') 这样查找数据而不是直接从数组下标拿去 可以增加代码可维护性 防止以后添加属性 数据不好更改


33.watch数据监听器在页面刚加载的时候就调用一次的方法immdediate handler


image.png


34.设置tabBar数字角标


image.png

1.抽离为mixins

2.数据赋值错误不停地报 SyntaxError: Unexpected end of JSON input错误

这种情况肯定是赋值错误 数据类型不对!!!!

cart:JSON.parse(uni.getStorageSync('cart'))||[]  //这里写错了

当查找JSON.parse(uni.getStorageSync('cart'))不存在时 就选择赋值为[] 这样是错的 会赋值失败的

正确的用法是

cart: JSON.parse(uni.getStorageSync('cart') || '[]'),

image.png

image.png


37.无法保证变量是数字类型的解决方法


在变量前加一个加号+

image.png

或者是减零-0

image.png


38.filter函数的筛选骚操作

state.cart=state.cart.filter(x=>x.goods_id!==goods)

image.png

将不满足条件的都返回 直接一行代码解决


40.小程序api调用选择收货地址 chooseAddress()


image.png

async chooseAddress() {
// 1.调用小程序提供的chooseAddress() 方法,即可使用选择收货地址的功能
1/
返回值是一个数组,第1项为错误对象:第2项为成功之后的收货地址对象
const [err, succ] . await uni . chooseAddress().catch(err”err)
/12.用户成功的选择了收货地址
if (succ 8& succ . errmMsg === ' chooseAddress:ok') {
this,updateAddress(succ )
/1 3.用户没有提权
if (err && (err. errMsg .. ' chooseAddress:fail auth deny'II err . errMsg ' chooseAddress:fail authorize no response ')) 
this . reAuth()
}
async chooseAddress() {
  // 1. 调用小程序提供的 chooseAddress() 方法,即可使用选择收货地址的功能
  //    返回值是一个数组:第1项为错误对象;第2项为成功之后的收货地址对象
  const [err, succ] = await uni.chooseAddress().catch(err => err)
  // 2. 用户成功的选择了收货地址
  if (succ && succ.errMsg === 'chooseAddress:ok') {
    // 更新 vuex 中的收货地址
    this.updateAddress(succ)
  }
  // 3. 用户没有授权
  if (err && (err.errMsg === 'chooseAddress:fail auth deny' || err.errMsg === 'chooseAddress:fail authorize no response')) {
    this.reAuth()
  }

image.png

//调用此方法,重新发起收货地址的授权
async reAuth() {
// 3.1 提示用户对地址进行授权
const [err2, confirmResult] = await uni. showModal({
content: '检 测到您没打开地址权限,是否去设置打开? ',
confirmText: "确认”,
cancelText: "取消”,
})
// 3.2如果弹框异常,则直接退出
if (err2) return
// 3.3 如果用户点击了“取消”按钮,则提示用户“您取消了地址授权!”
if (confirmResult. cancel) return uni. $showMsg('您取消了地址授权! ')
// 3.4如果用户点击了“确认”按钮,则调用uni . openSetting() 方法进入授权页面,让用户重新进行授权
if (confirmResult . confirm) return uni . openSetting({
// 3.4.1 授权结束,需要对授权的结果做进一步判断
success: (settingResult) => {
// 3.4.2 地址授权的值等于true, 提示用户“授权成功”
if (sett ingResult. authSetting[ 'scope . address']) return uni. $showMsg( '授权成功!请选择地址') 
// 3.4.3 地址授权的值等于false, 提示用户“您取消了地址授权”
if (IsettingResult . authSetting[ ' scope . address']) return uni .$showMsg('您取消了地址授权! ')
})
)
// 调用此方法,重新发起收货地址的授权async reAuth() {
  // 3.1 提示用户对地址进行授权
  const [err2, confirmResult] = await uni.showModal({
    content: '检测到您没打开地址权限,是否去设置打开?',
    confirmText: "确认",
    cancelText: "取消",
  })
  // 3.2 如果弹框异常,则直接退出
  if (err2) return
  // 3.3 如果用户点击了 “取消” 按钮,则提示用户 “您取消了地址授权!”
  if (confirmResult.cancel) return uni.$showMsg('您取消了地址授权!')
  // 3.4 如果用户点击了 “确认” 按钮,则调用 uni.openSetting() 方法进入授权页面,让用户重新进行授权
  if (confirmResult.confirm) return uni.openSetting({
    // 3.4.1 授权结束,需要对授权的结果做进一步判断
    success: (settingResult) => {
      // 3.4.2 地址授权的值等于 true,提示用户 “授权成功”
      if (settingResult.authSetting['scope.address']) return uni.$showMsg('授权成功!请选择地址')
      // 3.4.3 地址授权的值等于 false,提示用户 “您取消了地址授权”
      if (!settingResult.authSetting['scope.address']) return uni.$showMsg('您取消了地址授权!')
    }
  })}

购物车的全选逻辑

Filter与reduce函数结合

筛选出符合条件的数据 然后用reduce进行统一操作


43 获取用户的头像和基本信息


image.png

image.png

async getUserProfile() {
const res = await uni . getUserProfile({desc: "登录"})
console . log(res[1])
if (res[1]=== undefined) return uni . $showMsg(”您取消了登录授权! ')
}
async getUserProfile() {
const res = await uni.getUserProfile({desc: "登录"})
console.log(res[1])
 if (res[1]=== undefined) return uni.$showMsg('您取消了登录授权!')
}


目录
相关文章
|
8月前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的优购电商小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的优购电商小程序的详细设计和实现
91 0
|
8月前
|
JavaScript Java 测试技术
基于小程序的优购电商小程序+springboot+vue.js附带文章和源代码说明文档ppt
基于小程序的优购电商小程序+springboot+vue.js附带文章和源代码说明文档ppt
45 0
|
小程序 API
【 uniapp - 黑马优购 | 首页】小程序首页全局配置(home、网络请求、轮播图、分类...)
【 uniapp - 黑马优购 | 首页】小程序首页全局配置(home、网络请求、轮播图、分类...)
207 0
|
小程序 Android开发 数据安全/隐私保护
【 uniapp - 黑马优购 | 发布】详讲如何发布一个小程序
【 uniapp - 黑马优购 | 发布】详讲如何发布一个小程序
139 0
|
2天前
|
移动开发 小程序 前端开发
超详细攻略!uniapp陪玩系统,打包陪玩小程序、H5需要注意什么?
陪玩系统的打包过程涵盖APP、小程序和H5平台。APP打包需使用uni-app开发工具,配置项目信息并选择云打包;小程序打包需在微信公众平台注册账号并提交审核;H5打包则直接通过uni-app生成文件并上传至服务器。各平台需注意权限配置、代码规范及充分测试,确保应用稳定性和兼容性。
|
2月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
43 0
在线课堂+工具组件小程序uniapp移动端源码
|
3月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
409 3
|
3月前
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
63 0
微信小程序更新提醒uniapp
|
5月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
123 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
5月前
|
小程序 前端开发 JavaScript
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序
【避坑宝】是一款企业黑红名单吐槽小程序,旨在帮助打工人群体辨别企业优劣。该平台采用SpringBoot+MybatisPlus+uniapp+uview2等技术栈构建,具备丰富的注释与简洁的代码结构,非常适合实战练习与学习。通过小程序搜索“避坑宝”即可体验。
130 0
【项目实战】SpringBoot+uniapp+uview2打造一个企业黑红名单吐槽小程序