Недавно я сделал перерыв в своем плотном графике и прочитал соответствующие документы vue3, подумывая написать что-нибудь для ознакомления с новой версией кода. Бывает, что в текущий момент времени вы можете посмотреть на структуру пользовательского интерфейса vue3, которую вы можете использовать на рынке, и только те, которые принадлежат Али.Бета-версия Ant Design Vue 2.0.0. Так получилось, что element-ui использовался в прошлом, поэтому он родился, чтобы использовать эту структуру для создания очень простой структуры страницы управления фоном.Основная цель - изучить, но практически невозможно использовать его в реальном производстве, в основном для записи процесса обучения. окончательный проект вздесь
Взаимодействие компонентов родитель-потомок
Давайте посмотрим на общий макет страницы.
<!-- App.vue -->
<a-config-provider :locale="locale">
<a-spin :spinning="spinning" tip="Loading...">
<a-layout id="components-layout">
<Sider :collapsed="collapsed" />
<a-layout>
<Header :collapsed="collapsed" @toggle-collapsed="collapsed = !collapsed" />
<Breadcrumb />
<a-layout-content :style="{
margin: '24px 16px',
padding: '24px',
background: '#fff',
minHeight: '280px',
}">
<router-view></router-view>
</a-layout-content>
</a-layout>
</a-layout>
</a-spin>
</a-config-provider>
Здесь прямо скопируйте образец с официального сайта, а затем разберите его на составляющие по шапке, сайдбару и хлебным крошкам. Затем после разделения мне нужно нажать кнопку в голове, чтобы управлять сжатием и расширением боковой панели.Здесь я могу использовать компонент «родитель-потомок», чтобы передать значение через верхний App.vue в качестве моста, или передать значение через Vuex.Я использую первый способ.
Сначала добавьте метод в Header.vue
<!-- Header.vue -->
<a-layout-header class="header">
<menu-unfold-outlined v-if="collapsed" class="trigger" @click="toggleCollapsed" />
<menu-fold-outlined v-else class="trigger" @click="toggleCollapsed" />
...
</a-layout-header>
В версии vue2.x родителю нужно передатьthis.$emitПередача, но если код написан в настройке, не может использовать это, способ официальных документов - это метод, излучающий во второй настройке параметров в Vue3.x, пропуск стоимость реализации.
// Header.vue
setup(props, { emit }) {
const toggleCollapsed = () => {
emit("toggle-collapsed");
};
return {
toggleCollapsed,
};
},
На самом деле мне не нужно передавать здесь значение, мне просто нужно коснуться события клика, а затем переключить true/false непосредственно в родительском компоненте.
// App.vue
<Header :collapsed="collapsed" @toggle-collapsed="collapsed = !collapsed" />
Затем сверните изменения в компоненте боковой панели.
<Sider :collapsed="collapsed" />
После этого получение данных, приносимых родительским слоем в компонент боковой панели, аналогично способу vue2.x, вы можете получить их напрямую и использовать.Если вам нужно получить это в настройке, не забудьте добавить параметр props для метода установки.
Мониторинг маршрута
Если маршрут изменяется на боковой панели, я хочу выделить текущую навигацию, и я хочу, чтобы хлебные крошки также отображали соответствующий маршрут.Здесь мне нужно использовать метод просмотра vue3.x.Кроме того, vue3.x также предоставляет A Метод watchEffect. В официальном документе говорится, что отличие заключается в том, что watchEffect может запускать мониторинг немедленно. Здесь я использую watch. Если вы напрямую используете код проекта, сгенерированный официальным скаффолдингом, то версия vue-router должна быть 4.0, что также является причиной использования vue3.x, в 2.x мы используемthis.routerПолучить информацию о маршрутизации и управлять маршрутизацией.В версии маршрутизации 4.0 эти два метода размещеныuseRouteа такжеuseRouter, значит для отслеживания смены маршрута нужно следить за изменением useRoute, в качестве примера берем хлебные крошки
// Breadcrumb.vue
import { watch, reactive, toRefs } from "vue";
import { useRoute, useRouter } from "vue-router";
export default {
name: "Breadcrumb",
setup() {
const route = useRoute();
const router = useRouter();
const state = reactive({
matched: route.matched,
});
// 监听路由变化
watch(
() => route,
(route) => {
state.matched = route.matched;
},
{
immediate: true,
deep: true,
}
);
const jumped = (path) => {
router.push({
path: path,
});
};
return { ...toRefs(state), jumped };
},
};
Строю функцию в первом параметре watch чтобы получить useRoute(), а второй параметр это операция после мониторинга изменения Здесь я получаю совпавший массив маршрута и отображаю его на хлебных крошках
// Breadcrumb.vue
<a-breadcrumb :style="{
padding: '24px',
paddingBottom: '0',
}">
<template v-if="matched.length > 0">
<a-breadcrumb-item v-for="item in matched" :key="item.path"><a href="javascript:;" @click="jumped(item.path)">{{
item.meta.title
}}</a></a-breadcrumb-item>
</template>
</a-breadcrumb>
Третий параметр часов используется для настройки того, следует ли выполнять мониторинг и изменение глубины немедленно. Таким образом, при изменении маршрута информация хлебных крошек будет меняться соответственно, и боковая панель аналогична, поэтому повторяться не буду.
Глобальная настройка axios
Еще одно требование – как внедрить в проектaxios, честно говоря, сначала я его действительно не знал, да и официальную документацию не слишком понимал, но потом нашел способ использования в других статьях. Сначала введите свой собственный инкапсулированный метод axio, а затем в глобальной конфигурации createAppglobalProperties, просто повесьте метод axios, который вы написали, на это свойство
// main.js
import $http from "./api/axios"
const app = createApp(App);
app.config.globalProperties.$http = $http;
Тогда он немного отличается от vue2.x в реальном использовании.Вам нужно сначала ввести компоненты, предоставляемые vue, в компоненты, которые должны использовать axios.getCurrentInstanceметод, который имеетctx, получить глобальные переменные, что эквивалентно этому в 2.x. Затем используйте мой пользовательский метод $http в ctx
import { ref, getCurrentInstance } from "vue";
export default {
setup() {
...
const { ctx } = getCurrentInstance();
ctx.$http({ url: "/test", loading: true });
return {
...
};
},
created() {
// this.$http({ url: "/test" });
},
Кстати, если идти по старинке, вcreatedилиmountedиспользоватьthis.$httpЕго тоже можно назвать обычным.
В сочетании с муравьиным дизайном для добавления глобальной загрузки
Мой оригинальный метод $http в сочетании с element-ui для записи эффекта загрузки в перехвате перед запросом.Друзья, которые пользовались element-ui, должны знать, что можно добавить загрузку как услугу, что очень удобно
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
setTimeout(() => {
loading.close();
}, 2000)
А вот в ant-design-vue такого метода нет.Чтобы добиться глобальной загрузки, необходимо добавить компонент spin на самый внешний слой.
// App.vue
<a-spin :spinning="spinning" tip="Loading...">
<a-layout id="components-layout">
...
</a-layout>
</a-spin>
В этом случае spinning требуется как глобальная переменная, а переменная изменяется после инициации и завершения запроса в любом месте любого компонента, для такой функции больше всего подходит Vuex.
// strore/index.js
export default createStore({
state: {
// 全局loading
spinning: false,
},
mutations: {
// 全局loading
changeSpinning(state, load) {
state.spinning = load
},
}
}
Затем измените мой исходный код axios. Кроме того, я хочу получать подсказку после успеха или неудачи. Затем мне просто нужно заменить компонент сообщения element-ui на ant-design-vue.
...
import store from "@/store";
import { message } from "ant-design-vue";
...
function $http(options, success, failure) {
if (!!options.loading && options.loading) {
store.commit("changeSpinning", true);
}
...
return $axios({...})
.then(...)
.catch(err => {
...
message.error({
content: err.message,
duration: 5
});
})
}
Я действительно хочу пожаловаться здесь. Окно подсказки element-ui имеет конфигурацию кнопки закрытия. Почему окно подсказки ant-design-vue не обеспечивает такую конфигурацию? Я думаю, что это очень распространенное требование. Затем вызовите метод $http в компоненте и увидите сообщение об ошибке, указывающее, что добавление прошло успешно.
Небольшое сожаление о боковой панели
По поводу сайдбара, тут я, честно говоря, застрял. Для иконок в сайдбаре хочу использовать родные иконки ант-дизайна, но иконки ант-дизайна 2.0 все изменены на вызывающую форму введенную компонентами.Давно думал и не решился. Не знаю, как добавить значки компонентов в маршрут. Итак, следующая лучшая вещь, я использовал здесь font-awesome. Но если вы используете сторонние иконки напрямую, вы попадете в другую яму, то есть, когда вы сжимаете боковую панель, текст все еще там
На самом деле с этим проще справиться.Вам нужно только F12, чтобы увидеть эффект демо-версии официального веб-сайта, и вы обнаружите, что значок добавляется к сгенерированному html.anticonимя класса стиляСледовательно, вам нужно только добавить имя класса, подобное этому, к значку с потрясающим шрифтом, который вы добавляете, чтобы добиться эффекта «обманчивого муравьиного дизайна» / побега.
// sider/SubMenu.vue
<template v-slot:title>
<span v-if="menuInfo.meta.icon" class="anticon"><i :class="menuInfo.meta.icon"></i></span>
<span>{{ menuInfo.meta.title }}</span>
</template>
Если друг знает, как добавить сюда собственные значки ant-design-vue, пожалуйста, дайте мне знать, спасибо, спасибо.
Суммировать
В целом, примерно так я отношусь к изучению vue3.0 и ant-design-vue2.0, в основном из-за знакомства с грамматикой и базового использования. Через некоторое время экология созреет, и в мире будет много хороших фреймворков пользовательского интерфейса и каркасов управления фоном vue3.0, из которых мы сможем выбирать.