返回

多维度解读Vue3通信新方式:defineProps、defineEmits、useAttrs、mitt、v-model

前端

Vue 3 中组件通信的指南

props 和 useAttrs

在 Vue 3 中,props 用于接收父组件传递下来的属性,而 useAttrs 用于接收组件标签上的属性。

props

  • 使用 v-bind 指令将数据绑定到子组件的 props
  • 使用 defineProps 方法在子组件中声明接收的 props
  • props 是只读的,不能在子组件中修改。
// 父组件
<MyComponent v-bind:name="myName" />

// 子组件
import { defineProps } from 'vue'

export default {
  props: defineProps(['name'])
}

useAttrs

  • 使用 useAttrs 方法在子组件中获取组件标签上的属性。
  • useAttrs 返回一个只读的对象,不能在子组件中修改。
  • 如果父组件传递过来的属性和子组件的 props 同名,则优先使用 props 接收。
// 子组件
import { useAttrs } from 'vue'

export default {
  setup() {
    const attrs = useAttrs()
    console.log(attrs.name)
  }
}

mitt 插件

mitt 是一个轻量级的事件触发插件,可以帮助在组件之间触发事件。

使用方法

  • 安装 mitt 插件。
  • 在触发事件的组件中,创建一个 mitt 实例。
  • 使用 mitt 实例的 emit 方法来触发事件。
  • 在监听事件的组件中,使用 mitt 实例的 on 方法来监听事件。
// 父组件
import mitt from 'mitt'
const emitter = mitt()

emitter.emit('event-name', 'data')

// 子组件
emitter.on('event-name', (data) => {
  console.log(data)
})

v-model 指令

v-model 指令可以简化组件之间的双向数据绑定。

使用方法

  • 在父组件中,使用 v-model 指令将数据绑定到子组件的 prop
  • 在子组件中,使用 defineProps 方法声明接收的 prop
  • 在子组件中,使用 v-model 指令将 prop 绑定到组件内部的数据。
// 父组件
<MyComponent v-model="myValue" />

// 子组件
import { defineProps, ref } from 'vue'

export default {
  props: defineProps(['value']),
  setup() {
    return {
      value: ref(this.value)
    }
  }
}

总结

Vue 3 中提供了多种方法来实现组件通信和数据绑定,包括 propsuseAttrs、mitt 插件和 v-model 指令。根据实际需要选择使用合适的工具,可以简化开发并提高代码可维护性。

常见问题解答

  1. propsuseAttrs 有什么区别?

    • props 用于接收父组件传递过来的属性,而 useAttrs 用于接收组件标签上的属性。
  2. 为什么 props 是只读的?

    • 为了确保组件的数据流向保持明确和可预测。
  3. 如何使用 mitt 插件跨组件触发事件?

    • 创建一个 mitt 实例,使用 emit 方法触发事件,然后在其他组件中使用 on 方法监听事件。
  4. v-model 指令如何实现双向数据绑定?

    • 它在父组件和子组件之间建立一个响应式连接,使双方的值保持同步。
  5. 如何选择最适合的组件通信方法?

    • 考虑特定需求,例如数据流向、性能和可维护性。