📜  Vue.js 中使用 $emit 和 props 的组件间通信(1)

📅  最后修改于: 2023-12-03 15:05:53.355000             🧑  作者: Mango

Vue.js 中使用 $emit 和 props 的组件间通信

在 Vue.js 中,组件是构建 Web 应用程序的基本单位。然而,在构建较大的应用程序时,组件间的通信变得比较棘手。

本文将重点介绍 Vue.js 中使用 $emit 和 props 实现组件间通信的方法。

Props

在 Vue.js 中,如果想要在组件间共享数据或状态,可以使用 props。

Props 是父组件向子组件传递数据的一种方式。子组件通过 props 来接收从父组件传递过来的数据。

下面是一个父组件向子组件传递数据的例子:

<template>
  <child-component :message="message"></child-component>
</template>

<script>
  export default {
    data() {
      return {
        message: 'Hello World'
      }
    }
  }
</script>

在子组件中,需要声明 props,然后就可以通过 this.message 访问父组件传递过来的数据了。

下面是一个简单的子组件:

<template>
  <div>{{ message }}</div>
</template>

<script>
  export default {
    props: ['message']
  }
</script>

在使用 props 时,需要注意以下几点:

  • props 在子组件中是只读的,不能对其进行修改。
  • 如果使用了驼峰式命名(例如 fooBar),需要使用 kebab-case 命名(例如 foo-bar)来绑定 props。
  • props 可以是任何类型的数据,包括 JS 基本类型、对象、数组等。
$emit

除了 props,Vue.js 还提供了另一种组件间通信的方式:$emit。

$emit 是子组件向父组件传递数据的一种方式。子组件通过 $emit 来触发父组件注册的事件并且将数据传递给父组件。

下面是一个子组件发送数据给父组件的例子:

<template>
  <button @click="sendMessage">Send Message</button>
</template>

<script>
  export default {
    methods: {
      sendMessage() {
        this.$emit('send-message', 'Hello World');
      }
    }
  }
</script>

在父组件中,需要注册子组件触发的事件,并且定义事件处理函数来接收数据。

下面是一个简单的父组件:

<template>
  <child-component @send-message="handleMessage"></child-component>
</template>

<script>
  export default {
    methods: {
      handleMessage(message) {
        console.log(message); // 输出 "Hello World"
      }
    }
  }
</script>

在使用 $emit 时,需要注意以下几点:

  • $emit 的第一个参数是事件名称,可以是任何字符串。
  • $emit 的第二个参数是要传递给父组件的数据。
  • $emit 只能触发注册的事件,不能触发未注册的事件。
组合使用

使用 props 和 $emit 可以很好地解决 Vue.js 中组件间通信的问题。

如果需要在父组件和子组件之间进行双向绑定,可以使用 v-model 来实现。v-model 实际上是 props 和 $emit 的简写方式。

下面是一个简单的双向绑定的例子:

<template>
  <child-component v-model="message"></child-component>
</template>

<script>
  export default {
    data() {
      return {
        message: 'Hello World'
      }
    }
  }
</script>

在子组件中,需要定义一个名为 value 的 props,然后通过 $emit 触发 input 事件来实现双向绑定。

下面是一个简单的子组件:

<template>
  <input :value="value" @input="$emit('input', $event.target.value)">
</template>

<script>
  export default {
    props: ['value']
  }
</script>

在使用 v-model 时,需要注意以下几点:

  • 当使用 v-model 时,子组件需要定义 value props。
  • 子组件需要触发 input 事件来更新父组件的值。
  • 父组件不需要再通过 $emit 来处理 input 事件。
结论

在 Vue.js 中,使用 props 和 $emit 可以很好地解决组件间通信的问题。

如果需要在父组件和子组件之间进行双向绑定,可以使用 v-model 来实现。

使用这些技术可以使组件更加模块化和可复用,从而提高开发效率。