如何在屏幕尺寸改变时改变 vue.js 数据值?
How to change vue.js data value when screen size changes?
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<template v-if="mobile == 1">
<li><a href="#">Heading</a></li>
</template>
<!-- Else use long heading -->
<template v-else-if="mobile == 0">
<li><a href="#">Heading Long</a></li>
</template>
</ul>
</div>
<script src="https://unpkg.com/vue@2.1.10/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
mobile: 0
}
});
我正在寻找一种方法来在 (max-width: 547px) 的屏幕断点激活时更改 'mobile' 的值。并在该移动断点变为非活动状态(屏幕超过 547 像素)时将其改回。我通常使用 skel (https://github.com/ajlkn/skel) 来处理屏幕断点,但我无法从 Vue 内部访问 skel,反之亦然。我会放弃使用 Vue 来完成这个特定任务,但是 display: none 和 display: block 会影响我的演示——将我的元素变成一个块。
您可以像下面这样使用 onorientationchange 事件:
methods: {
detectOrientationChange() {
switch(window.orientation) {
case -90 || 90:
// landscape
this.mobile = false;
break;
default:
// portrait
this.mobile = true;
break;
}
}
},
mounted() {
this.$nextTick(() => {
window.addEventListener('onorientationchange', this.detectOrientationChange)
}
},
created() {
this.detectOrientationChange(); // when instance is created
}
注意:由于该事件已被弃用,在撰写本文时它只能用于移动浏览器。
检测当前浏览器的屏幕方向。
检查这个库:https://github.com/apertureless/vue-breakpoints
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<hide-at breakpoint="medium">
<template v-if="mobile == 1">
<li><a href="#">Heading</a></li>
</template>
</hide-at>
<!-- Else use long heading -->
<show-at breakpoint="mediumAndAbove">
<template v-else-if="mobile == 0">
<li><a href="#">Heading Long</a></li>
</template>
</show-at>
</ul>
</div>
或者直接使用 media queries
(https://www.w3schools.com/css/css3_mediaqueries_ex.asp)
CSS :
@media screen and (max-width: 600px) {
#app ul il:first-of-type {
visibility: visible;
}
#app ul il:last-of-type {
visibility: hidden;
}
}
@media screen and (max-width: 992px) {
#app ul il:first-of-type {
visibility: hidden;
}
#app ul il:last-of-type {
visibility: visible;
}
}
当然,在什么断点上显示什么和隐藏什么,当然由您决定,希望对您有所帮助。
如果您正在使用 Vuetify, you can programmatically adjust the data value based on the built in breakpoints
of xs, sm, md, lg, xl (as specified in Material Design) 如下:
computed: {
mobile() {
return this.$vuetify.breakpoint.sm
},
}
一旦屏幕宽度小于 600px,mobile
将更改为 true
。
您的代码将是这样的(我还将 if
语句直接移动到 <li>
元素上):
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<li v-if="mobile"><a href="#">Heading</a></li>
<!-- Else use long heading -->
<li v-else><a href="#">Heading Long</a></li>
</ul>
</div>
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<template v-if="mobile == 1">
<li><a href="#">Heading</a></li>
</template>
<!-- Else use long heading -->
<template v-else-if="mobile == 0">
<li><a href="#">Heading Long</a></li>
</template>
</ul>
</div>
<script src="https://unpkg.com/vue@2.1.10/dist/vue.js"></script>
<script>
var app = new Vue({
el: '#app',
data: {
mobile: 0
}
});
我正在寻找一种方法来在 (max-width: 547px) 的屏幕断点激活时更改 'mobile' 的值。并在该移动断点变为非活动状态(屏幕超过 547 像素)时将其改回。我通常使用 skel (https://github.com/ajlkn/skel) 来处理屏幕断点,但我无法从 Vue 内部访问 skel,反之亦然。我会放弃使用 Vue 来完成这个特定任务,但是 display: none 和 display: block 会影响我的演示——将我的元素变成一个块。
您可以像下面这样使用 onorientationchange 事件:
methods: {
detectOrientationChange() {
switch(window.orientation) {
case -90 || 90:
// landscape
this.mobile = false;
break;
default:
// portrait
this.mobile = true;
break;
}
}
},
mounted() {
this.$nextTick(() => {
window.addEventListener('onorientationchange', this.detectOrientationChange)
}
},
created() {
this.detectOrientationChange(); // when instance is created
}
注意:由于该事件已被弃用,在撰写本文时它只能用于移动浏览器。
检测当前浏览器的屏幕方向
检查这个库:https://github.com/apertureless/vue-breakpoints
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<hide-at breakpoint="medium">
<template v-if="mobile == 1">
<li><a href="#">Heading</a></li>
</template>
</hide-at>
<!-- Else use long heading -->
<show-at breakpoint="mediumAndAbove">
<template v-else-if="mobile == 0">
<li><a href="#">Heading Long</a></li>
</template>
</show-at>
</ul>
</div>
或者直接使用 media queries
(https://www.w3schools.com/css/css3_mediaqueries_ex.asp)
CSS :
@media screen and (max-width: 600px) {
#app ul il:first-of-type {
visibility: visible;
}
#app ul il:last-of-type {
visibility: hidden;
}
}
@media screen and (max-width: 992px) {
#app ul il:first-of-type {
visibility: hidden;
}
#app ul il:last-of-type {
visibility: visible;
}
}
当然,在什么断点上显示什么和隐藏什么,当然由您决定,希望对您有所帮助。
如果您正在使用 Vuetify, you can programmatically adjust the data value based on the built in breakpoints
of xs, sm, md, lg, xl (as specified in Material Design) 如下:
computed: {
mobile() {
return this.$vuetify.breakpoint.sm
},
}
一旦屏幕宽度小于 600px,mobile
将更改为 true
。
您的代码将是这样的(我还将 if
语句直接移动到 <li>
元素上):
<div id="app">
<ul>
<!-- On mobile devices use short heading -->
<li v-if="mobile"><a href="#">Heading</a></li>
<!-- Else use long heading -->
<li v-else><a href="#">Heading Long</a></li>
</ul>
</div>