【问题标题】:Data from one Vue component affecting another来自一个 Vue 组件的数据影响另一个
【发布时间】:2019-10-25 04:45:25
【问题描述】:

我正在开发一个 vue/nuxt 项目。我正在使用 nuxt 和 webpack 在编译时从 json 文件中动态加载数据 (Dynamically get image paths in folder with Nuxt)。

Json 文件如下所示:

{
  "Title": "title goes here",
  "Ad":  "other stuff",
  "_latitude": 30.08674842,
  "_longitude": -97.29304982

}

我已经设置好了,如果你在键中有一个'_',那么这个属性就是'private'并且不会显示在 panel.vue 组件的 publicItemsArray 数组中。

我决定添加下划线以从 panel.vue 组件的显示中删除“广告”

"_Ad":  "other stuff",

这有效,但广告也从 detailcard.vue 组件中消失了

{{myData.Ad}}

为什么会这样?如何修复它以使组件彼此独立?

我的(简化的)index.html 包含:

<template>
   <div>

  ....
       <Card/>
       <Panel/>

       <Four/>
       </div> 
</template>

<script>
import Four from '~/components/section4.vue'

import Panel from '~/components/panel.vue'
import Card from '~/components/detailCard.vue'
.......

export default {

  components: {
    Four,
    Panel,
    Card,

  }

}
</script>

我的简化 detailcard.vue 组件:

    <template>


        .....
        <v-card-text class="headline font-weight-bold">{{myData.Ad}}</v-card-text>


    </template>   

    <script>
      import * as data from '../static/info.json';

    export default {
    data() {
          return {
            myData:data.default
         }

    }
    }

</script>

我的简化 panel.vue 组件:

<template>

    <v-flex>
      <v-expansion-panel>
        <v-expansion-panel-content v-for="(item,i) in items" :key="i" style="background:#26c6da;color:white">
          <div slot="header" class="headline font-weight-bold">{{item.header}}</div>
          <v-card>
            <v-card-text class="headline font-weight-bold">{{item.text}}</v-card-text>
          </v-card>
        </v-expansion-panel-content>
      </v-expansion-panel>
    </v-flex>
</template>

<script>
  import * as data from '../static/info.json';

  var itemsArray = [];
  Object.keys(data.default).forEach(function(key) {
    // console.log(key, data[key]);
    itemsArray.push({
      header: key,
      text: data.default[key]
    });
  });
  // var jsonData = JSON.parse(data);


 var publicItemsArray = itemsArray.filter( function(el) {
        return !el.header.includes("_") 
        })


  export default {
    data() {
      return {
        panel: 'Sample panel',
        items: publicItemsArray
      }
    }

  }
</script>

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    您将密钥从 Ad 更改为 _Ad。在您的detailcard.vue 组件中,您仍在引用myData.Ad,它不再存在。如果要引用正确的值,则必须改为将引用更改为 myData._Ad

    【讨论】:

    • 你是对的。我现在正在想办法在不影响其他组件的情况下切换 panel.vue 组件显示中显示的属性。有什么想法吗?
    • 一个想法立即浮现在脑海:与其检查键名中的下划线,不如将键分配给包含contentisPrivate 布尔值的嵌套对象。例如,Ad: { content: "other stuff", isPrivate: true}
    • 您最终遇到的问题是您试图将数据本身与其表示形式纠缠在一起。选择是否以将其解释为私​​有的方式命名对象属性只是不好的做法,特别是如果您将来决定它需要改为公共的。所有引用该属性的情况都需要更新以反映更改。通过使用布尔标志,如果您决定在私有和公共之间切换,则无需更新任何组件。
    • 谢谢,我试试看!
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2019-02-12
    • 2018-04-05
    • 2014-07-11
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多