Невозможно воспроизвести поведение v-if
в пользовательской директиве. Директивы не могут контролировать рендеринг vnodes, они влияют только на элемент DOM, к которому он прикреплен. (v-if
особенный, на самом деле это не директива, а вместо этого генерирует код условного рендеринга при компиляции шаблона.)
Хотя я бы по возможности избегал делать какие-либо из следующих предложений, я все равно их предоставлю, поскольку это близко к тому, что вы хотите сделать.
1. Расширьте прототип Vue, чтобы добавить глобальный метод.
Вам определенно нужно использовать v-if
для условного рендеринга. Итак, все, что нам нужно сделать, это придумать глобальный вспомогательный метод, который вычисляет права доступа.
Vue.prototype.$access = function (param) {
// Calculate access however you need to
// ("this" is the component instance you are calling the function on)
return ...
}
Теперь в ваших шаблонах вы можете сделать это:
<my-component v-if="$access({ param: 'param' })">
2. Определите глобальный метод в корневом компоненте.
Это в основном то же самое, что и # 1, за исключением того, что вместо того, чтобы загрязнять прототип Vue мусором, вы определяете метод только в корневом экземпляре:
new Vue({
el: '#app',
render: h => h(App),
methods: {
access(param) {
return ...
}
}
})
Теперь в ваших шаблонах вы можете сделать это:
<my-component v-if="$root.access({ param: 'param' })">
Теперь яснее, где определяется метод.
3. Используйте глобальный миксин
Возможно, это не идеально, но вы можете исследовать жизнеспособность , если это того стоит. глобальный миксин.
4. Используйте настраиваемый компонент.
Вы можете создать собственный компонент (в идеале функциональный, но это не обязательно), который может рассчитывать доступ для определенных регионов в вашем шаблоне:
Vue.component('access', {
functional: true,
props: ['param'],
render(h, ctx) {
// Calculate access using props as input
const access = calculateAccess(ctx.props.param)
// Pass the access to the default scoped slot
return ctx.scopedSlots.default(access)
}
})
В своих шаблонах вы можете сделать это:
<access :param="param" v-slot="access">
<!-- You can use `access` anywhere in this section -->
<div>
<my-component v-if="access"></my-component>
</div>
</access>
Поскольку <access>
является функциональным компонентом, на самом деле он не будет отображать собственный экземпляр компонента. Думайте об этом больше как о функции, чем о компоненте.
Немного избыточно для вашей ситуации, но тем не менее интересно, если у вас когда-либо будет более сложный сценарий.
person
Decade Moon
schedule
06.06.2020
if
, чтобы, если ваше условие не выполняется, код не выполняется, пока компонент уничтожен - person Ayudh   schedule 05.06.2020v-if
не является настоящей директивой). - person Decade Moon   schedule 05.06.2020