【问题标题】:Click button in child component to pass data to parent (via one other child)单击子组件中的按钮以将数据传递给父组件(通过另一个子组件)
【发布时间】:2020-02-21 20:35:38
【问题描述】:

是否可以通过单击嵌套子组件中的按钮来传递数据,将其传递给上一级的另一个子组件,然后传递给父组件?

我的组件是这样嵌套的:

Parent
----Child
---------Child 2 (with the button that should trigger action)

所以 Child 2 看起来像这样:(我添加了应该将变量推送到父级列表中的 addList() 方法)

<template>
  <li class="movie">
<div class="movie__image">
  <img class="movie__poster" :src="imageURL" :alt="movie.Title"/>
  <button class="movie__more" :href="`https://www.imdb.com/title/${movie.imdbID}`" target="_blank">Add</button>
</div>
  </li>
</template>
<script>
export default {
  name: 'movie-list-item',
  props: {
    movie: {
      type: String,
      required: true
    }
  },
  methods: {
    addList(event) {
      this.$emit('clicked', this.movie.imdbID)
    }
  }
 </script>

孩子 1

<template>
  <ul class="grid">
  <movie-list-item li v-for="movie in movies" :movie="movie" :key="movie.imdbID" />
</ul>
</template>

<script>
import MovieListItem from './MovieListItem'

export default {
  name: 'movie-list',
  components: {
    MovieListItem
  },
  props: {
    movies: {
      type: Array,
      required: true
    }
  }
}
</script>

家长:(我想将项目从子 2 组件推送到 picked 列表。

<template>
   <div>
    <movie-list :movies="movies"></movie-list>
  </div>
</template>
<script>
import MovieList from './components/MovieList'

export default {
  name: 'app',
  components: {
    MovieList,
  },
  data () {
    return {
      show:false,
      movies: [],
      picked:[]
    }
  }
</script>

【问题讨论】:

    标签: vue.js vue-component


    【解决方案1】:

    不使用任何类型的状态管理,您将不得不发出两次。

    否则,你可以使用 Vuex 并进行状态管理。

    孩子1

    <template>
      <ul class="grid">
        <movie-list-item li v-for="movie in movies" :movie="movie" :key="movie.imdbID" @clicked="handleClick(movie.imdbID)" />
      </ul>
    </template>
    
    <script>
    import MovieListItem from './MovieListItem'
    
    export default {
      .....
      methods: {
        handleClick(imdbID) {
          this.$emit("clicked", imdbID);
        }
      }
    }
    </script>
    

    父母

    <template>
       <div>
        <movie-list :movies="movies" @clicked="handleClick($event)"></movie-list>
      </div>
    </template>
    <script>
    import MovieList from './components/MovieList'
    
    export default {
     ...
     data () {
        return {
          show:false,
          movies: [],
          picked:[]
        }
      },
      methods: {
        handleClick(imdbID) {
          this.picked.push(imdbID);
        }
      }
    </script>
    

    【讨论】:

    • 是否应该将@clicked 附加到子 2 组件中的按钮上?
    • 因为实际上子 2 组件看起来像这样:&lt;li class="movie"&gt; &lt;div class="movie__image"&gt; &lt;img class="movie__poster" :src="imageURL" :alt="movie.Title"/&gt; &lt;button class="movie__more" :href="imdb.com/title/${movie.imdbID}" target="_blank"&gt;Add&lt;/button&gt; &lt;/div&gt;&lt;/li&gt;(请参阅有问题的更新代码),所以你的解决方案对我不起作用跨度>
    • 没有。我的方法还是正确的。在子 1 上,您侦听您在子 2 中定义的名为“clicked”的事件。this.$emit('clicked', this.movie.imdbID) 表示您定义了一个名为“clicked”的事件,并传递了 imdbID。所以在孩子 1 中,我听“点击”事件,然后我再次发出它。我的例子从来没有碰过孩子 1
    猜你喜欢
    • 2021-06-11
    • 2022-06-15
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多