Vuetify中v-navigation-drawer的v-model:rail与:rail行为是否存在差异?
这是预期行为,两者的核心差异在于绑定逻辑的不同:
单向绑定
:rail="isRail":组件仅接收你传入的isRail值来控制rail模式,组件内部的交互(比如hover展开)不会修改外部的isRail变量。这正好匹配你想要的场景——通过按钮手动切换固定的rail/展开状态,不会被组件的hover行为干扰。双向绑定
v-model:rail="isRail":组件不仅会根据isRail值设置初始rail状态,还会在内部状态变化时(比如hover rail触发展开)主动修改isRail变量。这就是你看到hover时isRail变为false的原因:组件在hover展开时会将自身rail状态改为false,双向绑定会同步这个变化到你的变量中,导致后续点击按钮的切换逻辑失效。
如果你需要的是手动控制rail模式的固定切换,:rail="isRail"是正确用法;如果需要实时同步组件内部的rail状态到外部变量(比如要在页面上显示当前是否处于rail模式),才适合用v-model:rail。
修改后的代码示例(符合预期的版本)
<script setup lang="ts"> import { type Ref, ref } from 'vue'; const isRail: Ref<boolean> = ref(true); </script> <template> <v-card> <v-layout> <v-navigation-drawer expand-on-hover :rail="isRail"> <v-list> <v-list-item prepend-avatar="https://randomuser.me/api/portraits/women/85.jpg" subtitle="sandra_a88@gmailcom" title="Sandra Adams" ></v-list-item> </v-list> <v-divider></v-divider> <v-list density="compact" nav> <v-list-item prepend-icon="mdi-chevron-double-right" role="button" @click="isRail = !isRail" > Pin Open </v-list-item> <v-list-item prepend-icon="mdi-folder" title="My Files" value="myfiles" ></v-list-item> <v-list-item prepend-icon="mdi-account-multiple" title="Shared with me" value="shared" ></v-list-item> <v-list-item prepend-icon="mdi-star" title="Starred" value="starred" ></v-list-item> </v-list> </v-navigation-drawer> <v-main style="height: 250px"> <p> the quick brown fox jumped over the lazy dog. the quick brown fox jumped over the lazy dog. </p> <p style="padding-left: 300px">isRail is: {{isRail}}</p> </v-main> </v-layout> </v-card> </template>
内容的提问来源于stack exchange,提问作者Bob Ramsey
相关产品推荐
相关产品推荐

