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

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

  •  
  •   zhengfan2016 · 10 小时 0 分钟前 · 3034 次点击

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

    24 条回复    2025-12-19 17:34:14 +08:00
    BruceXu
        1
    BruceXu  
       9 小时 56 分钟前   ❤️ 1
    我的 AI 解释得很清楚,可惜没法贴给你.

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

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

    :onclick 就是原生 html 的 onclick="" 的绑定方式 --> 所有原生属性都可以通过 :xxxx 来绑定
    @click 是 vue 的 :onclick 的语法糖,同时支持多个修饰符,可以快速实现一些功能,如 @click.prevent
    zhengfan2016
        10
    zhengfan2016  
    OP
       8 小时 41 分钟前
    @hengshenyu 这个是在 vue 的文档的哪里啊,我好像没在文档看到这个,我能看到的就是 @click 是 v-on:click 的语法糖 https://cn.vuejs.org/guide/essentials/event-handling.html#listening-to-events
    94
        11
    94  
       8 小时 40 分钟前
    好难猜啊,为什么这些可以用 `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  
       8 小时 35 分钟前
    @zhengfan2016 渲染函数 & jsx 章节
    v-on 的说明

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

    @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  
       7 小时 18 分钟前
    没区别,@click 就是 onclick 的语法糖
    tog
        17
    tog  
       6 小时 58 分钟前


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

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

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

    1. 代码风格一致性 :保持所有事件绑定都走 Vue 的系统。
    2. 安全性 :onclick 中的字符串代码容易引起 CSP (内容安全策略) 问题,也更容易导致 XSS 风险(如果你动态拼接字符串的话)。
    3. 可维护性 : @click 能够清晰地指向组件内部逻辑,利于代码阅读和重构。
    唯一可能用到 onclick 的场景 :
    如果你正在集成某些非常古老的第三方库,或者需要在 Vue 挂载之前的极短时间内(例如 index.html 的 loading 状态)响应点击,才可能会用到原生 onclick 。但在 Vue 组件内部,请坚持使用 @click
    lizy0329
        23
    lizy0329  
       1 小时 58 分钟前
    回答都是啥玩意
    @click 就是 onclick 的语法糖
    @click.native 才是 dom 元素上的原生 click 事件
    zhengfan2016
        24
    zhengfan2016  
    OP
       54 分钟前
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3250 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    ♥ Do have faith in what you're doing.