0

    uniapp页面返回上一个页面,并且修改上一个页面的数据

    2023.06.01 | admin | 210次围观

    今天做了一个新需求,在一个列表当中,我点击进入此页面的表单页面之后,再提交完表单数据之后需要跳回列表页当中去,并且让我们刚刚填的那个表单选项消失掉。在cdn上看到有很多这种博客,但发现没有契合我需求的推文,所以我今天把两种方法都给大家总结一下,希望对你有帮助

    首先来说第一种方式

    通过getCurrentPages获取所有页面栈实例列表的方式(直接上代码)

    A页面(相当于我上面所说的列表页)

    data(){
        return{
            status:true;  //我们要修改的状态或者数据
        }
    }

    B页面(也就是我们A跳过去的页面)

    goBack(){
        let pages = getCurrentPages()//获取所有页面栈的实例列表
        let nowPage = pages[ pages.length - 1 ] //当前页面的实例
        let prevPage = pages[ pages.length - 2 ] //上一个页面的实例
        prevPage.$vm.status = false //更改上一个页面的数据
        uni.navigateBack({
            delta:1  //返回上一页
        })
    }

    但是这种方式个人不是很推荐使用js禁止返回上一个页面,因为他是获取路由栈的,路由栈会在热更新的时候重置,会报错(其实主要是当时这个方法我不知道我怎么改我当时的数据)

    uniapp页面返回上一个页面,并且修改上一个页面的数据

    所以我尝试了另一种方法,$emit,$on,$off的方式去完成这个修改上一页面值的操作

    B页面(我们A跳过去的页面,但是B要返回A页面同时修改值)

    methods(){
        goBack(){
            uni.$emit('newPages',{
                id:this.pages.id //这个页面的id
                value:'你想要传过去的值'
            })
            uni.navigateBack()
        }
    }

    A页面(B页面返回过来同时修改值)

    !!!注意最好不要以这种方式写js禁止返回上一个页面,不然会出现卸载不掉(off)不掉的问题,卸载不掉!卸载不掉!

    methods:{
        
    }
    onLoad(){
        uni.$on('newPages',(e)=>{
            this.infoList.forEach((item)=>{
                if(item.id==e.id){
                    item.value = e.value
                }
            })
        })
    }
    onUnload(){
        uni.$off('newPages')
    }
    

    这种方式来写是最好的(我们把修改的方法写到methods里面当中去,执行方法和卸载方法必须指向的是同一个地址)

    methods:{
        upData(){
            this.infoList.forEach((item)=>{
                if(item.id == e.id){
                    item.value = e.value //修改值
                }
            })
        }
    },
    onLoad(){
        uni.$on('newPage',this.upData)//on内部调用的时候,会把传过来的参数塞给on监听的执行函数
    },
    onUnload(){
        uni.$off('newPage',this.upData)//这样就可以卸载掉了
    }

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论