首页 > 其他分享 >坑:vue2在props时仅接受第一次返回数据的解决办法

坑:vue2在props时仅接受第一次返回数据的解决办法

时间:2023-07-31 13:45:02浏览次数:69  
标签:myList 时仅 使用 list vue2 props 组件 data

今天在做项目时遇到了一个bug,在列表页进入详情页时带入list以便子组件遍历使用,使用props传参,该list在父组件由created生命周期函数访问接口获取,然后子组件在使用时,直接使用props接收并调用,大概代码如下:

// 父组件

<Child :list='list' />

...
created(){
getListApi().then(list=>{
  this.list = list
})
}

//

...
props:{
list:{
type:Array,
default:()=>[]
}
},

methods:{
loadList(){
// 遍历list以获取对应的name
}
}

遇到了一个问题:当返回到上一页也就是列表页的时候,子组件的的值渲染值并不是遍历得到的那个值,而是它的初值,但假如我手速够快返回的就正常了
经过一番扪心自问+毒打后得到了答案:

  1. 父组件的created在生命周期里只会执行一遍,但当我从下一页回退回来的时候,整个生命周期会被重新执行,这一点没有问题,问题在于使用props的传参方式
    props的方式传递给子组件,子组件只会接收一次,也就是说,假设第一次传递给子组件的是一个有长度的list是经过异步请求后的结果,那如果在未来得及请求接口的情况下(也就是手速够快),传递给子组件的就是[],而子组件的props仅接收来自父组件的第一次数据,因而导致了上面的bug
    过程不必多说(委屈屈就对了),接下来看解决方案:

方案1:
基于props方式仅接收第一次传递数据的方式,可以使用watch + data结合的方式,即使用props接收数据值记作1,data重新定义这个数据值记作2,watch在接听props1时重新将变化的值赋给data中的2,如此就可以解决这个问题

// 子组件

props:{
list:{
type:Array,
default:()=>[]
}
},
watch:{
list(n){
console.log(n)
console.log(this.myList) // 对比一下会发现,这是不一样的!!!我真的好委屈啊啊啊
this.myList = n  // 关键代码 将变化后的值重新赋给myList ,具体业务场景下,也可以判断如果有值再加 
}
},
data(){
return {
  myList:this.list
  }
}

方案2:
可以在父组件获取到数据时就将数据存入到vuex中,这样子组件在使用时就可以直接获取到list,不必再考虑还会有初始值的问题,至于vuex的刷新会失效问题,只需要寻找一款对应的vuex插件就可以解决。

以上。

标签:myList,时仅,使用,list,vue2,props,组件,data
From: https://www.cnblogs.com/hjk1124/p/17593215.html

相关文章

  • vue2集成simple-mind-map思维导图,实现在线制作思维导图
    1.使用组件组件源码版本licensesimple-mind-map地址0.6.6MIT@toast-ui/editor地址3.1.5MITv-viewer地址1.6.4MITxlsx地址0.18.5Apache-2.0vue-i18n地址8.27.2MIT2.组件结构(部分)3.截图4.示例项目项目一:gitee......
  • vue2集成bpmn流程图,可导入导出预览等
    1.使用到的组件组件源码版本licensebpmn-js地址7.3.1bpmn.iobpmn-js-properties-panel地址0.37.2MITcamunda-bpmn-moddle地址4.5.0MIT版本一定要对,否则可能会报错2.组件代码<template><divid="app"><divclass="container">......
  • vue2集成tinymce富文本编辑器,添加本地资源解决加载慢问题
     组件源码版本licensetinymce地址4.9.3MIT示例项目一源码地址:gitee1.封装组件<template><div:class="{fullscreen:fullscreen}"class="tinymce-container":style="{width:containerWidth}"><textarea:id="tinymc......
  • React(十二):props的函数组件中使用
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>props的函数组件实现</title><scriptsrc="https://unpkg.com/react@18/umd/react.development.js"></script><scriptsr......
  • React(十):props的基本使用
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title>props的基本使用</title><scriptsrc="https://unpkg.com/react@18/umd/react.development.js"></script><scriptsrc=......
  • vue2遇到的一些错误
    一、VUE中的VUEX如何调用modules里面的mutations和state ...mapMutations("workflow",['setApproverConfig','setApprover']),二、Non-nestedroutesmustincludealeadingslashcharacter.Fixthefollowingroutes:-JSExpression 出错点Non-nest......
  • Vue2 & Vue3生命周期对比
    Vue2生命周期图示  Vue3生命周期图示  二者对比 ......
  • vue2和vue3的区别
    1.性能提升vue3对性能进行了优化,相较于vue2,在运行时的性能更高。vue3采用了Proxy代理机制,使得在数据变化时可以更快的更新视图,从而提供了更好的响应性能。2.ComposiitonAPI(组合式API)vue3引入了CompsitionAPI,这是一种新的API风格,它允许开发者更好的组织和重用代码。相比于......
  • vue3中的watch与vue2中的watch的对比
    新版的 watch 和旧版对比,在使用方式上变化非常大!旧版是这样用的,和 data 、 methods 都在同级配置://旧版的写法:exportdefault{watch:{//...},data(){return{//...}},methods:{//...}} 新版的 watch......
  • vue2.x接入mockJs
    1、安装npminstallmockjs2、创建文件src/mock/api、src/mock/indeximportMockfrom'mockjs'importMockApifrom"./api"Mock.setup({timeout:"300",});constmocks=[...MockApi];exportfunctionmockXHR(){for(letiofmocks)......