1. Дисплей проекта:
Примечание. Если вы не видите динамическое изображение в формате gif, нажмитегитхаб мейтуан проектВы можете посмотреть его в mt-app/src/assets/Meituan.gif!
Этот проект очень подходит для начинающих Vue.Если вы не понимаете бизнес-логику, вы можете обсудить это вместе!
Адрес источника:mt-app, добро пожаловать в звездочку и форк
Если это вам немного поможет, ставьте лайк и подписывайтесь на меня.
2. В проекте задействован стек технологий:
- Сегмент семейства Vue: Vue, Vue-router, Vue-cli и т. д.
- Компоненция: один файл Vue
- Модульный: Модуль ES6
- Сторонние модули: аксиомы с лучшей прокруткой и т. д.
- Базовая среда разработки и управление пакетами: Node, npm
- Инструмент сборки: веб-пакет
- Редактор: webstorm
3. Основные функции проекта
Одним словом: мобильное конечное приложение для еды, которое объединяет заказы, отзывы пользователей и бизнес-информацию.
- страница заказа После нажатия на товар он автоматически добавляется в корзину, и рассчитывается общая стоимость.Вы можете увеличивать или уменьшать число по желанию в списке товаров, списке корзины покупок и на странице сведений о товаре.Когда плагин прокрутки перемещает товар список, соответствующая категория продукта также будет прыгать.
- Страница отзывов пользователей Он в основном включает колонку TAB, включающую три части: все, с картинками и три модуля оценки.
- страница деловой информации В основном он представляет некоторую базовую бизнес-информацию.Вы можете перемещать изображение влево и вправо с помощью плагина для лучшей прокрутки.
4. Трудности проекта
Бизнес-логика этого проекта в основном сосредоточена в модуле заказа, и сложность в модуле заказа заключается в том, как реализовать скольжение списка продуктов и как связать классификацию продуктов справа и список продуктов слева?
Прежде всего, для реализации прокрутки списка товаров необходимо использовать плагин Better-Scroll, который фокусируется на решении потребностей различных сценариев прокрутки на мобильном терминале (ПК уже поддерживается).
- Установить лучшую прокрутку
npm install better-scroll --save
- Представлен скриптом в файле Good.vue
import BScroll from 'better-scroll'
После того, как эти приготовления выполнены, можно реализовать связь списка слева и справа.Подводя итог, можно выделить следующие четыре шага:1. Рассчитать высоту интервала товарной классификации
//template部分
<!--商品列表-->
<div class="foods-wrapper" ref="foodScroll">
<ul>
<!--专场-->
<li class="container-list food-list-hook">
<div v-for="(item,index) in container.operation_source_list" :key="index">
<img :src="item.pic_url">
</div>
</li>
<!-- 具体分类 -->
<li v-for="(item,index) in goods" :key="index" class="food-list food-list-hook">
<h3 class="title">{{item.name}}</h3>
<!-- 具体的商品列表 -->
<ul>
<li v-for="(food,index) in item.spus" :key="index" @click="showDetail(food)" class="food-item">
......
//JS部分
methods:{
calculateHeight() { // 计算分类的区间总高度(包括专场和所有具体分类的总高)
let foodlist = this.$refs.foodScroll.getElementsByClassName("food-list-hook")
let height = 0
this.listHeight.push(height)
for (let i = 0; i < foodlist.length; i++) {
let item = foodlist[i]
height += item.clientHeight // 累加
this.listHeight.push(height)
}
console.log(this.listHeight)//[0, 43, 1231, 2401, 3589, 4451, 6121, 7656, 8497, 9344, 10080]
},
initScroll() {
this.menuScroll = new BScroll(this.$refs.menuScroll, { //实例化
click: true //点击事件才能生效
})
this.foodScroll = new BScroll(this.$refs.foodScroll, {
probeType: 3,
click: true
})
},
created() {
fetch("/api/goods")
.then(res => res.json())
.then(response => {
if (response.code == 0) {
this.container = response.data.container_operation_source
this.goods = response.data.food_spu_tags
this.poiInfo = response.data.poi_info
this.$nextTick(() => { //在created中数据虽已初始化,但dom未生成,页面还没显示,要使用回调函数,确保DOM已经更新
this.initScroll() // 执行滚动方法
this.calculateHeight() //调用计算分类区间高度的方法
})
}
})
}
2. Следите за положением прокрутки
initScroll() {
this.menuScroll = new BScroll(this.$refs.menuScroll)
this.foodScroll = new BScroll(this.$refs.foodScroll, {
probeType: 3,//在屏幕滑动的过程中实时派发 scroll 事件
click:true//点击事件才能生效
})
//foodScroll监听事件
this.foodScroll.on("scroll", (pos) => {
this.scrollY = Math.abs(pos.y)
console.log(this.scrollY)
})
}
3. Подтвердите нижний индекс в соответствии с положением прокрутки, соответствующим левому
computed:{
currentIndex(){
for(let i = 0; i < this.listHeight.length; i++){
let height1 = this.listHeight[i]
let height2 = this.listHeight[i+1] // 获取商品区间的范围
if(!height2 || (this.scrollY >= height1 && this.scrollY < height2)){
return i; // 是否在上述区间中
}
}
return 0
}
<li class="menu-item"
:class="{'current':currentIndex === 0}"//动态绑定一个样式,.current设置样式
@click="selectMenu(0)">
<p class="text">
<img class="icon" :src="container.tag_icon" v-if="container.tag_icon">
{{container.tag_name}}
</p>
</li>
<li class="menu-item"
:class="{'current':currentIndex === index + 1}"
v-for="(item,index) in goods" :key="index"
@click="selectMenu(index+1)"
>
4. Щелкните слева и прокрутите вправо, подписавшись
<li class="menu-item" :class="{'current':currentIndex===0}" @click="selectMenu(0)">
<li class="menu-item" :class="{'current':currentIndex===index+1}"
v-for="(item,index) in goods" :key="index" @click="selectMenu(index+1)">//同一个函数传值不一样
selectMenu(index) {
let foodlist = this.$refs.foodScroll.getElementsByClassName("food-list-hook")
let element = foodlist[index]
this.foodScroll.scrollToElement(element, 250)
}
V. Резюме проекта
- Разделение данных vue и представления, представление, управляемое данными, забота только об изменениях данных, операции DOM инкапсулированы, что значительно повышает эффективность фактического процесса разработки.
- Функция компонентизации Vue может быть описана как одна из ее основных особенностей.Помещая код html, CSS и JS компонента на странице в файл .vue для управления, можно значительно улучшить удобство сопровождения кода.
- В проекте нет адаптации для мобильных терминалов, и он может открываться на мобильных телефонах с разными экранами, а пользовательский опыт может быть плохим.