当前位置: 首页 > 知识库问答 >
问题:

vue.js - Vant4 Tabber 组件 v-model 值不生效,如何实现可控切换?

岳玉书
2024-07-12

vant4 中的 tabber 假设底部有“首页”、“社区”、“我的”,如果我要设定默认界面为社区,按理来说我应该赋值 v-model 的值为“社区”的 name 值,但实际指定“社区” name 属性后并没有成功,且不论如何修改 v-model 的值都没有反应(stringnumber 型都试过)。

可能出现的原因是,我并没有使用 to 方法跳转,而是自行编写的 click 事件,用于判断用户登录状态及权限等再跳转,click 函数内有设置 v-model的值。


我希望通过控制 v-model 的值实现 tabber 的可控。(已在对应子item设定name属性)

<van-tabbar class="footer-bar"  v-model:active="data.footerActive" :route="true" safe-area-inset-bottom active-color="#FF4000"  @change="watchchange">
 <van-tabbar-item name="bar"  @click.native="goTolbar()"  >
   <template #icon="props">
      {{ props.active }}
      <all-application theme="filled"  size="0.6rem" fill="#ff4000" strokeLinejoin="bevel" v-if="props.active ? true:false" />
      <all-application theme="outline" size="0.5rem" fill="#151616" strokeLinejoin="bevel" v-else />
   </template>
 </van-tabbar-item>
</van-tabbar>

由于需要在跳转前判断,所以我写了个 click 进行判断,并对 v-model 赋值对应的值,如 "bar",但 props 的值一直为 false,即选中也没有图标的切换展示。

const goTolbar = () => {
  if(localStorage.getItem("islogin") === "true")
  {
    data.footerActive = "bar"
    router.replace({ path: '/bar' })
  }
  else
  {
    resultOfdoLogin.value = false
    setTimeout(() => {
        resultOfdoLogin.value = true
    },50)
  }
}

这里面 localStorage.getItem("islogin") 判断用户是否登录,如果登录则赋值 v-model,并跳转至 bar,否则 resultOfdoLogin 赋值为 true, 用于弹出指定窗口。

共有2个答案

太叔鸿
2024-07-12

所以你的代码是怎么写的?我这边跑的小Demo是可以正常变更的。

<!-- 引入样式文件 -->
<link rel="stylesheet" href="https://fastly.jsdelivr.net/npm/vant@4/lib/index.css" />

<div id="app"></div>

<!-- 引入 Vue 和 Vant 的 JS 文件 -->
<script src="https://fastly.jsdelivr.net/npm/vue@3"></script>
<script src="https://fastly.jsdelivr.net/npm/vant@4/lib/vant.min.js"></script>

<script>
  const app = Vue.createApp({
    template: `<div>
      <h1>绑定的 active 值: {{active}}</h1>
      <div>
        <van-button v-for="item in menuList" type="primary" @click="onClick(item.key)">{{item.label}}</van-button>
      </div>
      <van-tabbar v-model="active">
        <van-tabbar-item v-for="item in menuList" :name="item.key" :icon="item.icon">{{item.label}}</van-tabbar-item>
      </van-tabbar>
    </div>`,
    data(){
      return {
        active: 'home',
        menuList: [
          { label: "home", key: "home", icon: "home-o" },
          { label: "search", key: "search", icon: "search" },
          { label: "friends", key: "friends", icon: "friends-o" },
          { label: "setting", key: "setting", icon: "setting-o" },
        ]
      }
    },
    methods: {
      onClick(key){
        this.active = key
      }
    }
  });
  app.use(vant);
  app.mount('#app');
</script>
田志尚
2024-07-12

在 Vant 4 的 Tabber 组件中,如果你想通过 v-model 来控制当前激活的 tab,并且你在点击事件中动态改变这个值,但发现它并没有生效,可能是因为你没有正确地触发 Vue 的响应式系统来更新这个值。

以下是一些可能的原因和解决方案:

  1. 确保 v-model 绑定的值是一个响应式的数据
    在 Vue 中,你需要确保 v-model 绑定的值是一个在 datacomputed 或者 methods 中定义的响应式数据。
  2. 不要在事件处理函数中直接修改 props
    如果你的 v-model 绑定的值是一个从父组件传递过来的 prop,那么你不应该在子组件中直接修改它。你应该定义一个局部的数据属性来存储这个值,并在需要的时候使用 $emit 来通知父组件更新 prop。
  3. 使用 this.$set 来更新数组或对象的属性
    如果你的 v-model 绑定的是一个对象或数组的属性,并且你在初始化之后动态地添加了这个属性,那么你可能需要使用 Vue.setthis.$set 来确保这个属性是响应式的。但在 Vue 3(Vant 4 通常基于 Vue 3)中,你可以直接使用 refreactive 来确保对象的响应性。
  4. 确保你的点击事件函数是正确的
    确保你的点击事件函数确实修改了 v-model 绑定的值。你可以通过在函数中打印这个值来检查它确实是否被改变了。

以下是一个简单的示例,展示如何使用 v-model 来控制 Tabber 组件的激活 tab:

<template>
  <div>
    <van-tabber v-model="activeName">
      <van-tabbar-item name="home" icon="home-o">首页</van-tabbar-item>
      <van-tabbar-item name="community" icon="chat-o">社区</van-tabbar-item>
      <van-tabbar-item name="profile" icon="user-o">我的</van-tabbar-item>
    </van-tabber>
    <button @click="changeTab">切换到社区</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const activeName = ref('home'); // 初始激活的 tab 是 "首页"

    function changeTab() {
      // 切换到 "社区" tab
      activeName.value = 'community';
    }

    return {
      activeName,
      changeTab,
    };
  },
};
</script>

在这个示例中,v-model 绑定到了 activeName 这个响应式引用上,当你点击按钮时,changeTab 函数会修改 activeName.value 的值,从而触发 Tabber 组件的更新。

 类似资料:
  • 本文向大家介绍Vue.js组件tabs实现选项卡切换效果,包括了Vue.js组件tabs实现选项卡切换效果的使用技巧和注意事项,需要的朋友参考一下 今天给大家分享一个小颖自己写的vue组件,因为小颖也才接触vue没多久,如果有什么不足的地方,希望大家提出来,小颖加以改正.以下就是具体如何实现tabs啦。 调用示例: 实现tabs: 效果图: 本文已被整理到了《Vue.js前端组件学习教程》,欢迎大

  • vue2.7 使用setup语法糖 但是想实现自定义v-model 却发现语法糖不支持model: { prop: '', event: ''} 尝试了modelValue 发现不支持 我现在只能使用defineComponent,用optionsApi实现

  • 本文向大家介绍巧妙运用v-model实现父子组件传值的方法示例,包括了巧妙运用v-model实现父子组件传值的方法示例的使用技巧和注意事项,需要的朋友参考一下 v-model介绍 熟悉Vue的小伙伴们都知道 v-model 是Vue的一个很大的特色,可以实现双向数据绑定。但本质上呢,它不过是语法糖,它负责监听用户的输入事件以更新数据。 以下摘取自Vue官方文档 v-model 在内部使用不同的属性

  • 本文向大家介绍以v-model与promise两种方式实现vue弹窗组件,包括了以v-model与promise两种方式实现vue弹窗组件的使用技巧和注意事项,需要的朋友参考一下 最近公司有一个后台业务虽然也是写在了现有的后台系统中,但是之后要为这个业务单独拉出来新建一个后台系统,所以现有的后台系统中的vue组件库,就不能用了(因为不知道将来的系统要基于什么组件库,以防给未来移植项目带来麻烦),这

  • 在上面的代码中,handlerDelete是将props.modelValue的原数组通过slice进行浅克隆,最后将浅克隆的值传回父组件,通过父组件修改原值,之所以使用这种传值方式,是因为我采用了react的更新机制。 然而由于vue本身是响应式数据,因此直接修改props.modelValue也能实现: 问题 因此这引发了我的一个思考: 第二种直接修改props的方法虽然方便,但是带来了许多的

  • HTML 原生的输入元素类型并不总能满足需求。幸好,Vue 的组件系统允许你创建具有完全自定义行为且可复用的输入组件。这些输入组件甚至可以和v-model一起使用!要了解更多,请参阅组件指南中的自定义输入组件。