经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
vue3使用reactive包裹数组正确赋值问题
来源:jb51  时间:2023/3/6 9:12:55  对本文有异议

使用reactive包裹数组正确赋值

需求:将接口请求到的列表数据赋值给响应数据arr

  1. const arr = reactive([]);
  2. const load = () => {
  3. const res = [2, 3, 4, 5]; //假设请求接口返回的数据
  4. // 方法1 失败,直接赋值丢失了响应性
  5. // arr = res;
  6. // 方法2 这样也是失败
  7. // arr.concat(res);
  8. // 方法3 可以,但是很麻烦
  9. res.forEach(e => {
  10. arr.push(e);
  11. });
  12. };

vue3使用proxy,对于对象和数组都不能直接整个赋值。

使用方法1能理解,直接赋值给用reactive包裹的对象也不能这么做。

方法2为什么不行?

只有push或者根据索引遍历赋值才可以保留reactive数组的响应性?

如何方便的将整个数组拼接到响应式数据上?

提供几种办法

  1. const state = reactive({
  2. arr: []
  3. });
  4. state.arr = [1, 2, 3]

或者

  1. const state = ref([])
  2. state.value = [1, 2, 3]

或者

  1. const arr = reactive([])
  2. arr.push(...[1, 2, 3])

这几种办法都可以触发响应性,推荐第一种

vue3的reactive重新赋值无效

vue3官方的文档说明

reactive() 返回一个对象的响应式代理

所以 reactive 方法应该作用于一个对象Object,如果要使用数组,则需要包装一下:

  1. let list = reactive({
  2. ?? ?data: [{id: 01, name: 'XXX'}]
  3. })

或者使用 ref:

  1. let list = ref([{id: 1, name: 'Andy'}])

已下引用原作者的代码:

  1. import { reactive, ref } from 'vue'
  2. export default {
  3. ? setup() {
  4. ? ? // 需要一个带默认值的数组list;
  5. ? ?? ?let list = reactive([{id: 1, name: 'Andy'}])
  6. ? ??
  7. ? ? // 每次触发事件重置list,把新值放入,此种方式不会触发视图更新
  8. ? ? const checkBtn = () => {
  9. ? ? ? // 此时重置操作 地址指向变成一个新的地址,不会触发视图更新
  10. ? ? ? list = [{id: 1, name: 'Andy'}]
  11. ? ? ? list.push({id: 2, name: 'Lucy'})
  12. ? ? }
  13. ? ??
  14. ? ? // --------------------------------------------------
  15. ? ? // 正确的重置处理方法如下:使用reactive将数组包裹到一个对象中
  16. ? ? let list = reactive({
  17. ? ? ? data: [{id: 1, name: 'Andy'}]
  18. ? ? });
  19. ? ? const checkBtn = () => {
  20. ? ? ? list.data = [{id: 1, name: 'Andy'}]
  21. ? ? ? list.data.push({id: 2, name: 'Lucy'})
  22. ? ? }
  23. ? ? // 或者使用ref
  24. ? ? let list = ref([{id: 1, name: 'Andy'}]);
  25. ? ? const checkBtn = () => {
  26. ? ? ? list.value = [{id: 1, name: 'Andy'}]
  27. ? ? ? list.value.push({id: 2, name: 'Lucy'})
  28. ? ? }
  29. ? ? return {
  30. ? ? ? list,
  31. ? ? ? checkBtn
  32. ? ? }
  33. ? },
  34. }

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号