Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript vuejs中的Array.prototype.splice和arr.splice有什么区别?_Javascript_Vue.js_Vuejs2 - Fatal编程技术网

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

Javascript vuejs中的Array.prototype.splice和arr.splice有什么区别?,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,代码:(vue2.0,vue路由器) <template> <a v-for="apiItem in allApis" href="#"></a> </template> <script> computed: mapGetters([ 'allApis' ]), </script> 行A将更改allApis并更新视图 但是行B不会更改allApi并更新视图 是的,state.api.splice(0,1)

代码:(vue2.0,vue路由器)

<template>
 <a v-for="apiItem in allApis" href="#"></a>
</template>
<script>
  computed: mapGetters([
    'allApis'
  ]),
</script>
行A
将更改
allApis
并更新视图


但是
行B
不会更改
allApi
并更新视图

是的,
state.api.splice(0,1)
将起作用,因为Vue拦截变异方法并发出事件,您可以在中看到这一点

正如您在源代码中看到的:
arrayMethods
是原始的数组原型方法,它们被覆盖以提供vue的反应功能,因此使用
Array.prototype
会忽略vue定义的行为

从:

Vue包装了观察到的阵列的变异方法,因此它们也将触发视图更新


您是对的,但不管您是否意识到,您缺少了一个要点,即在您引用的源代码中,
export const arrayMethods=Object.create(arrayProto)
正在为数组创建一个新的原型,因此使用
Array.prototype
会忽略vue定义的行为。@PanJunjie潘俊杰 是的,这就是我在这里要指出的,你可以通过这些函数获得额外的功能,而这些函数在
数组中没有。prototype
,可能我在这个答案中不是很清楚,会显式地添加它。
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
}
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]