Базовая среда разработки
Проект, созданный vue-cli3, vscode как инструмент для написания кода Рекомендация плагина vscode:настройка плагина vscode
Каталог статей
- Введение в структуру каталогов проекта
- Выбор рамки пользовательского интерфейса
- основная, js обработка
- axios запрашивает вторичную инкапсуляцию
1. Введение в структуру каталогов проекта
├── public // index.html
├── src // 业务相关
│ ├── assets // 静态文件(css, images)
│ ├── components // 全局组件
│ ├── layouts // 基础样式布局
│ ├── plugin // 样式及工具引入
│ ├── request // 请求配置
│ ├── router // 路由
│ ├── store // 全局状态管理
│ ├── utils // 工具文件
│ ├── app.vue // 入口文件
│ ├── main.js // 主要配置文件
│ └── views // 页面
├── .eslintrc.js // eslint 检查配置
├── .env.release // 测试环境变量
├── .env.pre-build // 预发环境变量
└── vue.config.js // webpack 打包配置
2. Выбор рамки пользовательского интерфейса
Проверка и сравнение по элементу выбора фреймворка, iview, ant-design-vue Наконец выберите ant-design-vue, порталv UE.Anta.design/docs/v UE/in…
преимущество:
- Приятно
- Документация понятна
- Простота в использовании, наглядные примеры
- Меньше ошибок, плавное использование компонентов
- Хорошая производительность, есть тест на один случай
3. Main.js децентрализованная обработка
main.jsВ качестве операционной записи нужно ввести много вещей, слишком большой код, необходимость оптимизации, логика ясна, а Wen Tiger удобен.
1. Работа с трехсторонними структурами
Создайте новый плагин папки для хранения всех файлов, которые необходимо импортировать.main.jsСмонтированные компоненты, методы, сторонние библиотеки
-
ant-design.jsСогласно официальной рекомендации, вводить по требованиюпреимущество:Наш проект разработки может использовать не все компоненты, поэтому введение уменьшает размер проекта.import Vue from 'vue' import { ConfigProvider, Pagination, Steps, Cascader, Row, Col, Table } from 'ant-design-vue' import 'ant-design-vue/dist/antd.less' Vue.use(ConfigProvider) Vue.use(Steps) Vue.use(Cascader) Vue.use(Row) Vue.use(Col) Vue.use(Table) -
func.jsНекоторые пользовательские методы, связанные с прототипом vueimport Vue from 'vue' import api from '@/request/api' import { isInvalid, isValid } from '@/utils/verify' // 请求接口 Vue.prototype.$api = api // 验证工具 Vue.prototype.$isInvalid = isInvalid Vue.prototype.$isValid = isValidТаким образом разложите несколько файлов, а затем сведите их в единый
index.jsсерединаimport './ant-design.js' import './func.js' import './moment'Вставил наконец main.js, весь мир понятен и прост
import './plugin'2. Внедряйте пользовательские компоненты по всему миру
Я получил напоминание от великого бога в области комментариев и изучил его.
webpackсерединаrequire.contextrequire.contextдаwebpack, используемый для создания собственного (модульного) контекстаwebpackбудет анализировать код во время сборкиrequire.context()require.context(directory, useSubdirectories = false, regExp = /^/)Функция принимает три параметра:Каталог папок для поиска Должен ли он также искать его подкаталоги и регулярное выражение, которое соответствует файлам
// 语法 require.context(directory, useSubdirectories = false, regExp = /^\.\//); // 示例 require.context('./test', false, /\.test\.js$/);Итак, в
main.js, я могу зарегистрировать все свои пользовательские компоненты напрямую, очень просто// 自定义组件 const requireComponents = require.context('@v/components', true, /\.vue$/) // 打印结果 // 遍历出每个组件的路径 requireComponents.keys().map(fileName => { // 获取组件配置 const componentConfig = requireComponents(fileName) // 剥去文件名开头的 `./` 和`.vue`结尾的扩展名 const componentName = fileName.replace(/^\.\//, '').replace(/\.vue$/, '') // 全局注册组件 Vue.component( componentName.replace(/\//, '-'), // 如果这个组件选项是通过 `export default` 导出的,那么就会优先使用 `.default`,否则回退到使用模块的根。 componentConfig.default || componentConfig ) })
4. Axios запрашивает вторичную инкапсуляцию
Axios, но подробнее о галантерейных товарах
-
Новые файловые аксиомы
-
перехватчик запросов Измените заголовок запроса и период ожидания в соответствии с потребностями вашего бизнеса.
import axios from 'axios' axios.interceptors.request.use( config => { // 判断是否是提交文件,还是常规请求 if (config.data instanceof FormData) { config.headers = { 'Content-Type': 'multipart/form-data' // 此处格式自定义 } } else { config.data = JSON.stringify(config.data) config.headers = { 'Content-Type': 'application/json', // 此处格式自定义 token: getLocalStorage('token') } } config.withCredentials = true config.timeout = 5000 // 超时时间 return config }, error => { return Promise.reject(error) } ) -
перехватчик ответа В соответствии с данными, возвращенными из фона, выполните некоторую унифицированную обработку
// 添加响应拦截器 axios.interceptors.response.use( res => { let data = res.data if (res.statusCode !== 200) { if (data.failureReason === 4011 || data.failureReason === 4012) { console.log('需要重新登录') } } else { if (data.resultStates === 0) { return data } else { return Promise.reject(data) } } }, error => { notification['error']({ message: '提示', duration: 2, description: '后台报错' }) // 对响应错误做点什么 return Promise.reject(error) } ) -
Инкапсулируйте получение, отправку и экспорт
export function get (url, params = {}) { return new Promise((resolve, reject) => { axios .get(url, { params: params }) .then(response => { if (response.success) { resolve(response.data) } }) .catch(err => { reject(err) }) }) } /** * 封装post请求 * @param url * @param data * @returns {Promise} */ export function post (url, data = {}) { return new Promise((resolve, reject) => { axios.post(url, data).then( response => { if (response.success) { resolve(response.data) } }, err => { reject(err) } ) }) } -
Фокус: создать новый файл api.js Напишите здесь все интерфейсы фоновых запросов для унифицированного управления
import { get, post } from './axios' const api = { reqLogin: p => post('api/user/addFormId', p), reqGetInfo: p => post('api/user/addFormId', p) } export default api // 将 api 引入到 main.js 中 Vue.prototype.$api = api // 这样页面中使用 this.$api.reqLogin().then(res => { console.log(res) })
Это очень удобно? хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп, хлоп...
Группа веб-интерфейса набирает группу молодых людей с мечтамиwoohoo.brief.com/afraid/33 или 1 из 26…