задний план
В настоящее время основным бизнесом многих компаний является конец C. Несмотря на то, что у них огромное количество пользователей и трафика, бизнес конца B незаменим, например, CRM, CMS, платформа управления конфигурацией операций, платформа визуализации данных и различные платформы утверждения. Эти системы имеют несколько общих черт: множество требований, быстрые изменения, страницы запросов, страницы списков и страницы отправки. И эти страницы похожи, с низкими требованиями к пользовательскому интерфейсу и простыми функциями. Так можем ли мы разработать конфигурационную платформу для повышения производительности? Ответ положительный. Нам нужно только настроить Json для генерации страницы, как этого добиться? Давайте потихоньку...
Технический отбор
Nodejs + Vue/React + схема Json
каркасное здание
Анализ: странице нужен только один контейнер, который можно понимать как Div. При загрузке страницы асинхронно перейдите в центр распределенной конфигурации (Redis или другой), чтобы получить конфигурацию страницы. Конфигурация страницы — это просто строка Json. После того, как данные конфигурации извлечены, мы начинаем анализировать Json, в том числе правильность и законность Json. Наконец, страница рендерится через метод Render компонента Vue, увидев это, у многих возникнут следующие сомнения:
- Как определяется формат Json?
- Как Json соответствует компонентам?
- Как визуализируются компоненты?
- Как взаимодействуют компоненты?
- Поддерживает ли он сложные логические взаимодействия?
Инновации и оптимизация фреймворка
- Поддерживает вложенный рендеринг компонентов бесконечного уровня
- Упрощение связи между компонентами
- Предварительный просмотр конфигурации страницы
Вопрос ответ
1. Как определяется формат Json?
Для этого нет единого стандарта, он полностью основан на личных предпочтениях, позвольте мне показать вам мое определение:
{
"uniqueId": "mt-form",
"attrs": {
"style": {
"paddingBottom": "15px",
"paddingLeft": "5px"
}
}
}
2. Json как и компоненты соответствуют? Смотрим на код пользовательского компонента Form.vue:
<template>
<el-form :label-width="labelWidth" :inline="true" class="mt-form-inline">
<slot></slot>
</el-form>
</template>
<script>
export default {
props: ['labelWidth']
}
</script>
<style>
</style>
Создайте новый модуль библиотеки компонентов ComponentsLib.js, и мы предоставим пользовательские компоненты через этот модуль:
/**
* 引入所有公共组件库
*/
import Form from './Form.vue'
module.exports = {
/**
* 对外暴露组件,名称id必须唯一
*/
'mt-form': Form
}
3. Как визуализируются компоненты
После написания компонента и представления компонента, как мы его визуализируем? Определите глобальный компонент через Vue.component:
import Vue from 'vue'
import ComponentsLib from './ComponentsLib' // 暴露出来的组件库
/**
* 注入全局的页面容器组件
* 所有组件必须包裹在一个容器组件中
*/
Vue.component('page-container', {
render: function (createElement) {
return this.deepComponents(this.pageConfig, createElement)
},
methods: {
deepComponents (pageConfig, createElement) {
if (pageConfig) {
return createElement(ComponentsLib[pageConfig.uniqueId], {
...pageConfig.attrs
}, this.deepChildren(pageConfig.children, createElement))
}
},
/**
* 递归遍历所有子组件
* @param {} pageConfig
* @param {*} createElement
*/
deepChildren (pageConfig, createElement) {
if (!pageConfig) {
return createElement('span')
}
if (pageConfig) {
let children = []
for (let i = 0; i < pageConfig.length; i++) {
let item = pageConfig[i]
if (item) {
children.push(createElement(ComponentsLib[item.uniqueId], {
...item.attrs }, this.deepChildren(item.children, createElement)))
}
}
return children
}
}
},
props: {
pageConfig: {
type: Object,
required: true
}
}
})
Видно, что суть в том, что мои компоненты выставлены через библиотеку компонентов, и каждый компонент имеет уникальный ID, и когда я настраиваю его в Json, uniqueId — это уникальный ID, соответствующий моему компоненту, так что через Vue .component Метод Render может рекурсивно проходить и визуализировать мои компоненты, так что могут быть достигнуты бесконечные уровни вложенности компонентов.