v-if
s работают
Вы уверены? Я ожидаю, что v-if="this.$isLoggedIn"
не сработает, потому что this
здесь не следует использовать (это избыточно; уже есть неявное this.
, поэтому вы в основном делаете this.this.$isLoggedIn
).
но я не могу переключать значение переменной
Вероятно, это связано с тем, что вы не определили переменные «реактивным» способом.
Vue.prototype.$isCompany = true;
Vue.prototype.$isLoggedIn = true;
Кажется немного неудобным определять такие переменные в объекте-прототипе Vue.
Вы можете определить глобальные переменные реактивным способом, определив их как свойства данных root Vue экземпляр:
new Vue({
router,
render: h => h(App),
data: {
isCompany: false,
isLoggedIn: false,
}
}).$mount("#app");
Вы можете получить к ним доступ из любого дочернего компонента через this.$root.isCompany
. Итак, в вашем шаблоне вы должны сделать:
<User v-if="$root.isCompany" name="Company" img="..."></User>
Если вы действительно хотите избежать использования $root.
в шаблоне, вы можете определить свойства прокси в Vue объект-прототип (в дополнение к вышеупомянутому):
Object.defineProperties(Vue.prototype, {
$isCompany: {
get() { return this.$root.isCompany },
set(x) { this.$root.isCompany = x }
},
$isLoggedIn: {
get() { return this.$root.isLoggedIn },
set(x) { this.$root.isLoggedIn = x }
},
})
Теперь вы можете сделать это в шаблоне:
<User v-if="$isCompany" name="Company" img="..."></User>
Вот небольшая демонстрация:
Object.defineProperties(Vue.prototype, {
$isCompany: {
get() { return this.$root.isCompany },
set(x) { this.$root.isCompany = x }
}
})
Vue.component('child', {
template: '<div><input type="checkbox" v-model="$isCompany"> {{ $isCompany }}</div>'
})
new Vue({
el: '#app',
data: {
isCompany: false,
},
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<child></child>
</div>