2024年前端最全仿【得物】微信小程序实战全教程,前端大厂面试难度排行榜

ES6

  • 列举常用的ES6特性:

  • 箭头函数需要注意哪些地方?

  • let、const、var

  • 拓展:var方式定义的变量有什么样的bug?

  • Set数据结构

  • 拓展:数组去重的方法

  • 箭头函数this的指向。

  • 手写ES6 class继承。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

微信小程序

  • 简单描述一下微信小程序的相关文件类型?

  • 你是怎么封装微信小程序的数据请求?

  • 有哪些参数传值的方法?

  • 你使用过哪些方法,来提高微信小程序的应用速度?

  • 小程序和原生App哪个好?

  • 简述微信小程序原理?

  • 分析微信小程序的优劣势

  • 怎么解决小程序的异步请求问题?

其他知识点面试

  • webpack的原理

  • webpack的loader和plugin的区别?

  • 怎么使用webpack对项目进行优化?

  • 防抖、节流

  • 浏览器的缓存机制

  • 描述一下二叉树, 并说明二叉树的几种遍历方式?

  • 项目类问题

  • 笔试编程题:

最后

技术栈比较搭,基本用过的东西都是一模一样的。快手终面喜欢问智力题,校招也是终面问智力题,大家要准备一下一些经典智力题。如果排列组合、概率论这些基础忘了,建议回去补一下。

项目解构


以下是我主要实现的得物APP小程序界面

接下来对每个页面的细节进行解构。

购买首页


000.gif

购买首页样式

00.png

    

正品保障

{{}}

复制代码

商品项van-grid-item中采用绝对定位。tips中将direction属性设置为horizontal,可以让宫格的内容呈横向排列。搜索框设置disabled属性为禁用状态解决单击自动聚焦的问题。在使用van-grid布局时自定义每一项的属性需设置use-slot属性,否则不生效。

这个页面布局并不复杂,不过我在写这个布局时还是遇到了坑(感觉是自己跳进去的 我太???了)。在做dewu-hd吸顶时我是直接用van-sticky包起来实现,但是实际效果是tabs也需要固定在dewu-hd下面。这里不可以使用同上的方法,实际效果会使得整个van-tabs吸顶导致页面无法滑动。其实在这里只需要给van-tabs添加一个sticky属性并且设置offset-top,注意这两个属性需一起使用才能生效。

获取商品项

async onLoad() {

this.proData()   //获取推荐数据项

this.shoeData()  //获取鞋类数据项

},

proData() {

const {data} = await dewuCollection

.where({

amway: db.command.eq(‘TRUE’)

})

.field({          //获取指定数据项,提升性能

_id:true,

pic:true,

title:true,

buyer:true,

price:true

})

.get()

// console.log(data);

this.setData({

produces: data,

})

}

shoeData() {

let data1 = await dewuCollection

.where({

type: 1

})

.get()

// console.log(data1.data);

this.setData({

shoes: data1.data

})

}

复制代码

绑定详情页

gotoDetail(e) {

// console.log(e);

wx.navigateTo({

url: ‘/pages/buy_page/page/detail/detail?id=’+e.currentTarget.dataset.id,

})

},

复制代码

利用商品_id属性唯一,当设定数据项id等于_id时跳转到详情页且展示对应数据。

商品详情页


001.gif

商品详情页样式

03.png

{{img.digest}}

¥{{img.price}}

选择尺码

请选择尺码

立即购买

复制代码

整体分为detail_hddetail_bd两部分。自定义swiper需设置dot对应展示图片并更改样式,circular属性设置是否启用滑块切换动画,这里使用三目运算符判断是否添加新的样式类名。在定义商品价格的样式的时候可以通过first-letter伪元素来定义¥符号样式。引用组件van-goods-action使得购买按钮吸底。

05.png

{{item.price}}

请选择商品

已选 {{item.size}}

{{item.size}}

¥{{item.price}}

{{}}

复制代码

使用van-popup组件,给对应标签设置事件即可绑定弹出。例:<van-cell bind:click="showPopup"></van-cell>。三目运算符设置默认样式并且控制选中边框样式,设置closeable属性启用关闭按钮。square设置van-grid-item为方形,gutter设置格子间距。

06.png

相关推荐

复制代码

设置detail_produce-hd吸顶,给右侧关闭icon绑定bind:close="onClose"事件。

获取商品详情

async onLoad(options) {  //获取对应_id的商品数据

console.log(options);

let id = options.id

console.log(id);

wx.cloud.database().collection(‘dewu’)

.doc(id)

.get()

.then(res => {

console.log(res);

this.setData({

img :res.data

})

})

},

复制代码

弹出层

showPopup() {   //显示弹出层

this.setData({

show: true,

});

},

onClose() {     //关闭弹出层

this.setData({

show: false,

});

},

复制代码

选择尺码

pickSize(e) {

let flag = e.currentTarget.dataset.flag

let index = e.currentTarget.dataset.index

if(flag==index) {

this.setData({

activeSizeIndex: -1,

flag: -1

})

}

else {

this.setData({

activeSizeIndex: index,

flag: index

})

}

},

复制代码

点击尺码,flag==index即为选中状态,再次点击时或者点击其他尺码时设置为非选中状态,否则使flag等于index,使其变成选中状态。

搜索页


002.gif

搜索页样式

01.png

历史搜索

{{}}

复制代码

搜索页面主要分为头部搜索框和内容(搜索推荐,历史记录和搜索到的商品列表)两部分。这里用van-sticky包装搜索框使吸顶,内容部分则用block标签包装,利用wx:if这个控制属性来判断是否显示。

搜索记录

async onSearch(e) {

// console.log(e);

if (!e.detail.trim()) {

wx.showToast({

title: ‘请输入商品名’,

})

return

}

let {value, historyList} = this.data

if(historyList.indexOf(value) !== -1) {

historyList.splice(historyList.indexOf(value), 1)

}

historyList.unshift(value)

this.setData({

historyList

})

wx.setStorageSync(‘value’, historyList)

let keyword = e.detail.trim()

let results = await dewuCollection

.where({

title: db.RegExp({

regexp: keyword,

options: ‘i’

})

})

.get()

if (results.data.length == 0 || keyword == ‘’) {

wx.showToast({

title: ‘不存在’+keyword,

})

}

else {

await dewuCollection

.where({

title: db.RegExp({

regexp: keyword,

options: ‘i’

})

})

.orderBy(‘hot’, ‘desc’)

.get()

.then(res => {

console.log(res);

this.setData({

results: res.data

})

})

}

},

onLoad() {

this.getSearchHistory()  //获取历史搜索

},

getSearchHistory() {

let historyList = wx.getStorageSync(‘value’)

if(historyList) {

this.setData({

historyList

})

}

},

复制代码

页面加载时从本地storage中获取历史搜索记录,在确定搜索onSearch时判断value是否为空,将合法value插入historyList中,这里使用的时unshift方法,这样可以保证最近的搜索记录展示在前面,利用正则表达式模糊查询数据库中符合的项存入数组results中,当results.length > 0时显示商品列表。利用wx.setStorageSyncvalue存入缓存,wx.getStorageSync获取打印出来。通过indexOf方法判断value是否已经存在,是则删除historyList中的该项。

历史搜索

async historySearch(e) {

// console.log(e);

let historyList = this.data.historyList

let value = historyList[e.currentTarget.dataset.index]

this.setData({

value,               //修改value

showHotList: false,  //隐藏热门搜索

showHistory: false,  //隐藏历史搜索

results: []          //清空商品列表

})

},

复制代码

点击历史搜索项时setData使对应值改变,再调用onSearch方法。

清空控件

onClear() {

this.setData({

results: [],

value: ‘’,

showHotList: true,

showHistory: true

});

},

onChange(e) {  //search框输入改变时实时修改数据

// console.log(e.detail);

this.setData({

value: e.detail,

showHotList: false,

showHistory: false,

results: []

})

// console.log(this.data.showHotList);

if (this.data.value==‘’) {

this.setData({

showHotList: true,

showHistory: true

})

}

},

复制代码

清空搜索历史

deleteSearchHistory() {

wx.showModal({

content: ‘确认清空历史记录’,

success: (res) => {

if(res.confirm) {

this.setData({

historyList: []

})

}

}

})

wx.removeStorageSync(‘value’)

},

复制代码

点击删除icon弹出对话框wx.showModal实现交互,用户点击确定则清空historyList并利用wx.removeStorageSync将本地存储的历史记录删除。

品牌分类页


003.gif

分类页样式

07.png

{{}}

{{}}

{{}}

复制代码

分类页面主要是使用了scroll-view设置竖向滚动,点击左侧scroll-view-left-item时该项变为得物色(#00cbcc)并显示对应的品牌种类项kindsItem。整体采用flex布局,这里的坑是scroll-view-left应该把font-size设为0,在子元素scroll-view-left-item中设置font,避免块元素边距影响布局。

初始化品类

onLoad: function (options) {

this.setData({

kindNav: kindNav,

kindall: kindItem,

// console.log(this.data.kindall);

let kinds=[];

// console.log(this.data.kindall)

this.data.kindall.forEach(kind => { //循环从所有品类中获取对应kindNav的并存入数组中

if(kind.camptype == 0) {

kinds.push(kind)

}

})

this.setData({

kindItem: kinds,

})

}, )

},

复制代码

选择分类

changeKinds(e) {

console.log(e);

let {index, type} = e.currentTarget.dataset;

console.log(index, type);//index与推荐品牌的索引有关。type与kind.js的camptype有关

this.setData({

activeNavIndex: index,

})

let title=[]

this.data.kindTitles.forEach(kindTitle => {

if(index == kindTitle.titletype) {

title.push(kindTitle)

}

})

this.setData({

kindItem: kinds,

})

},

复制代码

绑定筛选页

gotoAssem(e) {

// console.log(e);  利用kind属性值唯一(buy页面tabs的title)

wx.navigateTo({

url: ‘/pages/buy_page/page/assem/assem?title=’+e.currentTarget.dataset.title,

})

},

复制代码

筛选排序页


004.gif

排序页样式

08.png

<view wx:for=“{{tabs}}” wx:key=“index” data-index=“{{index}}”

class=“tab-item {{activeTabIndex == index?‘active’: ‘’}}” bindtap=“changeItem”>

{{item.title}}

复制代码

tab使用flex布局。goods部分布局参照buy页面的商品布局。

011.png

{{}}

重置

确定

复制代码

这里使用van-collapse组件做折叠面板时有个坑,不应该将van-grid内容部分放在van-collapse-item中,应与其同级,否则会在该单元格下形成留白且无法正常显示内容,多次尝试后还是放在外面方便实现效果。

初始商品排序

async onLoad(options) {

// console.log(options);

let title = options.title

let data1 = await dewuCollection

.where({

kind: title        //绑定跳转时(kind唯一)获取对应数据

})

.get()

// console.log(data1);

this.setData({

goods: data1.data,

titles: title

})

},

复制代码

文末

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。

前端面试题汇总

JavaScript

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

性能

linux

前端资料汇总

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值