javascript - vuejs中的Array.prototype.splice和arr.splice有什么区别?

标签 javascript vue.js vuejs2

代码:(vue2.0, vue-router)

<template>
 <a v-for="apiItem in allApis" href="#"></a>
</template>
<script>
  computed: mapGetters([
    'allApis'
  ]),
</script>

store/modules

const mutations {
  myMutation(state) {
    state.apis.splice(0, 1) // A
    //Array.prototype.splice.call(state.apis, 0, 1); //B
  }
}
const getter = {
  allApis: (state) => {
    return state.apis
  }
}
export default {
  state,
  getters,
  actions,
  mutations
}

A 行 将更改allApis 并更新 View

但是B行不会改变allApi并更新 View ;

最佳答案

是的,state.apis.splice(0, 1) 将起作用,因为 Vue 会拦截变异方法并发出事件,如您在 code 中所见.

const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)
/**
 * Intercept mutating methods and emit events
 */
;[
  'push',
  'pop',
  'shift',
  'unshift',
  'splice',
  'sort',
  'reverse'
]
.forEach(function (method) {
  // cache original method
  const original = arrayProto[method]

正如您在源代码中看到的:arrayMethods 是原始的 Array 原型(prototype)方法,正在被覆盖以提供 vue 的 react 功能,因此使用 Array.prototype 会遗漏行为 vue 定义。

来自documentation :

Vue wraps an observed array’s mutation methods so they will also trigger view updates.

关于javascript - vuejs中的Array.prototype.splice和arr.splice有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41500958/

相关文章:

javascript - 如何在 chart.js 中从 Canvas 制作内部填充?

javascript - 如何从 Controller 调用 Angular 服务?

javascript - 我应该如何将 HTML/CSS 内容发送到服务器?

ajax - 使用 Axios 在 Vue.js 中取消多个 API 调用

vue.js - 如何将进度条添加到 vue-strap 轮播 slider ?

javascript - 元素没有出现在包装器中,它们在下面

javascript - Vue.js 和 Vuex - 将访问 token 存储在商店中并将用户重定向到 URL 进行登录

javascript - 使用来自 API 响应的数据在 Nuxt JS 应用程序中的 <head> 标记内注入(inject)动态内容

javascript - 如何在按钮标签中添加条件? (vue.js 2)

javascript - 从 http ://localhost:8080 请求时不允许 Apache 服务器方法