代码之家  ›  专栏  ›  技术社区  ›  Mav

如何访问v-for中的元素

  •  4
  • Mav  · 技术社区  · 7 年前

    v-for 循环遍历一个名为 projects selectedProjects . 当 project 元素,我想添加一个名为 selected 以及添加 project.id 该索引的属性 选定的项目 . 也许我把整个问题都搞错了,有没有“vue”的方法来达到这个目的?

    <!-- The template -->
    <div v-for="project in projects" class="project" @click="">
        <p><i class="fa fa-folder"></i>{{project.name}}</p>
    </div>
    

    组件数据:

    data: function(){
        return {
            projects: [...],
            selectedProjects: [],
        }
    },
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   Shu Yoshioka    7 年前

    我会加一把钥匙 selected 在项目对象上。

    模板将是这样的

    <div v-for="project in projects" class="project" :class="{selected: project.selected}" @click="select(project)">
        <p><i class="fa fa-folder"></i>{{project.name}}</p>
    </div>
    

    并添加 select selectedProjects 数组由于某种原因,可以使用计算函数,而不是在数据中使用两个数组。

    methods: {
        select(project) {
            project.selected = true
        }
    },
    computed: {
        selectedProjects () {
            return this.projects.filter(project => project.selected)
        }
    }
    
        2
  •  2
  •   Brian Lee    7 年前

    您的想法是对的,只需添加一个click处理程序和一个$ref:

    @click="onProjectClicked(project.id)" ref="`project${project.id}`"
    

    实施方法:

    methods: {
      onProjectClicked(id) {
         this.selectedProjects.push(id)
         this.$refs[`project${id}`].$el.addClass('selected')
      }
    }
    
        3
  •  2
  •   Husam Ibrahim    7 年前

    isSelected (默认为false)。然后你可以做以下事情。。

    <div v-for="project in projects" class="project" :class="{selected: project.isSelected}" @click="handleClick(project)">
        <p><i class="fa fa-folder"></i>{{project.name}}</p>
    </div>
    

      methods: {
        handleClick(project) {
          project.isSelected = !project.isSelected
          if (project.isSelected) {
            this.selectedProjects.push(project.id)
          } else {
            this.selectedProjects.splice(this.selectedProjects.indexOf(project.id), 1)
          }
    
        }
      }