props 和 $emit

文件示意

一个父页面 index.vue
两个组件 Input.vue List.vue

父页面 index.vue

  1. <template>
  2. <div>
  3. 父页面使用组件,给予子页面事件 add、delete,给予props参数 list
  4. <Input @add="addHandler" />
  5. <List :list="list" @delete="delHandler" />
  6. </div>
  7. </template>
  8. <script>
  9. /* 引入组件 */
  10. import Input from '@/components/Input.vue'
  11. import List from '@/components/List.vue'
  12. export default {
  13. components: {
  14. Input,
  15. List
  16. },
  17. data () {
  18. return {
  19. list: []
  20. }
  21. },
  22. methods: {
  23. /* 给List列表增加一个项目的方法,通过事件add传递给子组件 */
  24. addHandler (title) {
  25. this.list.push({
  26. id: `id-${Date.now()}`,
  27. title
  28. })
  29. },
  30. /* 同理删除一个项目的方案 */
  31. delHandler (id) {
  32. this.list = this.list.filter(item => item.id !== id)
  33. }
  34. }
  35. }
  36. </script>

子组件 List.vue

<template>
  <ul>
    从父页面得到的数据list,循环显示出来
    <li v-for="(item) in list" :key="item.id">
      {{item.title}}
      <button @click="del(item.id)">删除</button>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    list: {
      type: Array,
      default () {
        return []
      }
    }
  },
  data () {
    return {

    }
  },
  methods: {
    /* 本页面用来删除列表的功能 */
    del (id) {
      /* 列表信息是在父页面的,所以通过父页面给的事件delete来告知父页面执行删除操作 */
      this.$emit('delete', id)
    }
  }
}
</script>

<style>

</style>

子组件 Input.vue 也是同理

<template>
  <div>
    <input type="text" v-model="title">
    <button @click="addTitle">添加</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      title: ''
    }
  },
  methods: {
    addTitle () {
      // 调用父组件的事件
      this.$emit('add', this.title)
      this.title = ''
    }
  }
}
</script>

整个过程就是,父组件下发数据给子组件显示,子组件要修改数据都是需要通过父组件给的事件,让事件去触发父页面的处理数据的方法。 屏幕录制2020-10-16 下午7.16.36.mov (163.63KB)