【问题标题】:Vue.js - How do I share parent prop with child components?Vue.js - 如何与子组件共享父道具?
【发布时间】:2019-05-31 06:29:22
【问题描述】:

我正在尝试弄清楚如何将父组件中的道具传递给子组件。

如果我在子组件标签中添加带有#id 的 prop 属性,它会完美运行,例如 Image cid="488484-49544894-584854" 但我想使用相同的 cid 在一个位置(父级) - 这可能吗?

父组件和子组件具有相同的挂载和数据功能。 cid 被传递给 contentDeliveryUrl 以收集数据。

App.vue

<template>
  <div id="app" class="container" cid="7e4301de-9c6e-4fab-9e68-3031b94d662d">

    <Images cid="same as parent div" />

    <Video cid="same as parent div" />

    <TextType cid="same as parent div" />

    <Card cid="same as parent div" />

  </div>
</template>

<script>
  import axios from 'axios';
  import Images from "./components/Images";
  import Video from "./components/Video";
  import TextType from "./components/TextType";
  import Card from "./components/Card";

  export default {
    name: 'app',
    props: ["cid"],
    components: {
      Images,
      Video,
      TextType,
      Card
    },
    mounted() {
      axios({method: "GET", "url": this.contentDeliveryUrl}).then(result => {
          // eslint-disable-next-line
          this.content = amp.inlineContent(result.data)[0];
          console.log(this.content)
        }, error => {
          console.error(error);
        });
    },
    data() {
      return {
        contentDeliveryUrl: 'https://c1.adis.ws/cms/content/query?fullBodyObject=true&query=%7B%22sys.iri%22%3A%22http%3A%2F%2Fcontent.cms.amplience.com%2F${this.cid}%22%7D&scope=tree&store=testing',
        content: []
      }
    }
  }
</script>

Image.vue

<template>

<div v-if="content.image">

</div>

</template>

<script>
  import axios from 'axios';

  export default {
    props: ["cid"],
    name:'Images',

    mounted() {
      axios({method: "GET", "url": this.contentDeliveryUrl}).then(result => {
          // eslint-disable-next-line
          this.content = amp.inlineContent(result.data)[0];
          console.log(this.content)
        }, error => {
          console.error(error);
        });
    },
    data() {
      return {
        contentDeliveryUrl: 'https://c1.adis.ws/cms/content/query?fullBodyObject=true&query=%7B%22sys.iri%22%3A%22http%3A%2F%2Fcontent.cms.amplience.com%2F${this.cid}%22%7D&scope=tree&store=testing',
        content: []
      }
    },
}
</script>

对于使用 Vue Devtools 的所有组件,返回的数据都是未定义的。

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component


    【解决方案1】:

    例如添加一个名为 cidItem 的数据属性并将其绑定到您的道具,如下所示

    <template>
      <div id="app" class="container" :cid="cidItem">
    
        <Images :cid="cidItem" />
    
        <Video :cid="cidItem"  />
    
        <TextType :cid="cidItem"  />
    
        <Card :cid="cidItem"  />
    
      </div>
    </template>
    
    <script>
      import axios from 'axios';
      import Images from "./components/Images";
      import Video from "./components/Video";
      import TextType from "./components/TextType";
      import Card from "./components/Card";
    
      export default {
        name: 'app',
        props: ["cid"],
        components: {
          Images,
          Video,
          TextType,
          Card
        },
        mounted() {
          axios({method: "GET", "url": this.contentDeliveryUrl}).then(result => {
              // eslint-disable-next-line
              this.content = amp.inlineContent(result.data)[0];
              console.log(this.content)
            }, error => {
              console.error(error);
            });
        },
        data() {
          return {
            contentDeliveryUrl: 'https://c1.adis.ws/cms/content/query?fullBodyObject=true&query=%7B%22sys.iri%22%3A%22http%3A%2F%2Fcontent.cms.amplience.com%2F${this.cid}%22%7D&scope=tree&store=testing',
            content: [],
            cidItem:'7e4301de-9c6e-4fab-9e68-3031b94d662d'
          }
        }
      }
    </script>
    

    由于您的组件具有相同的结构,我建议使用mixins,创建一个名为myMixins.js 的文件并在其中添加以下代码:

    const myMixins = {
     props:['cid'],
      mounted() {
        axios({
          method: "GET",
          "url": this.contentDeliveryUrl
        }).then(result => {
          // eslint-disable-next-line
          this.content = amp.inlineContent(result.data)[0];
          console.log(this.content)
        }, error => {
          console.error(error);
        });
      },
      data() {
        return {
          contentDeliveryUrl: 'https://c1.adis.ws/cms/content/query?fullBodyObject=true&query=%7B%22sys.iri%22%3A%22http%3A%2F%2Fcontent.cms.amplience.com%2F${this.cid}%22%7D&scope=tree&store=testing',
          content: []
        }
      }
    }
    
    export default mixins;
    

    并在每个组件内添加:

        import myMixins from './myMixins'
        export default{
              ....
             mixins: [myMixin]
          }
    

    【讨论】:

      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 2020-03-31
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2020-07-30
      相关资源
      最近更新 更多