收藏
回答

在自定义组件中createSelectorQuery获取不到节点?

t调试基础库:2.17.0
s使用框架:taro3.0
d代码及报错如下:

报错提示:An SelectorQuery call is ignored because no proper page or component is found. Please considering using `SelectorQuery.in` to specify a proper one.

回答关注问题邀请回答
收藏

10 个回答

  • 亚美蝶
    亚美蝶
    2022-02-11

    在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替wx.createSelectorQuery()

    2022-02-11
    有用 22
    回复 10
    • 北冥有鱼
      北冥有鱼
      2022-04-15
      坑了我一天的时间,感谢大神
      2022-04-15
      回复
    • shine
      shine
      2022-04-18
      感谢😁
      2022-04-18
      回复
    • 依、说
      依、说
      2022-04-26
      哈哈哈,感谢大佬
      2022-04-26
      回复
    • 子龙
      子龙
      2022-07-20
      牛逼 in(this)
      2022-07-20
      回复
    • 子龙
      子龙
      2022-07-20回复子龙
      微信真坑
      2022-07-20
      回复
    查看更多(5)
  • 张家博
    张家博
    2022-01-17

    在Taro中,被shadow-root包裹的子组件,不能用Taro.createSelectorQuery().in(this),同样不能用Taro.createSelectorQuery().in(this.$scope),需要使用this.$scope.createSelectorQuery(),推测是Taro1.x中包含了in方法,2.x中由于小程序api的修改故移除了这个方法,小程序改用this.createSelectorQuery()获取子组件的信息,所以在Taro中,需要用this.$scope.createSelectorQuery()来获取信息。注意不要忘记在click事件中bind this,否则拿不到类组件的上下文

    2022-01-17
    有用 2
    回复 3
    • 以堪
      以堪
      2022-07-25
      多谢大佬,用你的方法搞定了
      2022-07-25
      回复
    • 多肉葡萄去冰
      多肉葡萄去冰
      2022-09-08
      大佬,真的有用
      2022-09-08
      回复
    • 肖建军
      肖建军
      04-05
      在 uniapp 里怎么办
      04-05
      回复
  • Potatoptato🥔
    Potatoptato🥔
    2022-01-15

    Taro获取节点信息需要在onReady事件中触发,即便如此,小程序模拟器中测试,也并不是每次都能获取到节点,经过测试,在Taro.nexkTick中可以正常获取。

    onReady() {
        this.getCanvasNode("#canvas").then(res => {
          console.log(res);
        });
      },
    
    
      methods: {
          getCanvasNode(id) {
            return new Promise(resolve => {
              Taro.nextTick(() => {
              let query = Taro.createSelectorQuery();
              query.select(id).boundingClientRect();
              query.selectViewport().scrollOffset();
              query.exec(res => {
                resolve(res);
              });
            });
          });
        }
      }
    
    2022-01-15
    有用
    回复
  • 很安全
    很安全
    2021-12-22

    你的是Taro3,和微信小程序的有点不一样

    Taro.createSelectorQuery().select('#ceilingBar').boundingClientRect(function(rects){console.log("此处可以获取到节点")}).exec()
    

    这个NodesRef.boundingClientRect()回调中如果没有获取到节点,可能是调用此方法的生命周期不是 onReady 或者 ready

    Taro3 :

    一定要在 onReady、ready 生命周期中才能调用小程序 API 获取 DOM。
    不需要调用 .in(this) 方法。
    

    https://taro-docs.jd.com/taro/docs/taroize-troubleshooting/#4-selectorquery-api-%E8%8E%B7%E5%8F%96%E4%B8%8D%E5%88%B0-dom

    微信小程序:

    SelectorQuery SelectorQuery.in(Component component)
    将选择器的选取范围更改为自定义组件 component 内。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。
    

    https://developers.weixin.qq.com/miniprogram/dev/api/wxml/SelectorQuery.in.html

    2021-12-22
    有用
    回复
  • 芳格
    芳格
    2021-12-01
    一般是由于html元素是动态渲染导致的,请确保调用wx.createSelectorQuery()时,html元素处于渲染完成状态。
    


    2021-12-01
    有用
    回复
  • 澄c澄悦
    澄c澄悦
    2021-11-30

    Taro.createSelectorQuery().in(this.$scope)

    应该是Taro.吧

    2021-11-30
    有用
    回复
  • 琦森
    琦森
    2021-07-30

    我也是这个问题,蹲个明白人

    2021-07-30
    有用
    回复
  • 依然
    依然
    2021-07-15

    你这是在组件内调用方法还是组件外部?

    2021-07-15
    有用
    回复 8
    • Alex
      Alex
      2021-07-15
      组件内部
      2021-07-15
      回复
    • 依然
      依然
      2021-07-15回复Alex
      不要加v-if
      2021-07-15
      回复
    • Alex
      Alex
      2021-07-15
      2021-07-15
      1
      回复
    • Alex
      Alex
      2021-07-15回复依然
      2021-07-15
      回复
    • 依然
      依然
      2021-07-15回复Alex
      你在啥时候触发的这个事件呀
      2021-07-15
      回复
    查看更多(3)
  • 微喵网络
    微喵网络
    2021-07-15

    请移步taro官方社区

    2021-07-15
    有用
    回复 2
    • Alex
      Alex
      2021-07-15
      社区还没有响应==
      2021-07-15
      回复
    • 西柚
      西柚
      2022-01-03回复Alex
      请问解决了吗  我也是拿不到 能回复下吗 求求了
      2022-01-03
      回复
  • 永远少年[吃瓜]
    永远少年[吃瓜]
    发表于移动端
    2021-07-15
    :٩(๑•ㅂ•)۶
    2021-07-15
    有用
    回复
登录 后发表内容