V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chenliangngng
V2EX  ›  Vue.js

Vue3 tsx 应该用 props 还是 emit 传递事件?

  •  
  •   chenliangngng · 15 小时 24 分钟前 · 1493 次点击

    本人之前由于长期写 react ,更倾向于 props 模式也就是直接把 onChange 作为参数,但平时还是老老实实遇到事件函数就用 emit 传递

    最近 ai 告诉我 props 不是最佳实践,emit 是最佳实践,可我用 cursor 给我生成的代码清一色都是 props 模式,给我整不会了

    其实我感觉用 Vue3 tsx 的话,什么 v-model 和 emit 这些都没必要了,和 react 一样 props 到底就好了

    16 条回复    2025-03-03 19:52:33 +08:00
    FakerLeung
        1
    FakerLeung  
       15 小时 22 分钟前
    emit
    tanranran
        2
    tanranran  
       15 小时 17 分钟前
    vue2 vue3 都是 emit
    zzh2036
        3
    zzh2036  
       15 小时 13 分钟前
    vue3 文档,只是推荐使用。
    “尽管事件声明是可选的,我们还是推荐你完整地声明所有要触发的事件,以此在代码中作为文档记录组件的用法。同时,事件声明能让 Vue 更好地将事件和透传 attribute 作出区分,从而避免一些由第三方代码触发的自定义 DOM 事件所导致的边界情况。”
    paopjian
        4
    paopjian  
       15 小时 12 分钟前
    为的不是单向数据流么, 一切变动都有缘由
    chairuosen
        5
    chairuosen  
       15 小时 11 分钟前
    props 优点是 async 一下可以知道异步执行结束再继续,缺点是需要判断回调存在
    jeepc
        6
    jeepc  
       15 小时 6 分钟前   ❤️ 1
    直接用 vue3.4 的双向绑定特性吧
    wangtian2020
        7
    wangtian2020  
       14 小时 45 分钟前
    父调用子 子 expose 一个方法,比如 openDialog 父直接 ref 用子引用调用方法,一次性传参不要用 props !
    子传父 emit
    charlie21
        8
    charlie21  
       14 小时 30 分钟前
    传递事件用 emit

    如果想传递 event handler, 用 props

    ```
    // 父组件
    <group-form :on-submit="saveGroup" />

    function saveGroup (groupDetails: { name: string | null, users: Record<string, string[]> }, createNew: boolean = false) {
    }
    ```
    ```
    // 子组件
    import { type PropType } from 'vue'

    export default defineComponent({
    props: {
    onSubmit: {
    type: Function as PropType<(groupDetails: { name: string | null, users: Record<string, string[]> }, createNew: boolean) => void>,
    required: true
    },
    },
    setup () { ... }
    })

    ```
    Zzzz77
        9
    Zzzz77  
       11 小时 50 分钟前
    看中代码质量,追求代码可维护性和可读性的话,更应该用 emit

    但是话又说回来,如果是大面积直接用 AI 生成代码了,也就无所谓用什么/怎么用了,最后结局都是 AI 维护,能跑就行。
    arron2022
        10
    arron2022  
       11 小时 32 分钟前
    同 react 一开始 vue 的时候也有这种困惑,后面直接一路 this.$refs.childRef.xxx 爽的飞起
    tog
        11
    tog  
       11 小时 11 分钟前
    1 、props (父传子, 一般是变量)
    2 、emit (子传父, 事件)
    3 、defineModel (在组件上绑定 v-model, 这个很好用)
    wu67
        12
    wu67  
       11 小时 8 分钟前
    讲真, 个人认为子组件的数据, 子组件自己逻辑处理然后 emit 传递出来才是正解, 父组件传个方法进去简直就像邪道....
    实在不行, 像楼上那种拿 ref 调子组件方法也不是不能用
    Melting
        13
    Melting  
       10 小时 23 分钟前
    我问 AI 也是说 props 毕竟符合单项数据流,而且可以 props 类型检测也比较清晰,不过 emit 是 vue 双向数据的特色,习惯了感觉也好用,传 function 来获取子组件的值总感觉怪怪的
    abc1310054026
        14
    abc1310054026  
       10 小时 13 分钟前
    这我之前写组件的时候碰到过,其实 emit 和 props 是有区别的。

    1. emit 更类似 DOM 的 dispatchEvent 机制,只管派发事件。如果你关心事件的返回值 emit 是无法获取返回值的。
    2. props 传入的是函数对象,触发事件实际就是调用函数,这种情况下可以拿到函数返回值。
    gouflv
        15
    gouflv  
       8 小时 8 分钟前 via iPhone
    emit 可以在 devtool 看到日志,props 不行。
    chesha1
        16
    chesha1  
       5 小时 26 分钟前
    props 父传子,emit 子传父,vue 相对 react 来说,组件通信方式太多了,不像 react 很强调单项数据流,我感觉都行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1368 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.