You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular数组中特定属性为true的元素长度双向绑定实现

实现响应式统计通过学生数量的方案

嘿,这个需求在Vue里用**计算属性(computed)**就能完美解决,它天生就是为这种依赖响应式数据动态计算的场景设计的,而且能自动追踪数据变化,实时更新结果~

核心思路

计算属性会自动监听它依赖的响应式数据(这里就是你的students数组),当数组内容发生变化时,会重新计算结果并更新到页面上,完全符合你要的“自动更新”需求。


Vue 3(Composition API)写法

如果用的是Vue 3的<script setup>语法,代码示例如下:

<script setup>
import { ref, computed } from 'vue'

// 用ref包裹数组,保持响应式
const students = ref([
  {name:'Jordan', passed:true}, 
  {name:'Kyle'},
  {name:'Jess'}, 
  {name:'Sam', passed:true}
])

// 定义计算属性,统计passed为true的学生数量
const passedStudentsCount = computed(() => {
  // 过滤出所有passed严格等于true的学生,然后取数组长度
  return students.value.filter(student => student.passed === true).length
})

// 模拟修改数组的方法(比如按钮触发)
const addPassedStudent = () => {
  students.value.push({ name: 'Mia', passed: true })
}

const toggleStudentStatus = (index) => {
  // 注意:修改对象时要创建新对象,确保Vue能检测到变化
  const targetStudent = students.value[index]
  students.value[index] = { ...targetStudent, passed: !targetStudent.passed }
}
</script>

<template>
  <!-- 直接渲染计算属性即可,数据变化时自动更新 -->
  <div>通过的学生总数:{{ passedStudentsCount }}</div>
  
  <!-- 测试用按钮,点击后会修改数组,触发计算属性更新 -->
  <button @click="addPassedStudent">添加一个通过的学生</button>
  <button @click="toggleStudentStatus(1)">切换Kyle的通过状态</button>
</template>

Vue 2(Options API)写法

如果还在使用Vue 2,写法如下:

<script>
export default {
  data() {
    return {
      students: [
        {name:'Jordan', passed:true}, 
        {name:'Kyle'},
        {name:'Jess'}, 
        {name:'Sam', passed:true}
      ]
    }
  },
  // 定义计算属性
  computed: {
    passedStudentsCount() {
      return this.students.filter(student => student.passed === true).length
    }
  },
  methods: {
    addPassedStudent() {
      this.students.push({ name: 'Mia', passed: true })
    },
    toggleStudentStatus(index) {
      // Vue 2中修改数组元素的属性,需要用$set或者替换整个对象
      const targetStudent = this.students[index]
      this.$set(this.students, index, { ...targetStudent, passed: !targetStudent.passed })
    }
  }
}
</script>

<template>
  <div>通过的学生总数:{{ passedStudentsCount }}</div>
  <button @click="addPassedStudent">添加一个通过的学生</button>
  <button @click="toggleStudentStatus(1)">切换Kyle的通过状态</button>
</template>

关键注意点

  1. 为什么用computed而不是methods?
    计算属性有缓存机制,只有当依赖的响应式数据变化时才会重新计算;而methods每次页面渲染都会执行,性能上computed更优,代码也更贴合“基于数据计算结果”的场景。
  2. 响应式修改数组/对象的规则
    • 修改数组时:尽量用Vue支持的变异方法(push/pop/splice等),或者直接替换整个数组
    • 修改对象时:Vue 3可以直接修改属性(因为用了Proxy),Vue 2则需要用$set或者创建新对象替换原对象,确保Vue能检测到变化

内容的提问来源于stack exchange,提问作者Rolando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:43:33