vue computed计算属性显示undefined的解决

 更新时间:2023年11月16日 17:19:33   作者:小小菜鸟在加油  
这篇文章主要介绍了vue computed计算属性显示undefined的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue computed计算属性显示undefined

在做三级联动菜单页面的时候,之前的几个报错都解决了,终于没有报错了,控制台干干净净,最后菜单却没显示出来,用vue开发者工具一看,三级联动的模块里,计算属性显示undefined。

在计算属性里console了一下,数组什么的都能在控制台输出,发现数据明明是传过来了的,

尴尬,原来是搞各种bug,console来console去的把计算属性的return整没了。

computed:{
    ...mapState({
      categoryList:(state)=>{
        // console.log(state.home.categoryList)
        state.home.categoryList
      }
    })
  }

加上return就恢复了。

computed:{
    ...mapState({
      //state的括号可以去掉,函数的大括号可以去掉
      categoryList:(state)=>{
        // console.log(state.home.categoryList);
        return state.home.categoryList;
      }
    })
  }

nice,我是伞兵。

vue computed 使用避坑

其实不是 computed 的坑,是我自己没弄清原理瞎用,导致出现各种问题。。

<template>
  <section>
    <input type="button" value="查看三个list的值" @click="lookOneLook" />
    <div>
      list1:
      <span v-for="(o, index) in list1" :key="'list1' + index">
        {{ o }}
      </span>
    </div>
    <div>
      list2:
      <span v-for="(o, index) in list2" :key="'list2' + index">
        {{ o }}
      </span>
      <input type="button" value="向list2中push" @click="list2.push(5)" />
    </div>
    <div>
      list3:
      <span v-for="(o, index) in list3" :key="'list3' + index">
        {{ o }}
      </span>
      <input type="button" value="向list3中push" @click="list3.push(6)" />
    </div>
  </section>
</template>

<script>
export default {
  computed: {
    list2: {
      get() {
        return this.list1;
      },
      set(val) {
        alert("触发list2的setter");
        this.list1 = val;
      },
    },
    list3: {
      get() {
        return this.list1.map((o) => o);
      },
      set(val) {
        alert("触发list3的setter");
        this.list1 = val;
      },
    },
  },
  data() {
    return {
      list1: [1, 2, 3, 4],
    };
  },
  methods: {
    lookOneLook() {
      alert(`
      list1 : ${this.list1}
      list2 : ${this.list2}
      list3 : ${this.list3}`);
    },
  },
};
</script>

list2.push 和 list3.push 都没有触发的 computed setter。对于引用类型的计算属性,只有 list2=... 这样修改引用地址,才会触发 setter

  • list2.push():能成功修改三个list的值。因为 list2 和 list1 是相同的引用地址,list2.push 此时等价于 list1.push。list1变化后触发list3变化
  • list3.push():能成功修改自己,但是数据变化没有触发视图的自动更新。是因为 computed 只是个 Watcher,自身没有绑定依赖,值变化不会触发视图的更新。所以在页面中看不到 list3 变化,只能在弹窗中看到 list3 的变化(因为弹窗是每次点击后当场取值的)
  • list2.push:此时list3 又变回去了

反思

对于引用类型的计算属性,只有 list2=… 这样修改引用地址,才会触发 setter

计算属性自己只是个 Watcher,不是像 props 和 data 那样的数据。所以绝对不要在计算属性上加自定义的属性,因为没有意义:

1. 它不是对象,没有依赖关系。数据变化,"依赖"不会更新

2. computed 内部关联的变量一旦变化,computed 的值就会重新计算,你自己添加的属性的修改就都没了。

下面的写法一有效,是因为引用相同,相当于什么都没干就是单纯起了个别名。这种起别名的操作以后少干,因为逻辑上很不清晰,复杂的工程中出了 bug 不好调。

computed:{
	options:{			
		// 写法一:test() 有效,是因为 this.options 和 this.userObj.options 是相同引用
		return this.userObj.options;
		/** 写法二:test() 无效
		return {
			name :this.userObj.options.name
		};*/
	}
}
methods:{
	test(){			
		this.options.name='1';	
	}
}```

computed 本质就是一个有 value 的 Watcher,别把它当数据用!!!

总结 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue中如何动态拼接this后面的变量

    vue中如何动态拼接this后面的变量

    这篇文章主要介绍了vue中如何动态拼接this后面的变量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Vue3+Element-plus项目自动导入报错的解决方案

    Vue3+Element-plus项目自动导入报错的解决方案

    vue3出来一段时间了,element也更新了版本去兼容vue3,下面这篇文章主要给大家介绍了关于Vue3+Element-plus项目自动导入报错的解决方案,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue 非常实用的自定义指令分享

    Vue 非常实用的自定义指令分享

    这篇文章主要介绍了Vue 非常实用的自定义指令分享,Vue自定义指令有全局注册和局部注册两种方式,在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令,下文小编给大家分享那些常用到的Vue自定义指令
    2022-02-02
  • vue打包添加gzip配置项方式

    vue打包添加gzip配置项方式

    这篇文章主要介绍了vue打包添加gzip配置项方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • vue中ref标签属性和$ref的关系解读

    vue中ref标签属性和$ref的关系解读

    这篇文章主要介绍了vue中ref标签属性和$ref的关系,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 解决vue.js在编写过程中出现空格不规范报错的问题

    解决vue.js在编写过程中出现空格不规范报错的问题

    下面小编就为大家带来一篇解决vue.js在编写过程中出现空格不规范报错的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 一篇文章,教你学会Vue CLI 插件开发

    一篇文章,教你学会Vue CLI 插件开发

    这篇文章主要介绍了Vue CLI插件开发,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Vue之组件的自定义事件详解

    Vue之组件的自定义事件详解

    这篇文章主要为大家介绍了Vue之组件的自定义事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Vue 3集成海康Web插件实现视频监控功能

    Vue 3集成海康Web插件实现视频监控功能

    本文详细介绍了如何使用 Vue 3 框架集成海康Web插件实现视频监控功能,通过定义属性、事件、变量,以及编写初始化、播放视频、处理节点点击事件等方法,我们成功实现了视频监控系统的前端部分,感兴趣的朋友一起看看吧
    2024-11-11
  • Vue中如何获取json文件中的数据

    Vue中如何获取json文件中的数据

    访问百度音乐API需要传递音乐类型参数,而这些参数是存在musictype.json中,现在在组件listcate.vue需要获取json数据,如何实现呢,下面小编给大家带来了Vue中如何获取json文件中的数据,感兴趣的朋友一起看看吧
    2022-09-09

最新评论