请问 vue3 的 onclick 和 @click 有什么区别 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhengfan2016
V2EX    Vue.js

请问 vue3 的 onclick 和 @click 有什么区别

  •  
  •   zhengfan2016 5 天前 3845 次点击

    如题,问了 gemini ,发现答案胡扯的,gemini 说写 onclick 不会触发 vue 响应式( ref 元素修改),但是我实测在 div 上写:onclick 确实能触发响应式修改,所以我有点纳闷,这两种写法到底有什么区别

    24 条回复    2025-12-19 17:34:14 +08:00
    BruceXu
        1
    BruceXu  
       5 天前   1
    我的 AI 解释得很清楚,可惜没法贴给你.

    简单来说,前者是原生 html 的事件,后者是 vue 的事件.和响应式是两码事,都能触发.

    一般是推荐用后者,走 vue 指令系统,可以多一些功能.
    hengshenyu
        2
    hengshenyu  
       5 天前 via Android
    :onClick 吧? vue 支持将事件已 props 的形式传递(声明也是),OnXxx= @xxx
    jspatrick
        3
    jspatrick  
       5 天前
    在 jsx 或 tsx 里只有 onClick 可以用,@click 是 onClick 的简写,vue 的 template 里一般用简写,响应式只跟定义的响应式变量有关,跟函数如何绑定无关,任意函数都可以触发响应式
    crocoBaby
        4
    crocoBaby  
       5 天前
    @click 会多一些修饰符的用法,例如一次触发,禁用默认事件等等
    mengdodo
        5
    mengdodo  
       5 天前
    你不用 vue 且纯 html 也不加载 Javascript 的情况下也能用 onclick ,但是 @click 只能 vue 下,懂了吧
    kakakakaka8889
        6
    kakakakaka8889  
       5 天前
    没啥区别啊,@click 只是一个语法糖就是简化的 onClick 写法而已
    FakerLeung
        8
    FakerLeung  
       5 天前   2
    楼上叽里咕噜说啥呢,怎么扯到 jsx 上了

    :onclick 就是原生 html 的 Onclick="" 的绑定方式 --> 所有原生属性都可以通过 :xxxx 来绑定
    @click 是 vue 的 :onclick 的语法糖,同时支持多个修饰符,可以快速实现一些功能,如 @click.prevent
    zhengfan2016
        10
    zhengfan2016  
    OP
       5 天前
    @hengshenyu 这个是在 vue 的文档的哪里啊,我好像没在文档看到这个,我能看到的就是 @click 是 v-on:click 的语法糖 https://cn.vuejs.org/guide/essentials/event-handling.html#listening-to-events
    94
        11
    94  
       5 天前
    好难猜啊,为什么这些可以用 `v-bind` 绑定的事件都叫 [事件处理器属性]( https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Attributes#事件处理器属性) 呢。

    - [#其他事件监听器机制 | 事件介绍 - 学习 Web 开发 | MDN]( https://developer.mozilla.org/zh-CN/docs/Learn_web_development/Core/Scripting/Events#其他事件监听器机制)
    shakukansp
        12
    shakukansp  
       5 天前
    @zhengfan2016 渲染函数 & jsx 章节
    v-on 的说明

    以 on 开头,并跟着大写字母的 props 会被当作事件监听器。比如,onClick 与模板中的 @click 等价
    DICK23
        13
    DICK23  
       5 天前
    vue 上应该是一致的,solidjs 中这两个写法一个是原生事件,一个是合成事件
    xiaoxi123
        14
    xiaoxi123  
       5 天前
    还是 微优易 黑魔法多啊
    rich1e
        15
    rich1e  
       5 天前
    其实楼上有几位的回答,基本都对上了,总结一下就是:

    @click 是 Vue 封装的指令,是特有的语法糖。

    - 在 .vue 文件的 <template> 里面直接使用;
    - @click 也可以写作 “v-on:click”;
    - @click 内部还封装了修饰符,e.g. '@click.stop' / '@click.once' 等等;

    onclick 属于 HTML 规范,跟 Vue 没关系。即便没有 Vue ,onclick 也可以工作。

    多说一句,onclick 不是 onClick 。

    如果想在 Vue 里面使用 onClick ,一般是指使用 jsx 编写代码,文件后缀通常为 jsx/tsx 。

    当然,.vue 文件也可以写 jsx ,需要声明 `<script lang="jsx">` 或者 `<script lang="tsx">`。

    PS:JSX (Javascript XML) 是 Javascript 的一种语法扩展,它允许你在 JS 代码中写出类似HTML/XML 的结构化标记。
    Wanex
        16
    Wanex  
       5 天前
    没区别,@click 就是 onclick 的语法糖
    tog
        17
    tog  
       5 天前


    一个是原生的,一个是 vue 封装的

    估计好多人都没写过原生 html css js 吧。
    Ketteiron
        18
    Ketteiron  
       5 天前   5
    我有个不相关的问题,这位老哥会被疯狂 @吗?
    member/click
    superedlimited
        19
    superedlimited  
       5 天前 via Android
    @Ketteiron 看上面都没啥,看到这里绷不住了
    shakaraka
        20
    shakaraka  
    PRO
       5 天前
    @Ketteiron #18 他很久没上线了 hhhh
    hengshenyu
        21
    hengshenyu  
       5 天前 via Android
    @zhengfan2016 没看到相关文档,这应该不是推荐用法,但是 UI 库里常见。

    https://cn.vuejs.org/guide/components/attrs.html 这里隐式提了一下 @click 这样的一个 v-on 事件监听器将在此对象下被暴露为一个函数 $attrs.onClick ,我想 props emits 也是类似。
    AsuraTG
        22
    AsuraTG  
       5 天前
    ### 最佳实践建议
    在 Vue 开发中, 永远不要使用 onclick ,原因如下:

    1. 代码风格一致性 :保持所有事件绑定都走 Vue 的系统。
    2. 安全性 :onclick 中的字符串代码容易引起 CSP (内容安全策略) 问题,也更容易导致 XSS 风险(如果你动态接字符串的话)。
    3. 可维护性 : @click 能够清晰地指向组件内部逻辑,利于代码阅读和重构。
    唯一可能用到 onclick 的场景 :
    如果你正在集成某些非常古老的第三方库,或者需要在 Vue 挂载之前的极短时间内(例如 index.html 的 loading 状态)响应点击,才可能会用到原生 onclick 。但在 Vue 组件内部,请坚持使用 @click
    lizy0329
        23
    lizy0329  
       5 天前
    回答都是啥玩意
    @click 就是 onclick 的语法糖
    @click.native 才是 dom 元素上的原生 click 事件
    zhengfan2016
        24
    zhengfan2016  
    OP
       5 天前
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1138 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:52 PVG 01:52 LAX 09:52 JFK 12:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86