"Это 24-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления"
Прежде чем читать, я надеюсь, что у вас есть базовые знания о vuex и некоторый опыт работы с проектами.
В последний год или около того я работал над проектом онлайн-редактирования видео, который основан на vue2.x. Самая сложная страница в проекте — это страница редактирования, которая выглядит так (найдите похожий интерфейс):
Видно, что интерфейс относительно сложный, с десятками крупных и мелких компонентов.Если библиотека управления состоянием не используется, использовать взаимодействие родительско-дочерних компонентов сложнее, поэтому в качестве управления состоянием окончательно выбран vuex. библиотека.
Так как же будет организован код vuex для такого сложного проекта? Вот мой рекомендуемый метод:
Во-первых, в проекте будет много модулей (или страниц), мое предложение:Разделить магазин по модулям бизнес-логики, одному бизнес-модулю соответствуетmodule
Здесь следует отметить следующее:
- Не помещайте все бизнес-модули в один магазин, чтобы его было непросто поддерживать после повышения статуса проекта.
- Бизнес-модуль не должен соответствовать нескольким модулям vuex, даже если он сложный.
Совершить ошибку (можно пропустить)
Я наступил на эти две ямы.Когда я только начал работать над проектом, проект был относительно небольшим и очень простым, и страница редактирования была не такой сложной, как сейчас. должны быть сохранены информация о пользователе и страница редактирования.Статус, не так много, я просто собрал его. Код такой, все состояния в магазине
export const store = new Vuex.Store({
state: {
userInfo:{
id:'',
token:'',
phone:''
},
materials:[],
audio:[],
task:[]
},
mutations: {},
modules: {},
})
После этого код какое-то время работает стабильно. Позже в продукт были добавлены функции, поддерживающие несколько видеосцен, поддерживающие фоны, поддерживающие фильтры, регулировку разрешения, анимацию материалов и другие беспорядочные функции.Есть еще много состояний, которые необходимо сохранить.Соедините их все вместе, и файл хранилища будет слишком Он вырос до более чем тысячи строк. В этом случае я чувствовал, что состояние и файл хранилища будет становиться все сложнее поддерживать, поэтому я провел рефакторинг кода, а затем совершил вторую ошибку:
Я разделил статус страницы редактирования на несколько модулей, что выглядит так
const user={
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
}
const material = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... },
getters: { ... }
}
const audio = {
state: () => ({ ... }),
mutations: { ... },
actions: { ... }
}
//...其他模块
const store = new Vuex.Store({
modules: {
user:user,
material: material,
audio: audio,
//其他模块
}
})
Проблема в том, что код слишком разбросан, и одна моя страница редактирования соответствует нескольким модулям, он слишком разбросан, поддерживать его непросто, и он недостаточно модульный.
окончательный план результата
Окончательное решение:Отдельный бизнес-модуль соответствует модулю магазина
Бизнес-модули, задействованные в моем проекте: пользовательский модуль, модуль редактирования, модуль управления, модуль инструментария, если у каждого модуля есть состояние, которое необходимо сохранить, у вас может быть 4 модуля.
const store = new Vuex.Store({
modules: {
user,
edit,
manage,
toolkit
}
})
Каждый модуль соответствует файлу или папке, а некоторые модули имеют относительно простое состояние, например пользователь, создать новыйuser.js
Состояние файлового хранилища достаточно.Для сложных модулей, типа редактирования, нужно создать папку.
Каталог выглядит следующим образом:
vuex-demo/store
├── index.js
└── module
├── edit
│ ├── audio.js
│ ├── component.js
│ ├── edit-mutations.js
│ ├── edit.js
│ └── material.js
└── user.js
Сделайте его папкой (вместо файла), чтобы не писать все состояние вedit.js
В предотвращении файла слишком велик. Edit.js Используйте в расширении алгоритмов и сделали дополнительный модульный код, код выглядит следующим образом:
edit.js
код показывает, как показано ниже:
import { audio } from './audio'
import {material} from './material'
export const edit = {
state: () => ({
...audio.state,
...material.state
}),
getters: {
...audio.getters,
...material.getters
},
mutations: {
...audio.mutation,
...material.mutation
},
actions: {
...audio.actions,
...material.actions
},
}
Вот так просто.
Столько сказано, большая часть ерунда, полезного кода всего десяток строчек, код здесьпортал
Рекомендация плагина vuex persistence
Данные, которые у нас есть в vuex, особенно пользовательские данные, исчезают, как только страница обновляется, что отличается от наших ожиданий.Многие люди (особенно молодые люди) думают, что библиотека управления состоянием может быть сохранена, то есть я обновляю страница.Также до сих пор.
Причина, по которой я так думаю, заключается в том, что я недостаточно знаю сущность vuex Сущность vuex — это большой объект JS, который хранится в памяти, подобный следующему
let store={state:{},getter:{}}
new Vue({ store: store})
Как только вы обновите страницу, данные в памяти должны быть очищены, поэтому исчезновение данных в магазине — это нормально. Если вы хотите сохранить, вы можете выбрать vuex и localStorage или sessionStorage или файлы cookie. тебе следует
- При отправке мутации одновременно сохраните ее в локальном хранилище (обратите внимание, что если это объект, требуется JSON.stringify)
- При обновлении страницы (в созданном методе в App.vue) получите информацию о пользователе из локального хранилища и отправьте мутацию, если она есть.
export const user = {
state: () => ({
info:{}
}),
getters: {},
mutation: {
setUser(state,info){//1. 提交Mutation时,同时存到本地储存中
localStorage.setItem('user',JSON.stringify(info))
state.info=info
}
},
actions: {},
}
created() {
const userInfo=localStorage.getItem('user')
if(userInfo){
// 提交Mutation,更新用户信息
}
}
Таким образом, если у вас есть одни данные, вы сохраните их один раз, если у вас есть два данных, вы сохраните их дважды, а если у вас есть n данных, вы сохраните их n раз Это слишком утомительно, поэтому я рекомендую плагин. Он автоматически сохраняется при отправке мутации и автоматически обновляется при обновлении страницы, что очень удобно. Я больше не буду писать демо, я устал.
Адрес плагинаvuex-persistedstate
Эта статья, наконец, закончена. Я не знаю, что написать завтра. Я надеюсь, что каждый может дать несколько предложений и оставить сообщение в области комментариев.
🐢.