【问题标题】:passing v-model props in child component在子组件中传递 v-model 道具
【发布时间】:2021-12-23 04:16:24
【问题描述】:

我有父组件,我想在子组件中发送一个布尔值,以显示带有概览的 v-dialog。 结果是打开了许多 v-dialog,并在 console.log 中出现了一条错误消息。 我不知道我错在哪里。 你能帮助我吗?谢谢

<template>
  <div>
    <div class="container">
      <v-card
        v-for="el of listTv"
        :key="el.id"
        class="card"
        :style="{
          backgroundImage: `url('https://image.tmdb.org/t/p/w500/${el.backdrop_path}')`,
          backgroundSize: 'auto',
          backgroundPosition: 'center',
        }"
      >
        <v-card-title class="textTitle">{{ el.name }}</v-card-title>
        <h5 class="genres">
          {{ el.genres[0] === undefined ? "Nessun genere" : el.genres[0].name }}
        </h5>
        <v-btn color="primary" class="btn" @click="dialog = true"
          >Trama...</v-btn
        >
      </v-card>
    </div>
    <DialogsOverview
      v-for="element in listTv"
      :key="element.id"
      :overView="element.overview || 'Nessuna descrizione'"
      :title="element.name"
      :dialog="dialog"
    />
  </div>
</template>

<script>
import DialogsOverview from "./DialogsOverview.vue";
export default {
  components: { DialogsOverview },
  props: ["listTv"],
  data() {
    return {
      dialog: false,
    };
  },
  methods: {},
};
</script>

<style>
@import url("./style/CardsMovie.css");
</style>

子组件:

<template>
  <div>
    <v-dialog v-model="dialog">
      <v-card>
        <v-card-title>{{ title }}</v-card-title>
        <v-card-text>{{ overView }}</v-card-text>
      </v-card>
    </v-dialog>
  </div>
</template>

<script>
export default {
  props: {
    dialog: Boolean,
    overView: String,
    title: String,
  },
  data() {
    return {};
  },
  methods: {},
};
</script>

<style></style>

错误控制台

vue.runtime.esm.js?2b0e:619 [Vue 警告]:避免改变 prop 直接因为值将被覆盖每当父 组件重新渲染。相反,使用基于数据或计算属性 关于道具的价值。正在变异的道具:“对话”

found in

---> <DialogsOverview> at src/components/DialogsOverview.vue
       <CardsMovie> at src/components/CardsMovie.vue
         <Main> at src/components/Main.vue
           <VMain>
             <VApp>
               <App> at src/App.vue
                 <Root>

【问题讨论】:

标签: javascript vue.js vuejs2 vue-props


【解决方案1】:

你不能直接改变 props 的值。为v-model 使用不同的变量来消除此错误。看下面的代码:

<template>
<div>
    <v-dialog :id="key" v-model="dialogValue">
      <v-card>
        <v-card-title>{{ title }}</v-card-title>
        <v-card-text>{{ overView }}</v-card-text>
      </v-card>
    </v-dialog>
  </div>
</template>

<script>
export default {
  data() {
    return {
      dialogValue: false, //considering this value as Boolean
    };
  },
  props: {
    dialog: Boolean,
    overView: String,
    title: String,
    key: String, //add 'String' or 'Number', whatever type you are receiving
  },
  mounted(){
    this.dialogValue = this.dialog;
  }
};
</script>

将 props 值 dialog 分配给 mounted 挂钩中的新变量 dialogValue,然后将其用作 v-model 将修复您的错误。

【讨论】:

  • 感谢您的消息,但不工作。但是,当我通常通过 v-model 时,控制台中显然会出现错误,但它会为我打开所有 v-dialogs。如何打开与 Button 对应的 v-dialog?谢谢
  • @Stefano 你需要一些独特的东西,比如钥匙或任何东西。将它从父组件传递给子组件,这将帮助您打开特定的 v-dialog 到按钮。
  • 你能用一个例子解释一下吗,因为我仍然找不到解决方案。 ?。参考我的代码,当我单击按钮时,它必须向我发送子组件中的布尔值并打开相应的 v-dialog,但它会为我打开它们
  • 我已经编辑了我的答案。你可以试试,让我知道它是否有效?我在 props 中添加了key,在&lt;v-dialog&gt; 标签中添加了id 属性。
  • 好的,我试过了,但是不行。当我单击按钮时,显示所有 v-dialog。 :|
猜你喜欢
  • 2021-04-07
  • 1970-01-01
  • 2019-02-14
  • 2020-06-09
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 2021-07-16
  • 2018-04-28
相关资源
最近更新 更多