Для интеграции Element Plus с приложением на Vue 3 и управлением состоянием через Vuex, необходимо обеспечить корректное подключение компонентов библиотеки и их реактивное взаимодействие с хранилищем.
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
const app = createApp(App);
app.use(store);
app.use(ElementPlus);
app.mount('#app');
Важно убедиться, что store и ElementPlus
зарегистрированы до монтирования приложения, иначе реактивность
компонентов к состоянию Vuex может не работать.
Element Plus предоставляет широкий спектр
компонентов для форм: ElInput, ElSelect,
ElSwitch, ElCheckbox, ElRadio.
Для их интеграции с Vuex используют двухстороннюю привязку через
v-model или события update:modelValue.
Пример интеграции ElInput с Vuex:
<template>
<el-form>
<el-form-item label="Имя пользователя">
<el-input
v-model="username"
placeholder="Введите имя"
></el-input>
</el-form-item>
</el-form>
</template>
<script>
import { computed } from 'vue';
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const username = computed({
get: () => store.state.user.name,
set: value => store.commit('user/setName', value)
});
return { username };
}
};
</script>
Ключевые моменты:
Компоненты ElSelect и ElOption позволяют
динамически отображать данные из хранилища:
<template>
<el-select v-model="selectedRole" placeholder="Выберите роль">
<el-option
v-for="role in roles"
:key="role.id"
:label="role.name"
:value="role.id"
></el-option>
</el-select>
</template>
<script>
import { computed } from 'vue';
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const roles = computed(() => store.state.user.roles);
const selectedRole = computed({
get: () => store.state.user.selectedRole,
set: value => store.commit('user/setSelectedRole', value)
});
return { roles, selectedRole };
}
};
</script>
Особенности:
v-for.Компонент ElButton часто используется для запуска
действий Vuex, таких как асинхронные операции:
<template>
<el-button type="primary" @click="saveUser">Сохранить</el-button>
</template>
<script>
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const saveUser = () => {
store.dispatch('user/saveUserData');
};
return { saveUser };
}
};
</script>
Рекомендации:
actions.mutations.Компонент ElTable позволяет напрямую отображать данные
из хранилища:
<template>
<el-table :data="users" style="width: 100%">
<el-table-column prop="id" label="ID" width="80"></el-table-column>
<el-table-column prop="name" label="Имя"></el-table-column>
<el-table-column prop="email" label="Email"></el-table-column>
</el-table>
</template>
<script>
import { computed } from 'vue';
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const users = computed(() => store.state.user.list);
return { users };
}
};
</script>
Особенности:
list Vuex автоматически
обновляют таблицу.Компонент ElDialog удобно управлять через Vuex, чтобы
централизовать состояние видимости:
<template>
<el-dialog
title="Редактирование пользователя"
:visible.sync="isDialogVisible"
>
<p>Форма редактирования</p>
</el-dialog>
</template>
<script>
import { computed } from 'vue';
import { useStore } from 'vuex';
export default {
setup() {
const store = useStore();
const isDialogVisible = computed({
get: () => store.state.ui.isUserDialogVisible,
set: value => store.commit('ui/setUserDialogVisible', value)
});
return { isDialogVisible };
}
};
</script>
Ключевые моменты:
:visible.sync совместно с Vuex позволяет
контролировать открытие и закрытие диалогов в разных компонентах.Компоненты ElMessage и ElNotification
удобно использовать через Vuex actions:
// store/ui.js
actions: {
notifySuccess({ commit }, message) {
commit('showNotification', { type: 'success', message });
}
}
// компонент
import { ElNotification } from 'element-plus';
import { useStore } from 'vuex';
const store = useStore();
const notify = () => {
store.dispatch('ui/notifySuccess', 'Данные успешно сохранены');
};
Особенности:
Dialog, Loading,
Notifications) создавать отдельный модуль Vuex, чтобы не
смешивать данные и визуальное состояние.Такая архитектура обеспечивает полную реактивность, предсказуемость и масштабируемость при использовании Element Plus в больших Vue-приложениях.