4***@qq.com
4***@qq.com
  • 发布:2022-01-16 15:24
  • 更新:2024-06-12 00:26
  • 阅读:4031

uniapp vue3 getCurrentPages如何获取上一页方法

分类:uni-app

vue2 是 beforePage.$vm.init()

vue3报错 TypeError: beforePage.$vm.init is not a function

2022-01-16 15:24 负责人:无 分享
已邀请:
Meiwah

Meiwah

是因为 vue3 中,方法需要暴露出来给别个来调用吗,
有没有写 defineExpose({// 暴露的方法})

  • 1***@163.com

    我写了的,还是不行,感觉是vue3不支持这个方法

    2023-12-25 14:37

  • 弄月

    回复 1***@163.com: 以下代码亲测可用 ``` export function getPrevPage(preIndex = 1){

    const pages = getCurrentPages();

    const prevPage = pages[pages.length - preIndex - 1];

    return prevPage?.$vm ? prevPage.$vm : prevPage;

    }


    function onSelectBrand(item: any) {

    brand.value = item?.brand_name || '请选择品牌';

    }


    defineExpose({

    onSelectBrand

    })


    function onSelect(item: any) {

    const prev = getPrevPage()

    prev?.onSelectBrand(item);

    uni.navigateBack();

    }


    2024-04-24 09:32

DCloud_UNI_LXH

DCloud_UNI_LXH

你是想调用 $vm 上的方法吗?你暴露这个方法了吗?看下你是怎么写的。如果 setup 中可能拿不到,可以换为 options 的形式书写

  • 店小二丶

    如果是setup 有好的方式么? 我现在的问题是我再详情也操作成功后想自动返回上一个,并刷新数据,目前只能靠uni.$emit 实现感觉不是很好,想问一下有没有一种更好的实现方式

    2023-04-04 10:25

  • DCloud_UNI_LXH

    回复 店小二丶: EventChannel

    2023-04-04 11:18

  • 店小二丶

    回复 DCloud_UNI_LXH: 但是在setup 中的 @dcloudio/uni-app 似乎没有提供 getOpenerEventChannel 这个方法,就没有办法像

    const eventChannel = this.getOpenerEventChannel()

    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});

    eventChannel.emit('someEvent', {data: 'test'});

    这样使用

    2023-04-04 11:23

  • DCloud_UNI_LXH

    回复 店小二丶:


    import { getCurrentInstance } from 'vue'  
    // ...
    getCurrentInstance().proxy.getOpenerEventChannel()

    2023-04-04 15:52

c***@163.com

c***@163.com - qqq

我也碰到了这个问题,请问您这边最后解决了吗? 我已经搜好几天了

  • 1***@163.com

    请问你解决了吗?

    2023-11-14 19:30

  • 弄月

    用 defineExpose 可以解决

    2024-04-24 09:33

BeardYound

BeardYound

确实出了这个问题,我以前写修改上一页数据是这样写正常,现在这样写就会报错 后来我换了一种写法

A页面使用 uni.$on监听

B页面使用 uni.$emit传递修改的数据(A页面实时监听)

A页面onUnload调用uni.$off注销监听(一定要加,防止监听值相同)

d大强

d大强

不想用 $on 监听, 在H5中 可以使用 page.$.setupState.function(); page是上一个页面的实例。在h5中可以使用,但是在小程序中 无法使用。真让人闹心。

  • BeardYound

    都用uni了肯定就是想一套代码跑全端啊,不想去取消$off注销可以使用$once一次性监听,监听到一次方法就不生效了

    2023-10-11 15:13

1***@163.com

1***@163.com

我也遇到了,请问有人解决了吗

9***@qq.com

9***@qq.com

可以再onShow 中读取值,名字不能取一样,否则赋值页赋不了值,在取值页用新的值赋值就好

onShow(()=>{  
        const page = getCurrentPages()[0];  
        const vm = page.$vm;  
        currentAddress.value = vm.useAddress;  
    })
末日沙兔

末日沙兔

vue3、build后的h5

  • 上一个页面defineExpose出你需要调用的函数

    defineExpose({  
      initData()  
    })
  • 二级页面

    let pages = getCurrentPages();   
    let beforePage: any = pages[pages.length - 2];  
    beforePage._.exposed.initData()

亲测有效,build之后的h5

要回复问题请先登录注册