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

前端 - 在v-for下使用v-if控制按钮的显示隐藏?

凌钊
2024-09-09
<div  v-for="(item,index) in queryParams.contentList" :key="index">
                <div class="top-title">
                  <div>
                    <el-button @click="handlePopup" type="text">管理</el-button>
                  </div>
                </div>
                <child @watchContentList="(val)=>watchContentList(val,index)" :index="index" :data="item" ref="sourceFrom"/>
              </div>

queryParams.contentList是一个列表v-for渲染显示列表
子组件是一个select组件 watchContentList事件会返回val和index 当val为选择的指定数字的时候列表里的《管理》按钮会隐藏,反之则显示出来
如何控制按钮的显示隐藏

共有3个答案

周麒
2024-09-09

首先管理按钮和child都是循环出来的,所以管理按钮的显示隐藏状态应该是一个数组,那么可以在给queryParams.contentList赋值之前添加一个字段,用来控制button的显示隐藏,或者也可以新增一个queryParams.contentList.length长度的数组,用数组中的每一项,来控制button的显示隐藏;最后在watchContentList方法中,根据index去修改queryParams.contentList的属性或新增数组的状态。

微生毅然
2024-09-09

帮你写好了。

<script step>
let v = ref('')

function watchContentList(val,index){
    v.value = val;
}

</script>

<template>
<div  v-for="(item,index) in queryParams.contentList" :key="index">
  <div class="top-title">
    <div>
      <el-button @click="handlePopup" type="text" v-if="v">管理</el-button>
    </div>
  </div>
  <child @watchContentList="(val)=>watchContentList(val,index)" :index="index" :data="item" ref="sourceFrom"/>
</div>
</template>
陈扬
2024-09-09

在Vue中,直接使用v-ifv-for在同一个元素上是不推荐的,因为这会导致渲染列表时每次都需要重新计算条件,影响性能。不过,你可以通过在模板中嵌套一个额外的<template>元素或者使用计算属性来预处理数据,从而在v-for中更高效地控制v-if

针对你的场景,你可以通过维护一个额外的数组或对象来跟踪哪些项的“管理”按钮应该被隐藏。这里,我假设你有一个额外的数据属性(例如hiddenButtons)来存储这个信息,它可能是一个数组,其中每个元素对应queryParams.contentList中的一个项的隐藏状态(例如,使用索引作为键)。

以下是一个可能的实现方式:

<template>
  <div v-for="(item, index) in queryParams.contentList" :key="index">
    <div class="top-title">
      <div>
        <!-- 使用v-if来控制按钮的显示隐藏 -->
        <el-button v-if="!hiddenButtons[index]" @click="handlePopup(index)" type="text">管理</el-button>
      </div>
    </div>
    <child 
      @watchContentList="(val, idx) => handleWatchContentList(val, idx)" 
      :index="index" 
      :data="item" 
      ref="sourceFrom"
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      queryParams: {
        contentList: [], // 假设这是你的列表数据
        // 初始化hiddenButtons,假设与contentList长度相同,初始值全为false
        hiddenButtons: new Array(this.queryParams.contentList.length).fill(false),
      },
    };
  },
  methods: {
    handlePopup(index) {
      // 处理点击事件
      console.log(`Handling popup for index: ${index}`);
    },
    handleWatchContentList(val, idx) {
      // 根据val的值更新hiddenButtons中对应索引的值
      this.hiddenButtons[idx] = val === 你的指定数字; // 替换'你的指定数字'为实际的条件值
    },
  },
};
</script>

注意,这里handleWatchContentList方法接收validx(或index)作为参数,并据此更新hiddenButtons数组。你需要将子组件中触发的watchContentList事件的参数修改为同时发送值和索引,或者根据你的实际情况调整这部分逻辑。

另外,请确保在组件的data函数中正确初始化hiddenButtons数组,其长度应与queryParams.contentList一致,并且初始值全部为false(或根据你的需求设置)。这样,你就可以在v-for循环中使用v-if="!hiddenButtons[index]"来控制“管理”按钮的显示隐藏了。

 类似资料:
  • 当它们处于同一节点,v-for的优先级比v-if更高,这意味着v-if将分别重复运行于每个v-for循环中。当你想为仅有的一些项渲染节点时,这种优先级的机制会十分有用,如下: <li v-for="todo in todos" v-if="!todo.isComplete"> {{ todo }} </li> 上面的代码只传递了未完成的 todos。 而如果你的目的是有条件地跳过循环的执行

  • 本文向大家介绍对vue v-if v-else-if v-else 的简单使用详解,包括了对vue v-if v-else-if v-else 的简单使用详解的使用技巧和注意事项,需要的朋友参考一下 首先vue.js请注意 2.1.0版本以上方可使用v-else-if 页面展示如下: vue.js下载:https://github.com/vuejs/vue 以上这篇对vue v-if v-els

  • 本文向大家介绍Vue.js常用指令汇总(v-if、v-for等),包括了Vue.js常用指令汇总(v-if、v-for等)的使用技巧和注意事项,需要的朋友参考一下 有时候指令太多会造成记错、记混的问题,所以本文在记忆的时候会采用穿插记忆的方式,交叉比对,不易出错。 本文主要讲了一下六个指令: v-if//v-show//v-else//v-for//v-bind//v-on 1. v-if 条件渲

  • 本文向大家介绍Vue.js v-if / v-else,包括了Vue.js v-if / v-else的使用技巧和注意事项,需要的朋友参考一下 示例 假设我们有一个Vue.js实例定义为: 您可以通过包含v-if指令有条件地呈现任何html元素;包含v-if的元素仅在条件评估为true时才会呈现: <h1>在这种情况下,该元素将呈现,因为变量'a'为true。v-if可以与任何计算结果为布尔值的表

  • v-if是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。 v-if也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。 相比之下,v-show就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。 一般来说,v-if有更高的切换开销,而v-show有更高的初始渲染开销。因

  • 预期:any 用法: 根据表达式的值的真假条件渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。如果元素是 <template> ,将提出它的内容作为条件块。 当条件变化时该指令触发过渡效果。 当和 v-if 一起使用时,v-for 的优先级比 v-if 更高。