Не позволяй своему низу быть твоим потолком
В этой статье в основном говорится о следующем содержании, которое будет показано более четко с помощью коротких примеров, насколько это возможно. Установите и используйте меньше, внедряйте менее глобальный модуль; миксин распределяет повторно используемые функции в компонентах Vue; axios инкапсулирует модульный интерфейс запросов; ленивая загрузка vue-router, перехват маршрутизации; фильтр-фильтр, форматированный текст.
- Используйте менее предварительно скомпилированный язык вместо традиционного css
- использование инъекции миксина
- пакет аксиом
- vue-router ленивая загрузка, перехват маршрута
- фильтрфильтр
bugfix:
- Исправлена проблема, из-за которой параметры среды, экспортированные в loadEnv.js, были ненормальными в webpack.config.js.
- 🐛: исправление подсказок об ошибках eslint, которые вызывают ошибки конфигурации.
@babel/plugin-syntax-dynamic-import
Less
Less — это предварительно скомпилированный язык для расширений CSS, который необходимо скомпилировать в традиционный CSS без использования плагинов. Он может использовать такие функции, как переменные, константы, вложенность, примеси, функции и т. д., и может писать CSS более эффективно и гибко. И некоторые плагины автоматически добавляют соответствующий префикс css во время процесса компиляции less.
установить меньше
npm i less less-loader style-resources-loader -D
style-resources-loader
используется дляWebpack
изCSS
Загрузчик ресурсов обработчика, который вводит несколько импортированных модулей для ваших ресурсов стиля (например). Такие какvariables, mixinscss, sass, scss, less, stylus
.
src
Создайте папку подless
А потом создатьcommon.less
файл, здесь в основном помещаются глобальные стили меньшего размера, такие как цвет, имя и так далее. Пример:
@info: #2d8cf0;
@success: #19be6b;
@warning: #ff9900;
@error: #ed4014;
webpack.config.js
Средняя конфигурация
// webpack.config.js
module.exports = {
...
module: {
rules: [
{
test: /\.less$/,
use: [
'style-loader', 'css-loader', 'less-loader', {
loader: 'style-resources-loader',
options: {
patterns: [resolve('src/less/common.less')]
}
}
]
}
...
]
}
};
После их настройки вы можете использоватьless
Ну и остальные едят так же.
меньше использования
main.vue
Код выглядит следующим образом:
<template>
<div class="main">main
<div class="info">info</div>
<div class="success">success</div>
<div class="warning">warning</div>
<div class="error">error</div>
</div>
</template>
...
<style lang="less" scoped>
.main {
.info {
color: @info;
}
.success {
color: @success;
}
.warning {
color: @warning;
}
.error {
color: @error;
}
}
</style>
mixin
Миксины предоставляют очень гибкий способ распространения повторно используемой функциональности в компонентах Vue. Объект миксина может содержать произвольные параметры компонента. Когда компонент использует примесь, все опции примеси будут «смешаны» с собственными опциями компонента.
Конкретные примеры можно посмотретьСтраница переключения миксинов Axios отменяет запрос интерфейса
axios
в первой статье[Attack Vue One] Создайте ведро семейства Vueaxios уже упоминался в,
существуетmain.js
Axios монтируется в прототип объекта Vue, использовать его напрямую не элегантно, а если он используется в проекте, то надо судить о возврате различных состояний данных.this.$http
Это будет казаться повторяющимся и громоздким в использовании.
пакет аксиом
src
Создано в каталогеutils
каталог, создатьrequest.js
документ.
import axios from 'axios';
/**
* process.env.APP_BASEURL 环境中的参数,在不同的环境下自动使用对应环境参数
* timeout: 默认超时7秒
* 更多信息查看:https://www.npmjs.com/package/axios
*/
const request = axios.create({
baseURL: process.env.APP_BASEURL,
timeout: 7000
// headers: {
// common: {
// 'Authorization': 123
// }
// }
});
// 请求拦截
request.interceptors.request.use(
config => {
// post请求时候参数格式转换
if (config.method === 'post' || config.method === 'POST') {
config.data = qs.stringify(config.data);
}
// config是发送请求时候所带的一些内容,比如数据什么的
return config;
},
error => {
Promise.reject(error);
}
);
request.interceptors.response.use(
response => {
// 处理http状态码,以及处理后端接口返回的状态值
// const { status, data } = response;
// if (status === 200) {
// return data;
// } else {
// window.alert(status);
// }
const data = response.data;
return data;
},
error => {
// 处理请求错误
if (error.name === 'Error') {
// window.alert(error.message);
}
// return error;
}
);
export default request;
использование аксиом
src
Создать папку в каталогеapi
, этот файл используется только для размещения запроса接口
, например, мне нужно запросить интерфейс для получения данных/getData
.
Исправлять.env.development
изAPP_BASEURL
, если не сhttp|https
,axios
По умолчанию это символ имени пути после URL-адреса.
APP_BASEURL="http://dev/"
APP_TEXT="开发测试文本"
NODE_ENV="development"
import request from '@/utils/request';
/**
* 请求接口
* 如果想要请求非BASE_URL以外的url,比如一个新的url: https://v1.hitokoto.cn,
* 直接在data中重新设置url即可,会把原来的url替换掉
* @param {Object} data
*/
export const getData = data =>
request({
url: '/getData',
method: 'GET',
...data
});
Затем на странице используйте:
import { getData } from '@/api/account/index';
export default {
created() {
...
// 使用方法一
getData().then(res => {
console.log('Promise then', res);
}).catch(err => {
console.log('Promise catch error', err);
});
// 使用方法二
this.getReqData();
},
methods: {
// async异步
async getReqData() {
// 重置替换掉原来的链接
const data = await getData({
baseURL: 'https://v1.hitokoto.cn',
url: ''
});
console.log('async异步获取', data);
}
}
};
потому что его не существуетhttp://dev/
так было быnetwork error
. как показано ниже
Страница переключения миксинов Axios отменяет запрос интерфейса
Примечание. Некоторые бизнес-сценарии отменяются после переключения страниц.
axios
request, чтобы подсказка сообщения предыдущего (предыдущего) запроса не появлялась на новой странице. обратиться к боссуmixin
способ отменить.
/**
* @name cancelRequestMixin.js
* @url https://juejin.cn/post/6844904023191977998
* @description 切换页面之后取消接口调用
*/
import axios from 'axios';
const CancelToken = axios.CancelToken;
const cancelRequestMixin = {
data() {
return {
axiosCancelToken: null, // cancelToken实例
axiosCancel: null // cancel方法
};
},
created() {
// 初始化生成axiosCancelToken实例,注册axiosCancel方法
this.axiosCancelToken = new CancelToken(c => {
this.axiosCancel = c;
});
},
beforeDestroy() {
// 组件销毁阶段调用axiosCancel方法取消请求
this.axiosCancel('取消请求');
}
};
export default cancelRequestMixin;
ленивая загрузка маршрутизации vue-router, перехват маршрутизации
Отложенная загрузка маршрутизации vue-router
При упаковке и создании приложений пакеты JavaScript могут стать очень большими и повлиять на загрузку страницы. Было бы более эффективно, если бы мы могли разделить компоненты, соответствующие разным маршрутам, на разные блоки кода, а затем загружать соответствующие компоненты при доступе к маршруту.
🐛: обновить контент
ошибки eslint могут сообщаться при использовании импортаParsing error: Unexpected token importeslint
, на этот раз вам нужно установитьbabel-eslint
.
npm i babel-eslint -D
Затем настройте в .eslintrc.js:
module.exports = {
...
parserOptions: {
+ parser: 'babel-eslint',
ecmaVersion: 2018,
sourceType: 'module'
}
...
}
ленивая загрузка
component: () => import(/webpackChunkName:'name'/'@/views/name.vue')
router/index.js
Модификация файла:
import Vue from 'vue';
import VueRouter from 'vue-router';
import main from '@/views/main.vue';
Vue.use(VueRouter);
const routes = [
{
path: '/',
name: 'main',
component: main
},
{
path: '/auth',
name: 'auth',
meta: {
// auth字段表示需要权限才能进入
auth: true
},
component: () => import(/*webpackChunkName:'auth'*/'@/views/auth.vue')
},
{
// 作为拦截后的展示页面
path: '/403',
name: '403',
// 这里的import eslint一直报错,有人知道是为什么吗。。
component: () => import(/*webpackChunkName:'403'*/'@/views/403.vue')
},
{
// 所有不存在的路由都会跳转到404
path: '*',
name: '404',
component: () => import(/*webpackChunkName:'404'*/'@/views/404.vue')
}
];
const router = new VueRouter({
routes
});
export default router;
перехват маршрута
добавить 3 страницыauth.vue
,403.vue
,404.vue
, настройка содержимого, используемая для демонстрации примера перехвата маршрута.
-
auth.vue
На странице отображается контент, требующий разрешения -
403.vue
Подскажите нет разрешения
Исправлятьmain.js
.
...
router.beforeEach((to, from, next) => {
if (to.meta.auth) {
if (!localStorage.getItem('token')) {
router.push('/403');
} else {
next();
}
} else {
next();
}
});
...
В настоящее время, если вы хотите ввести авторизацию, вы не можете войти, и вы сразу попадете на страницу 403.
localStorage
добавлено вtoken: value
.
filter
К .v ue js.org/v2/ Дорого / fi ...
Vue.js позволяет настраивать фильтры, которые можно использовать для некоторых распространенных форматов текста. Фильтры можно использовать в двух местах: интерполяция двойной фигурной скобки и выражения v-bind (последнее поддерживается начиная с версии 2.1.0+). Фильтры следует добавлять в конце выражений JavaScript, обозначенных символом «труба».
<!-- 在双花括号中 -->
{{ message | capitalize }}
<!-- 在 `v-bind` 中 -->
<div v-bind:id="rawId | formatId"></div>
Создайтеfilter.js
документ
Вот пример отформатированной функции
// 时间格式化
const dateFormatter = (formatter, date) => {
date = date ? new Date(date) : new Date();
const Y = date.getFullYear() + '';
const M = date.getMonth() + 1;
const D = date.getDate();
const H = date.getHours();
const m = date.getMinutes();
const s = date.getSeconds();
return formatter
.replace(/YYYY|yyyy/g, Y)
.replace(/YY|yy/g, Y.substr(2, 2))
.replace(/MM/g, (M < 10 ? '0' : '') + M)
.replace(/DD/g, (D < 10 ? '0' : '') + D)
.replace(/HH|hh/g, (H < 10 ? '0' : '') + H)
.replace(/mm/g, (m < 10 ? '0' : '') + m)
.replace(/ss/g, (s < 10 ? '0' : '') + s);
};
// 方便扩展
export { dateFormatter }
определить глобальный фильтр и использовать
main.js
Исправлять:
...
import * as filters from './filter';
Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key]);
});
...
использовать в коде
<template>
<div>
<p>需要被拦截的页面</p>
<div class="money">{{ date | dateFormatter('YYYY-MM-DD')}}</div>
</div>
</template>
<script>
export default {
data() {
return {
date: new Date()
}
}
}
</script>
На этом статья заканчивается, конструкция проекта vue будет выложена на GitHub, а друзья, которым она нужна, смогут тянуть ее сами, на ее основе будут следующие статьи. Если есть что-то, что нужно оптимизировать, или если у вас есть предложения получше, вы можете оставить сообщение в области комментариев (представьте, что его читает много людей).
Репозиторий на гитхабе:GitHub.com/Скоро ночь/Интернет…
Ветви кода по адресу:/tree/dev/20200624-Somefeatures