Если вы напишете в своем резюме о реализации «системы электронной коммерции XX», ваша первая мысль состоит в том, что этот человек, должно быть, прошел курс обучения. А наш курс «управление проектами» — это просто небольшой веб-сайт электронной коммерции. Время разработки составляет около месяца, включая сторону покупателя, продавца и администратора.Хотя бизнес-логика относительно обычная, от этой разработки все же есть выгода.Самая важная выгода в том, чтоПолучил реальную практику и осведомленность о Vuex.Поэтому большая часть этой статьи знакомит с практикой использования Vuex в этом проекте и ямами, на которые он наступил, а другая часть является кратким изложением некоторых других моментов в проекте.
Раздутые компоненты Vue прошлого
В предыдущих нескольких разработках проекта, после получения внутреннего интерфейса и требований, функции будут реализованы следующим образом:
- Разделите компоненты и страницы и постарайтесь обеспечить возможность повторного использования некоторых компонентов.
- Абстрагируйте некоторый многократно используемый код SCSS и разработайте классы общего стиля.
- Настройте и инкапсулируйте слой базовых методов на основе библиотеки HTTP (например, axios) и напишите определенные функции API на основе этого метода.
- Вызовите вышеуказанные инкапсулированные методы на страницах и компонентах, в обратных вызовах функций или
Promise
изthen
метод для обновления данных или выполнения дополнительной бизнес-обработки.
Вроде нет проблем, да?
Шаги 1, 2 и 3 практически не вызывают проблем, проблема заключается в шаге 4. В результате файл Vue становится все больше и больше, а сложный файл vue страницы будет содержать следующее содержимое:
-
data
В файле большое количество полей данных.控制是否展示元素的
,渲染用数据
,用于"上锁"的变量
Ждать. - существует
created
илиmounted
содержит много请求
а также回调处理
. - существует
template
В свойствах используемых компонентов связывается большое количествоprops
.
Конечный результат заключается в том, что Vue-файл становится раздутым.
Чем длиннее файл, тем труднее его читать и тем труднее его поддерживать.
Никому не нравится видеть сложный файл кода, содержащий логическую обработку, обработку интерфейса и обработку данных.
Поэтому для решения вышеперечисленных задач введемVuex
очень нужно.
На самом деле, я использовал Vuex раньше, но цель его использования — просто
“保存一点数据能够全局使用”
Просто вообще не используетсяAction
,Getters
,Mutations
Ждать. Эта статья не будет слишком много рассказывать о принципах и преимуществах Vuex, в основном фокусируясь на практике и опыте, пожалуйста, перейдите к вводу или вводу Vuex.официальная документация.
Чистый, несвязанный и четко определенный
Что сделал автор, так это поместил запросы данных и обновления вVuex
в, пустьVuex
стать целым проектом“数据集散中心”
,а такжеvue
компонент, просто сделайте事件调度(dispatch)
а также绑定来自Vuex的数据
.
простой пример
В качестве примера возьмем страницу сведений о продукте, которая включает в себя следующие функции:
- Первая страница входа запрашивает данные о продукте в соответствии с идентификатором в параметре URL.
- Обновите инвентарь и цену на основе выбора атрибута предмета.
- Добавьте в корзину и обновите маленькую красную точку.
- разместить заказ.
- Любимый продукт.
как показано на рисунке:
Если бы мы не использовали Vuex, код мог бы иметь следующую структуру:
<template>
<template>
<script>
export default {
data() {
detail: {
name: '',
shopId: '',
id: '',
pic: '',
description: '',
price: '',
updateTime: '',
categoryId: '',
stock: 0,
createTime: '',
attributeList: {},
collectId: 0,
},
// 一大堆商品的字段数据 【MARK】
},
created(){
this.$http.get('/product/:id')
.then()
// 以及一端更新其他数据的请求 【MARK】
},
methods(){
clickCart(){
this.$http.get('xxx')
.then('xxx')
this.$emit('xxx'); // 与上层组件通信更新购物车的红点
}
// 一堆用户事件的触发方法,每个方法内都是一堆http请求和回调处理 【MARK】
},
computed:{
// 一些基于商品数据判断状态的数据 【MARK】
}
}
</script>
<style>
<!-- 忽略相关样式代码-->
<style>
Если вы пишете, как описано выше способом, хотя вы можете гарантировать обработку логики на этой странице сохраняется в этом документе Vue, но стало очень раздутым, если последующие действия, чтобы добавить больше функций или изменено, это может быть больше необходимости читать код много.
Итак, в приведенном выше примере кода【MARK】
Отмеченная часть будетVuex
можно оптимизировать.
Окончательный код показан ниже:
Читабельность кода значительно улучшилась:
- Я не вижу никаких http-запросов в этом файле, и также не вижу путей запросов. (Путь запроса, как правило, статичен, и запись пути HTTP-запроса напрямую эквивалентна записи источника мертвых данных, что очень недружественно для последующих изменений в источнике данных)
-
data
не содержит полей бизнес-данных, сохраняя только те поля, которые управляют страницей -
Структура кода стала проще,Только
【触发事件】-【回调】
Такая простая логика.
Весь код для обработки данных инкапсулирован вVuex
на:
На уровне Vuex мы не только запрашиваем данные, но и оцениваем возвращаемые данные и различные логические обработки, а также устанавливаемGetters
Разрешить создание страниц на основеGetters
Предоставленные данные делают различные二元判断
.
Слой Vuex дает следующие преимущества:
-
То же самое может быть вызвано на разных страницах
Actions
, для этого примера мне нужно написать его только один раз加入购物车
Функцию можно использовать на каждой странице. -
Действия можно использовать в комбинации, благодаря комбинации мы можем легче реализовать сложную бизнес-логику, такую как
添加商品进购物车的同时更新商品数据并更新购物车数据
, это нужно написать три разаHTTP
Для требуемой бизнес-логики вам нужно всего лишь объединить три действия, и эти действия также можно использовать по отдельности в других местах. - интуитивно понятный, с первого взгляда можно узнать, какие действия есть над моделью продукта, новичку удобнее быть знакомым с бизнес-логикой, а разработчикам также удобно проверять, хорошо ли продуман их код или функции. (Кстати, очень сложно найти логику в куче HTML)
-
Уменьшить количество коммуникаций между компонентами, централизованный
数据仓库
Преимущество в том, что это уменьшает операцию передачи данных между слоями.Согласно предыдущим привычкам кодирования, я буду использовать его много.$emit
а такжеprops
Чтобы обеспечить связь между компонентами родитель-потомок или одноуровневый, и теперь вам нужно только инициировать соответствующее событие в компоненте для привязки соответствующих данных.
Новый опыт делового письма
Интуитивно понятный опыт, тщательное использованиеVuex
После этого идеи кода ясны, потому что одна из реализованных фич — 2~3 дня, а Vuex —“间断性编程”
Очень полезно, возможность быстро отслеживать ход последней разработки.
После использования Vuex он разрабатывается в соответствии со следующими шагами:
(Шаги 1, 2 и 3 остаются без изменений, как указано выше)
4. Создайте модель Vuex Store и определите необходимые методы.
5. Напишите компоненты и привяжите связанные данные и методы к Vuex.
6. Напишите триггерdispatch
обратный звонок после.
Автор считает, что существует несколько важных принципов использования Vuex.
использоватьVuex
Есть определенные спецификации, такие как表单处理
,测试
,项目结构
Следующие принципы являются лишь частью опыта автора, который может быть неправильным.
[Не обрабатывать переходы на страницы]: страница переходитdispatch
обрабатывается в обратном вызове.
Изначально мой дизайн былAction
После запроса данных он также несет ответственность за все跳转逻辑
а также弹窗逻辑
однако это делает视图层
а также数据层
Сцепление делает меня абстрактнымAction
Возможность повторного использования становится крайне плохой, и в то жеvue
Это относительно нормальная логика записи, чтобы увидеть обработку слоя представления в файле.
【Принцип единой ответственности】:mutation
а такжеaction
Попробуйте продолжать делать только одну вещь.
Как упоминалось в предыдущем принципе для улучшенияaction
возможность повторного использования, то необходимо обеспечить, чтобы многоразовыеaction
просто выполните функцию, например更新A数据
а также更新B数据
Не сливайте сразу в одинaction
, но определите дваaction
,а такжекомбинируяреализовать более сложную функцию, напримерсокращенный набор инструкцийподумал о.
Такие как:
actions:{
updateA(){}, // A 可能在其他地方被单独使用
updateB(){}, // B 可能在其他地方被单独使用
updateAandB({dispatch}){
dispatch("updateA");
dispatch("updateB");
}, // 同时触发 A B 的复杂action
}
[Использование Promise и AA] (Async & Await)
чтобыdispatch
функция имеетPromise风格
Возможность обработки обратных вызовов позволяетaction
возвращаемое значение какPromise
объекты, такие как:
// store.js
actions:{
updateA(){
return Promise.resolve()
}
}
можно использовать внутри компонента.then
:
...
created(){
this.$store.dispatch('updateA')
.then(() => {
...
})
}
...
а такжеVuex
Обычно рекомендуется вactions
Асинхронная операция, поэтому, чтобы сделать код более элегантным, вы можете использоватьAA
Пишите следующим образом:
// store.js
actions:{
async updateA(){
const result = await ajax('/**/**');
if(result){
return Promise.resolve()
}
}
}
Итак, код на практике выглядит следующим образом:
[Использовать пространство имен] для вашего же блага.
Как правило, при использовании vuex состояние будет разделено в соответствии с сущностью или страницей для формирования модуля, модуль содержит все необходимыеactions,states,mutation
Ждать. В электронной коммерции, как правило,商品
,订单
,用户
Эти сущности могут быть разделены на модули после разделения, как показано на рисунке:
Преимущество разделения в том, что оно более самостоятельное и интуитивно понятное, недостаток в том, что если не использоватьПространства имен,может привести кactions
,mutations
конфликт,в самый разVuex
так же доступноnamespace
Конфигурация,Ссылаться наофициальная документацияВот и все.
Недостаточное использование на этот раз
пространство имен не используется
Хотя мы заключили в принципе, но на этот раз не использовалиnamespace
, что на этот раз является большой проблемой.Решением является «ручное пространство имен», как показано на рисунке:
Будуactions
Префикс имени метода плюс имя объекта используются для различения разных методов, что на самом деле является относительно плохим методом.
Некоторые коды до сих пор пишутся неоднократно
Такая ситуация возникает в коде после получения асинхронных данных, как правило, следующий код будет повторяться много раз:
if (result.code){
return Promise.resolve(data);
}
return Promise.reject(msg);
Хоть это и не слишком много, но эта логика все же имеет возможность абстрагироваться.В следующий раз я планируюRootState
добавитьaction
, который используется для обработки данных, возвращаемых таким бэкэндом, и ожидаемый результат выглядит следующим образом:
actions: {
parseResult({}, result){
if (result.code){
return Promise.resolve(data);
}
return Promise.reject(msg);
},
async getA({dispatch}){
const result = await http.get('xx/xx');
return dispatch('parseResult', result); // One line , it's clean
}
}
другой урожай
Используйте Vue CLI 3
3.0 в основном делается в конфигурации极简化
. давно нет развитияVue
проект, помните предыдущийVue
В проекте еще многоxxx.congfig.js
, а теперь, в основном интегрированный в CLI, черезvue.config.js
Он может удовлетворить большинство потребностей в области развития. Конфигурация этого проекта выглядит следующим образом:
Это более интуитивно понятно, чем предыдущая конфигурация, см.:cli.vuejs.org/zh/, Что касается механизма плагинов, то он в данной разработке не используется, но может использоваться при установке сторонних пакетовvue add
Теперь есть графический интерфейс, чтобы увидеть, какие плагины установлены.
БудуVue.use 和 Vue.install
где используетсяplugins
Под содержанием
Этот проект представляет собой многостраничное приложение с 3 экземплярами Vue, поэтому я надеюсь, что при необходимости смогу внедрить желаемые сторонние зависимости, такие какaxios
,qrcode
,lazyload
Некоторые библиотеки инструментов или сторонние компоненты. Итак, подводится итогplugins
каталог, как показано ниже:
Преимущество этой инкапсуляции в том, что я могу импортировать сторонние зависимости по запросу для каждого экземпляра Vue, всего одной строкой импорта, как показано ниже:
Начните думать об оптимизации
Большое веб-приложение не должно превышать 500 КБ после упакованного и сжатого, поэтому используйте это какBenchmark
оптимизировать упакованный размер проекта,按需引入
сторонние зависимости (особенноElement
а такжеlodash
) значительно уменьшает размер проекта. Но самое главное научиться пользоватьсяwebpack analyse tool
анализировать.
В заключение
Короче говоря, этот проект в основном предназначен для обновленияVuex
познание, которое позволяет нам писатьvue
Компоненты более удобочитаемы и ремонтопригодны. В то же время это также может сделать повторное использование кода блока обновления данных более многоразовым. пройти черезVuex
построить中心化的数据集散中心
Это также может сделать развитие идей более плавным и достойным изучения.
Ссылаться на: