Сценарии применения
Взяв в качестве примера систему управления фоном, каждый пользователь имеет разные права доступа к кнопкам. После того, как администратор настроит разрешения, когда пользователь входит в систему, он получает список разрешений кнопок из интерфейса, а затем судит, какие кнопки отображаются в соответствии с фоновыми данными.
В двух словах, индивидуальные инструкции
Официальный сайт Vue.js объясняет пользовательские инструкции
Talent.v UE JS.org/V2/expensive/rough…
Основные понятия
В дополнение к встроенным директивам по умолчанию (v-model и v-show) основных функций, Vue также может регистрировать пользовательские директивы.
В Vue 2.0 основной формой повторного использования кода и абстракции являются компоненты. Однако в некоторых случаях все же необходимо выполнять низкоуровневые операции над общими элементами DOM, в этом случае используются пользовательские инструкции.
Например, настройте инструкцию v-focus, когда страница загружается, поле ввода получает фокус
<input v-focus>
Глобальная настройка
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
Местный обычай
//如果想注册局部指令,组件中也接受一个 directives 的选项:
directives: {
focus: {
// 指令的定义
inserted: function (el) {
el.focus()
}
}
}
функция ловушки
bind
只调用一次,指令第一次绑定到元素时调用。 Здесь можно выполнить одноразовые настройки инициализации.
inserted
update
所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。 Значение инструкции может измениться, а может и не измениться. Но вы можете игнорировать ненужные обновления шаблона, сравнив значения до и после обновления.
componentUpdated
unbind
Вызывается только один раз, когда инструкция вызова и решение элемента связи.
разное
В дополнение к этому есть некоторые основные понятия, параметры функции ловушки, динамические параметры директивы и так далее.
Talent.v UE JS.org/V2/expensive/rough…
Официальный сайт очень ясен, здесь здесь нет подробности.
принцип
Если вас интересует исходный код пользовательских инструкций, в саду блога также есть очень прозрачная статья.
Блог woohoo.cn на.com/great Desert…
Принцип таков:
- При анализе свойств Vue просматривайте каждое свойство;
- Добавьте атрибут директив к объекту, чтобы сохранить информацию о директиве;
- После завершения рендеринга будет выполнена функция создания хука модуля директив;
- Чтобы выполнить каждую функцию, она будет выполнять нашу пользовательскую функцию вставленного хука.
Сегодня в основном подведем итоги: пользовательская инструкция v-has, решение о разрешении кнопки
Интерфейс входа получает список разрешений кнопок и сохраняет его в локальном кэше LOGIN_USER_BUTTON_AUTH.
Формат данных следующий:
[
{
"checked":false,
"component":"",
"createTime":"2019-06-29 18:21:06",
"createUser":"026a564bbfd84861ac4b65393644beef",
"icon":"",
"id":"1503273153861066776",
"name":"今日采集(案卷)",
"open":"true",
"parentId":"2328050996633395469",
"parentName":"首页",
"permission":"sys:index:vol",
"sort":103,
"status":"0",
"type":"2",
"updateTime":"2021-01-27 15:51:15",
"updateUser":"026a564bbfd84861ac4b65393644beef",
"url":""
}
]
Настройка пользовательских директив v-has
В папке Utils новый файл Haspermission.js в Unified Export Index.js
const hasPermission = {
install (Vue, options) {
Vue.directive('has', {
inserted: (el, binding, vnode)=>{
filterGlobalPermission(el, binding, vnode);
}
});
}
};
/**
* 全局权限控制
*/
export const filterGlobalPermission = (el, binding, vnode) => {
let permissionList = [];
let authList = JSON.parse(localStorage.getItem('LOGIN_USER_BUTTON_AUTH') || "[]");
for (let auth of authList) {
permissionList.push(auth);
}
if (!permissionList.length) {
el.parentNode.removeChild(el);
return;
}
let permissions = [];
for (let item of permissionList) {
permissions.push(item.permission);
}
if (!permissions.includes(binding.value)) {
el.parentNode.removeChild(el);
}
}
export default hasPermission;
index.js в файле utils
Другие файлы js в папке utils также можно экспортировать в index.js.
import hasPermission from './hasPermission'
export { hasPermission }
Представлено в main.js
import { hasPermission } from '@/utils'
Vue.use(hasPermission)
Используйте v-has в компоненте, чтобы определить, следует ли отображать кнопку в соответствии с разрешениями кнопки.
<el-button v-has="'sys:arch:add'" type="primary" size="mini" icon="el-icon-plus" @click="add('1')">
新增
</el-button>