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

切换 Vue JS 中单个元素的类

锺霍英
2023-03-14

我有一个待办事项列表,它是通过jsonplace生成的,点击按钮用虚拟内容填充div。

我试图实现的是,当我点击单个div(任务)时,它应该被删除/隐藏。

迄今

<button id="btn" v-on:click= 'getTodo'>Show Todo</button>
    <div id="jsonData" v-for = 'todo in todos' >
        <ul v-bind:class = '{active: isActive}' v-on:click = 'removeTask'>
            <li>{{todo.title}} </li>
            <li id="status"> Task Status : {{todo.completed}} </li>
        </ul>
    </div>

JS

var vm =  new Vue({
el: '#app',
data() {
    return {
        todos: [],
        isActive: false
    }
},
methods: {
    getTodo: function() {
        axios.get('https://jsonplaceholder.typicode.com/todos')
        .then((response) => {
            this.todos = response.data;
        })
    },
    removeTask: function() {
        this.isActive = !this.isActive;
    }
}

})

“removeTask”事件处理程序为所有生成的div(任务)而不是单击的div切换类。

如何在单击的div上添加/删除类?

共有2个答案

曹建华
2023-03-14

isActive 是整个实例的一个实例,而不是每个单独的待办事项。

您需要做的是通过映射响应数据或简单地使用响应数据的< code>completed属性来填充to do列表。

{
    "userId": 10,
    "id": 193,
    "title": "rerum debitis voluptatem qui eveniet tempora distinctio a",
    "completed": true
}

响应待办事项的每个项目都有已完成的 prop,因此您可以使用该 prop。

这就是你要做的:

var vm = new Vue({
  el: '#app',
  data() {
    return {
      todos: []
    }
  },
  methods: {
    getTodo: function() {
      axios.get('https://jsonplaceholder.typicode.com/todos')
        .then((response) => {
          this.todos = response.data;
        })
    },
    toggleCompleted: function(todo) {
      todo.completed = !todo.completed;
    }
  }

})
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.15/dist/vue.js"></script>
<div id="app">
  <button id="btn" v-on:click='getTodo'>Show Todo</button>
  <div id="jsonData" v-for='todo in todos'>
    <ul v-bind:class='{active: todo.completed}' v-on:click='toggleCompleted(todo)'>
      <li>{{todo.title}} </li>
      <li id="status"> Task Status : {{todo.completed ? 'Completed' : 'Active'}} </li>
    </ul>
  </div>
</div>
鲁滨海
2023-03-14

使用axios API,我获取待办事项,并务实地循环访问各个待办事项,并将isActive prop应用于所有这些待办事项。现在,在将待办事项 ID 传递给方法时,可以通过切换待办事项来切换这些道具。:-)

请注意,我在< code>ul上应用了< code > v-if = " todo . is active " ,如果您想要应用一些样式,例如用于过渡等,这也可以翻译为< code >:class = " { active:todo . is active } " 。

通过使用这种方法,您可以使用相同的逻辑来创建方法,例如完成Todo远程Todo

我添加了一个< code>showList属性来显示/隐藏实际的完整列表。

我注意到你使用了< code>v-bind和< code>v-on -这是绝对有效的,但是VUE ^2.0可以处理速记绑定:-)

我还注意到您在HTML属性中使用引号...虽然这不会破坏您的标记,但我认为将它们保留为双引号是最佳做法。

var vm =  new Vue({
  el: '#app',
  data: {
    todos: [],
    showList: false
  },
  mounted () {
    this.getTodos()
  },
  methods: {
    getTodos () {
      axios.get('https://jsonplaceholder.typicode.com/todos')
      .then(res => {
        res.data = res.data.map(todo => {
          todo.isActive = false
          return todo
        })

        this.todos = res.data
      })
    },
    showTodos () { this.showList = !this.showList },
    toggleTodo (id) {
      this.todos = this.todos.map(todo => {
        if (todo.id === id) {
          todo.isActive = !todo.isActive
        }
        return todo
      })
    }
  }
})
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.15/dist/vue.js"></script>


<div id="app">
  <button @click="showTodos()">{{this.showList ? 'Hide' : 'Show'}} Todos</button>
  <div v-if="todos.length && showList" v-for="todo in todos">
    <button id="btn" @click="toggleTodo(todo.id)">Toggle Todo</button>

    <ul v-if="todo.isActive" :class="{active: todo.isActive}">
      <li>{{todo.title}} </li>
      <li id="status"> Task Status : {{todo.completed}} </li>
    </ul>
  </div>
</div>

<style lang="css">
  .active {
    border: 2px solid green;
  }
</style>
 类似资料:
  • 问题内容: 如何使用ng-click分别在几个元素上切换类? 在这个问题中,点击切换类是这样完成的: CSS: JS: HTML: 但是,如果我有几个按钮,每个按钮都应通过ng-click切换自己的类,该怎么办? 如果以这种方式设置它: HTML: 如果我按下两个按钮,则两个按钮都将切换。 我知道一种解决方法是为每个按钮定义一个自己的ng-click事件(对于button1,例如f.ex togg

  • 切换一个元素的样式类。 使用 element.classList.toggle() 来切换元素中指定样式类。 const toggleClass = (el, className) => el.classList.toggle(className); toggleClass(document.querySelector('p.special'), 'special'); // The parag

  • 我已经创建了一组问题和答案,每个问题旁边是一个img,每当有人点击一个问题时,我会尝试切换该图像的src。到目前为止,因为问题存储在nodelist中,我设法让图像切换,但它切换了所有的图像,我只想让我点击的问题切换存储在里面的图像。 null null

  • 我有一些jQuery,可以将定义列表转换为可扩展/可折叠的常见问题列表。 我在整个网站上有几个常见问题的链接,点击它们会将您发送到常见问题页面并展开相关问题,问题是一些常见问题的答案有指向其他问题的链接,而散列链接会跳到相关问题,但不会展开答案。 这是因为jQuery位于$(文档)中。就绪(function(),因此代码仅在页面重新加载后激活?是否需要触发重新加载? CHeers 有关完整代码,请

  • 我得到了一个元素数组,我在页面上显示,使用 v-for: 现在我决定添加类别并仅显示数组中某些类别的报价(数据类似于: - 类别 1; - 类别 2 等... 所以我添加了最简单的v-Show元素,如下所示: 和特殊变量(从选择中获取值) 其中函数 checkArray 只是检查 specialityID 是否与 offer.speciality[i] 相同,并向 元素返回 true 或 fals

  • 问题内容: 这个带有添加功能的删除技巧如何工作? 似乎它正在抓取第一个元素(空数组)之前的所有内容 然后将所有内容附加在第一个元素之后(位置零) …(点对点)有什么作用? 问题答案: 切片在哪里,是要删除的元素的索引: 是Go中可变参数的语法。 基本上,在 定义 函数时,它将把您传递的所有参数放入该类型的一个切片中。这样,您可以传递任意数量的参数(例如,可以传递任意数量的参数)。 现在,当 调用