收藏
回答

为什么在自定义组件的属性监听器中调用data和data内属性不一致?

如题,在组件中监听外层传入的prop时,调用的this.data中包含了我需要的属性 list 和已经在 attached 阶段完成初始化的数据,但直接调用 this.data.list 时返回的却是空数组,而不是this.data展开后看到的list属性的内容,这让我无法理解,相关代码如下:




<!--components/comp-a/index.wxml-->
<view class="item" wx:key="index" wx:for="{{array}}">
  {{ item }}
</view>


<!--index.wxml-->
<view class="index">
  <comp-a name="abc" />
</view>


// components/comp-a/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    name: String,
  },
  /**
   * 数据监听
   */
  observers: {
    name: function (val) {
      console.log("comp-a observers name val", val);
      console.log("comp-a observers name data", this.data);
      console.log("comp-a observers name list", this.data.list);
    },
  },
  /**
   * 生命周期
   */
  lifetimes: {
    /**
     * 初始化数据
     */
    attached: function () {
      this.setData({
        list: [12345],
      });
    },
  },
  /**
   * 组件的初始数据
   */
  data: {
    list: [],
  },
});


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

2 个回答

  • showms
    showms
    06-05
    对象外层加上JSON.stringify试下
    console.log("comp-a observers name data"JSON.stringify(this.data));
    console.log("comp-a observers name list"JSON.stringify(this.data.list));
    
    06-05
    有用
    回复 6
    • Mr.Tommy
      Mr.Tommy
      发表于移动端
      06-05
      我回去试一下吧,但感觉应该是不行!
      06-05
      回复
    • showms
      showms
      06-05回复Mr.Tommy
      你试下就知道了
      06-05
      回复
    • Mr.Tommy
      Mr.Tommy
      06-05回复showms
      用转json后,原来data展开后显示的list的内容没有了,这说明问题还是在生命周期上,后面取list的时候它还没有完成初始化,所以取不到,而展开又能看到了,是因为js中console.log有个展开重读一次的bug,可是按照官方文档,attached已经是生命周期里最合适初始化数据的阶段了,created阶段是不能setData的,这又该怎么办?
      06-05
      回复
    • Mr.Tommy
      Mr.Tommy
      06-05回复showms
      我刚刚试了一下,如果在attached和created里都执行数据初始化,observers里就可以读到list的数据了,但这感觉也太不舒服了,一个初始化不必做两次,created里不做observers里读不到,attached里不做视图里读不到,难受!!!
      06-05
      回复
    • showms
      showms
      06-05回复Mr.Tommy
      如果直接用this.data.list打印,因为是对象引用,后续如果有被修改,在console里面点开是会发生变化
      06-05
      回复
    查看更多(1)
  • 情何以堪
    情何以堪
    06-05

    06-05
    有用
    回复 1
    • Mr.Tommy
      Mr.Tommy
      发表于移动端
      06-05
      我是需要在传入的name被改变的时候修改私有属性list的内容,这两个属性之间没有直接关系,所以你说的方案不适用于现状,我目前的替代方案是在name被改变的时候重新初始化list,但这样开销太大,不是长久之计
      06-05
      回复
登录 后发表内容