В Element Plus, как и в любом современном фреймворке на основе Vue 3, локальное состояние компонентов играет ключевую роль для создания интерактивного и реактивного интерфейса. Локальное состояние — это данные, которые живут внутри компонента и напрямую влияют на его поведение и визуальное отображение.
В Vue 3 для создания локального состояния компонента используется Composition API:
import { ref, reactive, computed } from 'vue';
export default {
setup() {
const count = ref(0); // примитивное состояние
const form = reactive({
username: '',
password: ''
}); // объект состояния
const isValid = computed(() => form.username.length > 0 && form.password.length > 0);
function increment() {
count.value++;
}
return {
count,
form,
isValid,
increment
};
}
};
В Element Plus часто используется именно такой подход для управления формами, таблицами и другими интерактивными элементами.
Компоненты формы в Element Plus, такие как
<el-form> и <el-form-item>,
активно используют локальное состояние для управления валидацией и
пользовательским вводом.
<template>
<el-form :model="form" :rules="rules" ref="loginForm">
<el-form-item label="Username" prop="username">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="Password" prop="password">
<el-input type="password" v-model="form.password"></el-input>
</el-form-item>
<el-button type="primary" @click="submitForm">Login</el-button>
</el-form>
</template>
<script>
import { reactive, ref } from 'vue';
export default {
setup() {
const form = reactive({
username: '',
password: ''
});
const rules = {
username: [{ required: true, message: 'Введите имя пользователя', trigger: 'blur' }],
password: [{ required: true, message: 'Введите пароль', trigger: 'blur' }]
};
const loginForm = ref(null);
function submitForm() {
loginForm.value.validate(valid => {
if (valid) {
console.log('Форма валидна:', form);
} else {
console.log('Ошибка валидации');
}
});
}
return {
form,
rules,
loginForm,
submitForm
};
}
};
</script>
Особенности локального состояния форм:
v-model обеспечивает двухстороннюю связь между полем
ввода и локальным состоянием.ref позволяет получить доступ к методам компонента
<el-form>, таким как validate() и
resetFields().Компонент <el-table> часто использует локальные
массивы данных для управления строками, фильтрацией и пагинацией:
<template>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="name" label="Name" width="180"></el-table-column>
<el-table-column prop="age" label="Age" width="100"></el-table-column>
<el-table-column prop="address" label="Address"></el-table-column>
</el-table>
</template>
<script>
import { reactive } from 'vue';
export default {
setup() {
const tableData = reactive([
{ name: 'John', age: 28, address: 'New York' },
{ name: 'Jane', age: 32, address: 'London' },
{ name: 'Tom', age: 25, address: 'Paris' }
]);
return {
tableData
};
}
};
</script>
Компоненты <el-dialog> и
<el-drawer> используют локальное состояние для
управления видимостью:
<template>
<el-button @click="dialogVisible = true">Open Dialog</el-button>
<el-dialog v-model="dialogVisible" title="Demo Dialog">
<p>Содержимое диалога</p>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">Закрыть</el-button>
</span>
</el-dialog>
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const dialogVisible = ref(false);
return {
dialogVisible
};
}
};
</script>
v-model синхронизирует видимость диалога с локальным
состоянием dialogVisible.Даже если приложение использует глобальные решения (например, Pinia или Vuex), локальное состояние остаётся важным для изоляции компонентов:
loading состояния кнопок или индикаторов
прогресса.ref для примитивов и
reactive для объектов и массивов.computed)
помогают автоматически обновлять зависимости без ручного
вмешательства.ref на компонентах Element
Plus, чтобы получать доступ к методам для валидации, сброса или
управления поведением.Эти подходы позволяют создавать чистый, реактивный и легко поддерживаемый код при работе с Element Plus, делая локальное состояние мощным инструментом управления компонентами.