vuex state中的数组变化监听实例

关于Vuex state中的数组变化监听,可以使用Vue提供的watch方法监听数组变化。

先来简单介绍一下实现的方法:

  1. 在state定义的数组数据前加上$符号,例如:$list

  2. 监听数据的方式:

    // 监听数据变化
    watch: {
        '$store.state.list': {
            handler: function (newValue, oldValue) {
                console.log('watch state changed:', newValue, oldValue);
            },
            deep: true
        }
    }

这里需要注意几点:

  1. 监听数组数据时需要使用deep:true,因为Vue默认只是浅层监测,只有在值为基本数据类型时才能被监测到,而不是对象或者数组;

  2. 这里使用的是Vue中的$watch方法,而不是Vuex中的watch方法,因为Vuex中的watch方法只能处理同步操作。

下面提供两个示例:

一. 会计记录表

// state
const state = {
  $records: [
    {id: 1, name: '张三', amount: 100},
    {id: 2, name: '李四', amount: 200},
    {id: 3, name: '王五', amount: 50},
  ]
}

// getters
const getters = {}

// mutations
const mutations = {
  addRecord(state, record) {
    // 新增记录
    state.$records.push(record)
  },
  deleteRecord(state, id) {
    // 删除记录
    const index = state.$records.findIndex(record => record.id === id)
    state.$records.splice(index, 1)
  },
  updateRecord(state, record) {
    // 更新记录
    const index = state.$records.findIndex(r => r.id === record.id)
    state.$records.splice(index, 1, record)
  },
}

// 记录列表
Vue.component('record-list', {
  template: `
    <div>
      <table>
        <thead>
          <tr>
            <th>ID</th><th>姓名</th><th>金额</th><th>操作</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="record in $records" :key="record.id">
            <td>{{ record.id }}</td>
            <td>{{ record.name }}</td>
            <td>{{ record.amount }}</td>
            <td>
              <button @click="edit(record)">编辑</button>
              <button @click="deleteRecord(record.id)">删除</button>
            </td>
          </tr>
        </tbody>
      </table>
      <button @click="add">新增</button>
    </div>
  `,
  data() {
    return {
      record: {}
    }
  },
  computed: {
    $records() {
      return this.$store.state.$records
    }
  },
  methods: {
    add() {
      this.record = {}
      this.$store.commit('addRecord', this.record)
    },
    edit(record) {
      this.record = Object.assign({}, record)
    },
    deleteRecord(id) {
      this.$store.commit('deleteRecord', id)
    }
  },
  // 监听数据
  watch: {
    '$store.state.$records': {
      handler: function (newValue, oldValue) {
        console.log('watch state changed:', newValue, oldValue);
      },
      deep: true,
    }
  }
})

这是一个会计记录表的示例,其中state中包含一个$records数组,该数组包含所有的会计记录。组件中定义了记录列表,并提供了和该表格相关的操作,包括新增、编辑和删除记录。同时使用watch方法来监测到该列表的变化。

二. 订单列表

// state
const state = {
  $orders: [
    {id: 1, name: '订单1', products: ['产品1', '产品2']},
    {id: 2, name: '订单2', products: ['产品3', '产品4']},
    {id: 3, name: '订单3', products: ['产品5', '产品6']},
  ]
}

// getters
const getters = {}

// mutations
const mutations = {
  addOrder(state, order) {
    // 新增订单
    state.$orders.push(order)
  },
  deleteOrder(state, id) {
    // 删除订单
    const index = state.$orders.findIndex(order => order.id === id)
    state.$orders.splice(index, 1)
  },
  updateOrder(state, order) {
    // 更新订单
    const index = state.$orders.findIndex(o => o.id === order.id)
    state.$orders.splice(index, 1, order)
  },
}

// 订单列表
Vue.component('order-list', {
  template: `
    <div>
      <table>
        <thead>
          <tr>
            <th>ID</th><th>名称</th><th>产品列表</th><th>操作</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="order in $orders" :key="order.id">
            <td>{{ order.id }}</td>
            <td>{{ order.name }}</td>
            <td>{{ order.products.join(', ') }}</td>
            <td>
              <button @click="edit(order)">编辑</button>
              <button @click="deleteOrder(order.id)">删除</button>
            </td>
          </tr>
        </tbody>
      </table>
      <button @click="add">新增</button>
    </div>
  `,
  data() {
    return {
      order: {}
    }
  },
  computed: {
    $orders() {
      return this.$store.state.$orders
    }
  },
  methods: {
    add() {
      this.order = {}
      this.$store.commit('addOrder', this.order)
    },
    edit(order) {
      this.order = Object.assign({}, order)
    },
    deleteOrder(id) {
      this.$store.commit('deleteOrder', id)
    }
  },
  // 监听数据
  watch: {
    '$store.state.$orders': {
      handler: function (newValue, oldValue) {
        console.log('watch state changed:', newValue, oldValue);
      },
      deep: true,
    }
  }
})

这是一个订单列表的示例,其中state中包含一个$orders数组,该数组包含所有的订单信息,包括名称和产品列表。组件中定义了订单列表,并提供了常见的订单操作,包括新增、编辑和删除订单信息,同时也使用watch方法来监测到该列表的变化。

以上就是Vuex state中的数组变化监听实例的详细攻略,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vuex state中的数组变化监听实例 - Python技术站

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

相关文章

  • vue 通过绑定事件获取当前行的id操作

    下面是详细讲解“Vue 通过绑定事件获取当前行的 ID 操作”的完整攻略。 步骤一:初始化 Vue 项目 首先,在本地安装 Vue.js。这里我以 Vue CLI 为例,使用以下命令来初始化一个 Vue 项目: vue create vue-event-demo 然后进入项目目录并启动项目: cd vue-event-demo npm run serve 步…

    Vue 2023年5月28日
    00
  • 构建大型 Vue.js 项目的10条建议(小结)

    当构建大型 Vue.js 项目时,有一些建议可以帮助你避免一些常见的问题和错误。以下是构建大型 Vue.js 项目的10条建议: 使用组件化设计:将UI组件分解为更小的组件,提高组件复用性。 Vuex状态管理方案:将应用程序的状态集中在一个地方进行管理,方便协作和调试。 使用 Vue CLI 3:提供各种脚手架、插件和构建工具,使构建应用程序更简单。 使用 …

    Vue 2023年5月27日
    00
  • vue3使用vis绘制甘特图制作timeline可拖动时间轴及时间轴中文化(推荐)

    下面我会详细讲解使用Vue3和vis库绘制甘特图制作timeline可拖动时间轴及时间轴中文化的攻略。 1. 安装vis库 vis库是一个用于数据可视化的JavaScript库,可以使用它创建各种类型的图表和视图。在Vue3项目中使用vis库,可以通过以下命令进行安装: npm install vis 2. 创建Vue3组件 接下来创建一个Vue3组件,用于…

    Vue 2023年5月29日
    00
  • Vue3.2单文件组件setup的语法糖与新特性总结

    下面是详细讲解“Vue3.2单文件组件setup的语法糖与新特性总结”的完整攻略。 Vue3.2单文件组件setup的语法糖与新特性总结 简介 在Vue 3.0中,使用Composition API可以实现更高效、更灵活的编码方式。而在Vue 3.2版本中,新增了setup语法糖和其他新特性,极大地简化了开发setup函数的方式。 setup语法糖 ❌ Vu…

    Vue 2023年5月28日
    00
  • vue-print-nb实现页面打印功能实例(含分页打印)

    让我来详细讲解一下“vue-print-nb实现页面打印功能实例(含分页打印)”的完整攻略。 1. 引入 vue-print-nb 首先,需要在 Vue 项目中引入 vue-print-nb 插件,可以使用 npm 或 yarn 进行安装: npm install vue-print-nb –save 或 yarn add vue-print-nb 引入方…

    Vue 2023年5月27日
    00
  • 深入了解vue-router原理并实现一个小demo

    介绍 Vue-Router 是 Vue.js 官方的路由管理器,它和 Vue.js 核心深度集成,让构建单页面应用变得易如反掌。Vue-Router 提供了两种模式:Hash 模式和 History 模式。Hash 模式下,URL 中的 Hash 值(#)用来模拟传统意义上的路由,而在 History 模式下,使用了 HTML5 History API 中新…

    Vue 2023年5月28日
    00
  • vue的异步数据更新机制与$nextTick用法解读

    让我来详细地讲解一下“Vue的异步数据更新机制与$nextTick用法解读”。 异步更新机制 在Vue中,数据更新是异步进行的。这是因为当我们修改数据后,Vue并不会立即去更新所有相关的视图,而是先把这些更新放在一个队列里,等到下一个事件循环时再去执行更新操作。这样做的好处是可以避免不必要的DOM操作,提高性能,同时也可以确保在修改数据后能够得到最新的视图。…

    Vue 2023年5月27日
    00
  • Vue中的ESLint配置方式

    ESLint是一个用于在JavaScript代码中标识和报告模式匹配的工具。它可以在代码编写过程中自动运行并向你指出潜在的问题和错误。对于Vue项目,我们可以使用ESLint来对代码进行检查和规范化。本文将介绍在Vue中配置ESLint的方式。 安装 首先,我们需要在vue项目中安装eslint包。可以使用npm或者yarn进行安装: npm install…

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