当前位置: 首页 > 知识库问答 >
问题:

VueJS$set不使对象数组中的新属性反应

周凯捷
2023-03-14

在下面的 VueJS 2 组件中,我可以将 imgdata 属性添加到 area.questions 数组中的每个问题。它的工作原理 - 我可以从控制台中看到.log存在imgdata具有值的问题。但是,尽管使用了$set它仍然没有反应,并且imgdata不在视图中!我怎样才能使它被动?

var componentOptions = {
  props: ['area'],
  data: function() {
    return {
      qIndex: 0,
    };
  },
  mounted: function() {
    var that = this;
    that.init();
  },
  methods: {
    init: function() {
      var that = this;
      if (that.area.questions.length > 0) {
        that.area.questions.forEach(function(q) {
          Util.HTTP('GET', '/api/v1/photos/' + q.id + '/qimage').then(function(response) {
            var thisIndex = (that.area.questions.findIndex(entry => entry.id === q.id));
            var thisQuestion = (that.area.questions.find(entry => entry.id === q.id));
            thisQuestion.imgdata = response.data;
            that.$set(that.area.questions, thisIndex, thisQuestion);
          })
        });
      }
      console.log("area.questions", that.area.questions);
    },

共有2个答案

仉昂熙
2023-03-14

这里变量的值是这个,但是它被限制在函数的范围内。因此,您可以在数据中创建反应属性,如下所示:

data: function() {
    return {
        qIndex: 0,
        questions: []
    };
}
伯彦君
2023-03-14

因为< code>area是一个属性,所以您不应该试图在这个组件中对它进行更改。

一般的想法是发出一个事件供父组件监听,以便更新传入的数据。

例如

js prettyprint-override">export default {
  name: "ImageLoader",
  props: {
    area: Object
  },
  data: () => ({ qIndex: 0 }), // are you actually using this?
  mounted () {
    this.init()
  },
  methods: {
    async init () {
      const questions = await Promise.all(this.area.questions.map(async q => {
        const res = await Util.HTTP("GET", `/api/v1/photos/${encodeURIComponent(q.id)}/qimage`)
        return {
          ...q,
          imgdata: res.data
        }
      }))
      this.$emit("loaded", questions)
    }
  }
}

在父级

<image-loader :area="area" @loaded="updateAreaQuestions"/>
export default {
  data: () => ({
    area: {
      questions: [/* questions go here */]
    }
  }),
  methods: {
    updateAreaQuestions(questions) {
      this.area.questions = questions
    }
  }
}
 类似资料:
  • 我对班级结构有如下建议: @JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.PROPERTY,PROPERTY=“type”) 上面的类被序列化为json元素数组,但是当我反序列化它们时,我想要如下结构: 公共阶层结构{ 是否可以将testA、testB和testC类型的元素数组转换为FlatStructure类的属性?

  • 我有一个应用程序,它通过共享一个全局javascript对象来与其他应用程序共享一个外部模块。 其中一个应用程序是用vue 2开发的,当全局对象在外部模块中更新时,vue 2的option data属性会完美更新,而在vue 3中则不会。我也尝试了新的反应属性,但什么也没做,这是一个错误吗? 无法对外部模块进行任何更改,因为它与其他应用程序共享,我如何让它在vue 3中工作? 以下是一些测试链接:

  • 问题内容: 我有一个要在Python中清理的JSON数组。我要删除该属性: data.json 我正在设置列表理解以删除该属性,但是我不确定如何创建关注以下内容的变量: 当我理解列表时,它返回一个空数组。我必须纠正什么才能使其正常工作? 问题答案: 解决您的问题的一种简单方法是使用以下方法删除不需要的密钥: 您应该添加一些安全检查,但是您知道了。

  • 有一个名为的类。 并且我有一个对象的数组。我现在需要的是将该数组中所有对象的s提取到一个新数组中。 我也发现了这个类似的问题。但是它是在Objective-C中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?

  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用: