vue.set向对象里增加多层数组属性不生效问题及解决

yizhihongxing

首先我们来分析一下“vue.set向对象里增加多层数组属性不生效问题”的原因:

Vue.js在处理对象和数组时,会对其进行深拷贝。Vue.js中使用Object.defineProperty方法将属性转化为getter/setter,从而在获取属性值和设置属性值时,都可监听到并作出反应。但是在对象和数组中需要添加新属性或元素时,Vue.js就无法进行响应处理,从而导致数据不会更新。

因此,我们需要使用Vue.js提供的vue.set方法,其可实现在对象和数组中添加新属性或元素,同时仍然保持响应性。不过在使用这个方法时,需要特别注意中间的key路径需要存在,如果中间某一层路径不存在,是无法添加新属性的,因此在需要向深层次嵌套的对象或数组中添加新属性时,需要特别注意处理中间路径的问题。

下面我们来看两个示例说明:

示例一:

<template>
  <div>
    <h2>商品列表:</h2>
    <ul>
      <li v-for="(product, index) in products" :key="product.id">
        <span>商品名称:{{ product.name }}</span>
        <button @click="addSpec(index)">添加规格</button>
        <ul>
          <li v-for="spec in product.specs" :key="spec.id">{{ spec.name }}</li>
        </ul>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: 'ProductList',
  data() {
    return {
      products: [
        {
          id: 1,
          name: '商品1',
          specs: [
            { id: 1, name: '规格1' },
            { id: 2, name: '规格2' }
          ]
        },
        {
          id: 2,
          name: '商品2',
          specs: [
            { id: 3, name: '规格3' },
            { id: 4, name: '规格4' }
          ]
        }
      ]
    }
  },
  methods: {
    addSpec(index) {
      let spec = { id: 5, name: '规格5' }
      // 以下代码无法实现新增 spec 属性
      // this.products[index].specs.push(spec)
      // 以下代码可实现新增 spec 属性
      this.$set(this.products[index].specs, this.products[index].specs.length, spec)
    }
  }
}
</script>

在上面的示例中,我们在商品列表中加了一个“添加规格”的按钮,点击后会向该商品的规格列表中添加新规格。

由于规格列表是一个数组,所以我们需要使用vue.set方法来添加新规格,而不是直接使用push方法来添加。注意,在使用vue.set方法时,需要传入三个参数,分别是被操作的数组、新增元素的下标以及新增元素本身。

示例二:

<template>
  <div>
    <h2>学生成绩:</h2>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>语文</th>
          <th>数学</th>
          <th>英语</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(student, index) in students" :key="student.id">
          <td>{{ student.name }}</td>
          <td>{{ student.score.chinese }}</td>
          <td>{{ student.score.math }}</td>
          <td>{{ student.score.english }}</td>
          <td><button @click="addScore(index)">添加成绩</button></td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
  name: 'ScoreList',
  data() {
    return {
      students: [
        {
          id: 1,
          name: '张三',
          score: {
            chinese: 80,
            math: 90,
            english: 70
          }
        },
        {
          id: 2,
          name: '李四',
          score: {
            chinese: 85,
            math: 75,
            english: 90
          }
        }
      ]
    }
  },
  methods: {
    addScore(index) {
      let score = { chinese: 95, math: 80, english: 85 }
      // 以下代码无法实现新增 score 属性
      // this.students[index].score = score
      // 以下代码可实现新增 score 属性
      this.$set(this.students[index], 'score', score)
    }
  }
}
</script>

在上面的示例中,我们在成绩表格中加了一个“添加成绩”的按钮,点击后会修改该学生的成绩信息。

由于成绩信息是一个嵌套对象,所以我们需要使用vue.set方法来添加新成绩,而不是直接修改score属性的值。注意,在使用vue.set方法时,需要传入两个参数,分别是被操作的对象和新增属性的名称。

通过以上两个示例,我们可以看到,在向多层嵌套的对象或数组中添加新属性时,如果直接使用push方法或赋值语句来添加新元素,Vue.js的响应机制是无法正常工作的。此时,我们必须使用Vue.js提供的vue.set方法来进行添加新元素的操作,才能确保数据的响应性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue.set向对象里增加多层数组属性不生效问题及解决 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • 如何在 Vue 中使用 Axios 异步请求API

    下面我来详细讲解一下如何在 Vue 中使用 Axios 异步请求 API 的完整攻略。 1. 安装 Axios 在使用 Axios 之前,我们需要先安装它。可以通过 npm 安装: npm install axios –save 或者通过 yarn 安装: yarn add axios 2. 在 Vue 中使用 Axios 在 Vue 中使用 Axios …

    Vue 2023年5月28日
    00
  • 解决element DateTimePicker+vue弹出框只显示小时

    要解决element DateTimePicker+vue弹出框只显示小时的问题,可以按照以下步骤操作: 1. 引用element-ui库和相关组件 首先,在Vue项目中引入element-ui库,并按需引入DatetimePicker组件。 <template> <div> <el-date-picker v-model=&q…

    Vue 2023年5月29日
    00
  • AntV+Vue实现导出图片功能

    AntV 是 Ant Design 团队出品的数据可视化解决方案,而 Vue 是当下广泛使用的前端框架之一。本文将介绍如何在 Vue 项目中使用 AntV 实现导出图片功能。具体实现流程如下: 1. 环境搭建 在 Vue 项目中使用 AntV,需要先安装 @antv/g2 和 @antv/data-set 两个依赖包: npm install @antv/g…

    Vue 2023年5月28日
    00
  • 详解在vue-cli中使用graphql即vue-apollo的用法

    下面我将详细讲解vue-cli中使用graphql及vue-apollo的用法。具体步骤如下: 环境准备 在使用vue-cli和vue-apollo之前,需要先安装Node.js和npm。这里推荐使用最新版本的Node.js和npm。 安装vue-cli Vue-cli是Vue.js官方提供的工具,用于快速搭建Vue.js项目。通过vue-cli可以帮助我们…

    Vue 2023年5月28日
    00
  • vuejs element table 表格添加行,修改,单独删除行,批量删除行操作

    以下是“vuejs element table 表格添加行,修改,单独删除行,批量删除行操作”的攻略。 添加行 要添加行,首先需要在data中定义一个空的数组来存放表格数据。然后,在模板中使用el-table组件和el-table-column组件来渲染表格,并给el-table组件绑定数据源。 接下来,我们可以在模板中添加一个类似“添加行”的按钮,当用户点…

    Vue 2023年5月28日
    00
  • Vue组件库发布到npm详解

    Vue组件库是一种能够提供多种可重用组件的集合,可以方便地在不同项目中使用。将Vue组件库发布到npm(Node.js包管理器)上能够让其他开发者更加方便地使用你的组件库。下面是发布Vue组件库的详细攻略: 步骤1:创建Vue组件库 首先,使用Vue CLI创建一个新的Vue项目,这个项目将作为你的Vue组件库的代码库。之后,你需要将你的Vue组件定义为一个…

    Vue 2023年5月28日
    00
  • 详解Axios统一错误处理与后置

    详解Axios统一错误处理与后置的完整攻略 概述 Axios是一个功能强大的HTTP请求库,它支持浏览器和Node.js环境。在实际开发中我们经常需要发起网络请求,而Axios不仅在API设计上极其灵活,而且对于统一的错误处理和请求后置处理提供了方便的功能。 本文将详细讲解如何使用Axios实现统一的错误处理和请求后置处理,本文涵盖以下内容: 错误处理的需求…

    Vue 2023年5月28日
    00
  • springboot vue测试平台接口定义前后端新增功能实现

    下面我将详细讲解“springboot vue测试平台接口定义前后端新增功能实现”的完整攻略,这包括如何进行前后端的接口定义以及新增功能的开发实现。具体攻略如下: 1. 环境准备 在开始之前,需要确保本机已经安装了以下环境: JDK 8或以上版本 Node.js 8或以上版本 Vue CLI IntelliJ IDEA 或其他java开发工具 VS Code…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部