uniapp返回前一页状态更新

246 阅读2分钟

上代码

//详情页
	setTimeout(() => {
                let pages = getCurrentPages();
                let prevPage = pages[ pages.length - 2 ];  //上一页页面实例 
                prevPage.$vm.cid = state.chooseIds;
                uni.navigateBack({
                        delta: 1
                });
        }, 2000)

下面

//列表页
onShow(() => {
const {
        cid,
        list,
        common
} = state
if (cid != undefined && cid > 0) {
        list.map(v => {
                if (v.id == cid) {
                        v.recruit_status = 4
                        v.reservation_text = getOptionsText(common?.reserveStatusOption || {}, 4)
                        return v;
                }
        })
}
})

const getOptionsText = (options, key) => {
        let arr = options.filter(v => v.key == key)
        if (arr && arr.length > 0) {
                return arr[0].text
        }
        return '-'
})

大家看代码可能不清楚我的感受,这个东西折磨了我大半个下午,下午三点到晚上七点多

具体情况是这个样子的
 - 招募列表页       跳转详情页 更改状态
    - 招募详情页    点击改变状态 返回招募列表页

原本以为是一个挺简单的功能,就是返回的时候重新刷新一下招募列表页,就可以了,调用一下招募页加载接口,结果试了很多次,还是不可以

然后觉得是没有刷新详情页,所以招募列表页没有检测到,结果反而报错了(自己太菜了)

换了第二条路 传值

就是把招募详情页的状态传给招募列表页
我用的是$emit(写在调用接口的setTimeout里面) $on接收(在onMouted里面)
然后接收到了,就是不改变

于是去求助,知道了有这个方法

let pages = getCurrentPages();
                let prevPage = pages[ pages.length - 2 ];  //上一页页面实例 
                prevPage.$vm.cid = state.chooseIds;
                
                但是第一次看到这个,不知道了这个怎么用,单独知道了这个可以传id过去
自己又摸索了很久,还是没有头绪,换回第二种方法,还是不可以

最后自己继续问,然后直接帮忙解决了 就上上面的代码,我们来仔细看一下

onShow(() => {   //它是一个事件处理程序函数,当页面被展示时会触发
const {
        cid,
        list,
        common
} = state
if (cid != undefined && cid > 0) {
        list.map(v => {
                if (v.id == cid) {
                        v.recruit_status = 4
                        v.reservation_text = getOptionsText(common?.reserveStatusOption || {}, 4)
                        return v;
                }
                
                //从状态对象state中提取了三个属性:cid、list、common。
               // 然后,如果cid不是未定义的且大于0,我们遍历列表list中的每个元素v,
               // 如果元素v的id等于cid,我们将其recruit_status设置为4,
               // 将其reservation_text设置为getOptionsText函数返回的文本。
        })
}
})

const getOptionsText = (options, key) => {    //帮助函数,用于根据给定的选项和键返回对应的文本。
        let arr = options.filter(v => v.key == key)
        if (arr && arr.length > 0) {
                return arr[0].text
        }
        return '-'
        
        //函数接受两个参数:options和key,
        //其中options是一个对象数组,每个对象包含一个键和一个文本。
        //我们使用filter函数来找到具有给定键的对象,
        //如果找到了,则返回该对象的文本,否则返回'-'。
})

下一次再碰到直接嘎嘎乱写!

(PS彩蛋:好心酸,这个测试的时候要自己去添加数据,就会自己去招募,招募的选项特别多,还要等加载,一分钟左右一条,很麻烦,然后测了失败了,又得继续去重新添加(后面直接狠心自己一次性忍住,添加很多条去测测试自己写的怎么样,结果测完了还没得结果),每次写代码测试都要有成本的,呜呜呜)