Что такое Векс?
справочный ответ
Vuex — это плагин управления состоянием, разработанный для приложений Vue.js. Он использует централизованное хранилище для управления состоянием всех компонентов приложения, и единственный способ изменить состояние — это зафиксировать мутации, например.this.$store.commit('SET_VIDEO_PAUSE', video_pause
,SET_VIDEO_PAUSE
для методов, определенных в свойстве мутаций
.
Какую проблему решает Vuex?
справочный ответ
решить две проблемы
- Когда несколько компонентов зависят от одного и того же состояния, будет очень громоздко передавать параметры многоуровневым вложенным компонентам, а передавать состояние между одноуровневыми компонентами будет бессильно.
- Поведение различных компонентов требует изменения одного и того же состояния. В прошлом несколько копий состояния изменялись и синхронизировались путем прямой ссылки на родительские и дочерние компоненты или посредством событий. Приведенные выше шаблоны очень хрупкие и часто приводят к невозможности сопровождения кода.
Когда использовать Vuex?
справочный ответ
Когда проект сталкивается со следующими двумя сценариями
- Когда несколько компонентов зависят от одного и того же состояния.
- Поведение различных компонентов требует изменения одного и того же состояния.
Как обратиться к Vuex?
справочный ответ
- Сначала установите зависимости
nnpm install vuex --save
- Создайте папку хранилища в каталоге проекта src
- Создайте новый файл index.js в папке магазина и напишите
import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); //不是在生产环境debug为true const debug = process.env.NODE_ENV !== 'production'; //创建Vuex实例对象 const store = new Vuex.Store({ strict:debug,//在不是生产环境下都开启严格模式 state:{ }, getters:{ }, mutations:{ }, actions:{ } }) export default store;
- Затем введите Vuex в файл main.js, напишите так
import Vue from 'vue'; import App from './App.vue'; import store from './store'; const vm = new Vue({ store:store, render: h => h(App) }).$mount('#app')
Каковы 5 основных свойств Vuex?
справочный ответ
Это состояние, геттеры, мутации, действия, модули.Где хранится состояние в Vuex и как его изменить?
справочный ответ
Сохраненный в состоянии, единственный способ изменить состояние в Vuex — это явно зафиксировать мутации.Когда состояние в Vuex — это объект, на что следует обращать внимание при его использовании?
справочный ответ
Поскольку объект является ссылочным типом, изменение свойств после копирования все равно повлияет на исходные данные, что изменит состояние в состоянии, что не разрешено, поэтому сначала используйте глубокое клонирование для копирования объекта, а затем модифицируйте его.Как пакетно использовать состояние Vuex в компонентах?
справочный ответ
Используйте вспомогательную функцию mapState, чтобы смешать состояние с вычисляемым объектом с помощью оператора расширения объекта.
import {mapState} from 'vuex'
export default{
computed:{
...mapState(['price','number'])
}
}
Как получить некоторое состояние из состояния в Vuex и использовать его в нескольких компонентах?
справочный ответ
Использование свойства getter, которое эквивалентно вычисляемому свойству в Vue, изменится только в том случае, если исходное состояние изменит производное состояние.Геттер принимает два параметра: первый — это состояние, а второй — геттеры (которые можно использовать для доступа к другим геттерам).
const store = new Vuex.Store({
state: {
price: 10,
number: 10,
discount: 0.7,
},
getters: {
total: state => {
return state.price * state.number
},
discountTotal: (state, getters) => {
return state.discount * getters.total
}
},
});
Затем в компоненте вы можете использовать вычисляемое свойство, вычисленное для передачиthis.$store.getters.total
Это способ доступа к этим производным переходам.
computed: {
total() {
return this.$store.getters.total
},
discountTotal() {
return this.$store.getters.discountTotal
}
}
Как получить состояние состояния через определенное условие в компоненте через геттер?
справочный ответ
Передача параметров геттеру достигается за счет того, что геттер возвращает функцию. Затем по параметрам оценивается состояние, соответствующее требованиям в состоянии.
const store = new Vuex.Store({
state: {
todos: [
{ id: 1, text: '...', done: true },
{ id: 2, text: '...', done: false }
]
},
getters: {
getTodoById: (state) => (id) =>{
return state.todos.find(todo => todo.id === id)
}
},
});
Затем в компоненте вы можете использовать вычисляемое свойство, вычисленное для передачиthis.$store.getters.getTodoById(2)
Это способ доступа к этим производным переходам.
computed: {
getTodoById() {
return this.$store.getters.getTodoById
},
}
mounted(){
console.log(this.getTodoById(2).done)//false
}
Как пакетно использовать свойства геттера Vuex в компонентах
справочный ответ
Используйте вспомогательную функцию mapGetters для смешивания геттеров с вычисляемыми объектами с помощью оператора распространения объекта.
import {mapGetters} from 'vuex'
export default{
computed:{
...mapGetters(['total','discountTotal'])
}
}
Как пакетно использовать псевдонимы и использовать свойства геттера Vuex в компонентах
справочный ответ
Используйте вспомогательную функцию mapGetters для смешивания геттеров с вычисляемыми объектами с помощью оператора распространения объекта.
import {mapGetters} from 'vuex'
export default{
computed:{
...mapGetters({
myTotal:'total',
myDiscountTotal:'discountTotal',
})
}
}
В состоянии Vuex есть номер состояния, представляющий количество товаров, и как его изменить в компоненте.
справочный ответ
Сначала зарегистрируйте мутацию в мутациях
const store = new Vuex.Store({
state: {
number: 10,
},
mutations: {
SET_NUMBER(state,data){
state.number=data;
}
},
});
использовать в компонентеthis.$store.commit
Отправить мутацию, изменить номер
this.$store.commit('SET_NUMBER',10)
На что обратить внимание при использовании мутации в Vuex.
справочный ответ
мутация должна быть синхронной функциейОтправка одной и той же мутации в компонент несколько раз делает его более удобным для написания и использования.
справочный ответ
Используйте вспомогательную функцию mapMutations, подобную этой, в компоненте
import { mapMutations } from 'vuex'
methods:{
...mapMutations({
setNumber:'SET_NUMBER',
})
}
тогда позвониthis.setNumber(10)
вполне зоветthis.$store.commit('SET_NUMBER',10)
В чем разница между действием и мутацией в Vuex?
справочный ответ
- Действия вызывают мутации, а не изменения состояния напрямую. Мутации могут напрямую изменять состояние.
- action может содержать произвольные асинхронные операции. Мутации могут быть только синхронными операциями.
- Метод подачи отличается, действие используется
this.$store.dispatch('ACTION_NAME',data)
представить. мутация используетсяthis.$store.commit('SET_NUMBER',10)
представить. - Параметры приема разные, первый параметр мутации — состояние, а первый параметр действия — контекст, который содержит
{ state, // 等同于 `store.state`,若在模块中则为局部状态 rootState, // 等同于 `store.state`,只存在于模块中 commit, // 等同于 `store.commit` dispatch, // 等同于 `store.dispatch` getters, // 等同于 `store.getters` rootGetters // 等同于 `store.getters`,只存在于模块中 }
В чем разница между действием и мутацией в Vuex?
справочный ответ
Второй параметр может принимать параметры, отправленные внешней отправкой.this.$store.dispatch('ACTION_NAME',data)
иthis.$store.commit('SET_NUMBER',10)
Отправка одного и того же действия в компоненте несколько раз более удобна для написания и использования.
справочный ответ
Используйте вспомогательную функцию mapActions, подобную этой, в компоненте
methods:{
...mapActions({
setNumber:'SET_NUMBER',
})
}
тогда позвониthis.setNumber(10)
вполне зоветthis.$store.dispatch('SET_NUMBER',10)
Действия в Vuex обычно асинхронны, так как же узнать, когда действие заканчивается?
справочный ответ
Возвратите Promise в функцию действия, а затем обработайте его с помощью then при отправке
actions:{
SET_NUMBER_A({commit},data){
return new Promise((resolve,reject) =>{
setTimeout(() =>{
commit('SET_NUMBER',10);
resolve();
},2000)
})
}
}
this.$store.dispatch('SET_NUMBER_A').then(() => {
// ...
})
В Vuex есть два действия, действие A и действие B, оба являются асинхронными операциями. Чтобы отправить действие A в действие B, другие операции должны быть обработаны после завершения обработки действия A. Как этого добиться?
справочный ответ
Используйте ES6async
иawait
реализовать.
actions:{
async actionA({commit}){
//...
},
async actionB({dispatch}){
await dispatch ('actionA')//等待actionA完成
// ...
}
}
Вы когда-нибудь использовали модуль Vuex, почему вы должны его использовать и как его использовать.
справочный ответ
Да, потому что с одним деревом состояний все состояния приложения будут объединены в один более крупный объект. Когда приложение становится очень сложным, объект хранилища может сильно раздуться. Итак, разделите магазин на модули. Каждый модуль имеет свое состояние, мутации, действия, геттеры и даже вложенные подмодули, которые разбиваются таким же образом сверху вниз.
Создайте файлы moduleA.js и moduleB.js в файле модуля. записать в файл
const state={
//...
}
const getters={
//...
}
const mutations={
//...
}
const actions={
//...
}
export default{
state,
getters,
mutations,
actions
}
Затем импортируйте модуль в index.js.
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
import moduleA from './module/moduleA'
import moduleB from './module/moduleB'
const store = new Vuex.Store({
modules:{
moduleA,
moduleB
}
})
export default store
В модуле первое состояние параметра, полученное геттерами и мутациями, является глобальным или модульным?
справочный ответ
Состояние первого параметра — это состояние модуля, то есть локальное состояние.Как в модуле геттеры, мутации и действия получают доступ к глобальному состоянию и геттерам?
справочный ответ
- В геттере доступ к глобальному состоянию можно получить через третий параметр rootState, а к глобальному геттеру можно получить доступ через четвертый параметр rootGetters.
- При мутации глобальный satat и геттер недоступны, доступ возможен только к локальному состоянию.
- В первом контексте параметра в действии
context.rootState
доступ к глобальному состоянию,context.rootGetters
Доступ к глобальному геттеру.
Как получить доступ к геттеру и состоянию в модуле Vuex в компоненте и как отправить мутацию и действие?
справочный ответ
- непосредственно через
this.$store.getters
иthis.$store.state
для доступа к геттерам и состоянию в модуле. - непосредственно через
this.$store.commit('mutationA',data)
Зафиксируйте мутацию в модуле. - непосредственно через
this.$store.dispatch('actionA,data')
Отправьте действие в модуле.
Использовали ли вы пространства имен для модулей Vuex? Зачем использовать, как использовать.
справочный ответ
По умолчанию действия, мутации и геттеры внутри модуля регистрируются в глобальном пространстве имен. Если имена действий и мутаций в нескольких модулях совпадают, то отправка мутаций и действий вызовет одни и те же мутации во всех модулях. , действие.
Это слишком сильно связано. Если вы хотите сделать свой модуль более инкапсулированным и пригодным для повторного использования, вы можете добавитьnamespaced: true
способ сделать его модулем с пространством имен.
export default{
namespaced: true,
state,
getters,
mutations,
actions
}
Как отправлять глобальные мутации и действия в модулях с пространством имен?
справочный ответ
Просто передайте { root: true } в качестве третьего параметра для отправки или фиксации.
this.$store.dispatch('actionA', null, { root: true })
this.$store.commit('mutationA', null, { root: true })
Как зарегистрировать глобальные действия в модулях с пространством имен?
справочный ответ
actions: {
actionA: {
root: true,
handler (context, data) { ... }
}
}
Как отправить мутацию A в модуль A с пространством имен в модулях?
справочный ответ
this.$store.commit('moduleA/mutationA',data)
Как использовать функции mapState, mapGetters, mapActions и mapMutations для привязки модулей с пространством имен?
справочный ответ
первое использованиеcreateNamespacedHelpers
Создайте вспомогательную функцию на основе пространства имен
import { createNamespacedHelpers } from 'vuex';
const { mapState, mapActions } = createNamespacedHelpers('moduleA');
export default {
computed: {
// 在 `module/moduleA` 中查找
...mapState({
a: state => state.a,
b: state => state.b
})
},
methods: {
// 在 `module/moduleA` 中查找
...mapActions([
'actionA',
'actionB'
])
}
}
Вы использовали плагин Vuex? Как кратко представить его?
справочный ответ
Плагин Vuex — это функция, единственным параметром которой является store. Представлен в плагинах опций конструктора Vuex.Store. Записать в файл store/plugin.js
export default function createPlugin(param){
return store =>{
//...
}
}
Затем напишите в файле store/index.js
import createPlugin from './plugin.js'
const myPlugin = createPlugin()
const store = new Vuex.Store({
// ...
plugins: [myPlugin]
})
Как отправить мутацию и действие в компоненте монитора в плагине Vuex?
справочный ответ
- Методы экземпляра Vuex.Store
subscribe
Отправить изменение в прослушивающем компоненте - Методы экземпляра Vuex.Store
subscribeAction
Отправить действие в компоненте прослушивателя Записать в файл store/plugin.js
export default function createPlugin(param) {
return store => {
store.subscribe((mutation, state) => {
console.log(mutation.type)//是那个mutation
console.log(mutation.payload)
console.log(state)
})
// store.subscribeAction((action, state) => {
// console.log(action.type)//是那个action
// console.log(action.payload)//提交action的参数
// })
store.subscribeAction({
before: (action, state) => {//提交action之前
console.log(`before action ${action.type}`)
},
after: (action, state) => {//提交action之后
console.log(`after action ${action.type}`)
}
})
}
}
Затем напишите в файле store/index.js
import createPlugin from './plugin.js'
const myPlugin = createPlugin()
const store = new Vuex.Store({
// ...
plugins: [myPlugin]
})
Как использовать значение состояния в Vuex на v-модели?
справочный ответ
Его необходимо преобразовать с помощью вычисляемых свойств.
<input v-model="message">
// ...
computed: {
message: {
get () {
return this.$store.state.message
},
set (value) {
this.$store.commit('updateMessage', value)
}
}
}
Что такое строгий режим Vuex, что он делает и как его включить?
справочный ответ
В строгом режиме ошибка будет выдаваться всякий раз, когда происходит изменение состояния, не вызванное функцией мутации. Это гарантирует, что все изменения состояния отслеживаются средствами отладки.Включите его в опции конструктора Vuex.Store, как показано ниже.
const store = new Vuex.Store({
strict:true,
})