You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React点击按钮切换图片报错:onClick需传入函数而非对象

解决React onClick报错:Expected onClick listener to be a function

你的报错原因很明确:你直接在onClick里调用了ChangeImage({ad1}),这会立刻执行函数,把函数的返回值(async函数返回Promise对象)传给onClick,而onClick需要的是一个函数引用,不是对象。

另外还有两个小问题:

  • 你给ChangeImage传的是{ad1}(一个包含ad1属性的对象),但函数里需要的是文件名字符串/资源路径,直接传ad1就行。
  • React不推荐直接通过document.querySelector操作DOM,应该用状态来管理视图,这是React的核心思想。

修复方案1:修正onClick传递方式(保留DOM操作,不推荐)

把按钮的onClick改成箭头函数包裹,确保传递的是函数:

import React from 'react'
import './BigAd.css'
import ad1 from './ad1.jpg'
import ad2 from './ad2.jpg'
import ad3 from './ad3.jpg'
import ad4 from './ad4.png'

export default function BigAd() {
    const ChangeImage = (fileName)=>{
       let img = document.querySelector("#BannerAd")
        img.setAttribute("src", fileName)
    }
  return (
    <div>
         <div className="container">
        <img id='BannerAd' src={ad1} alt="Ad"/>
        <button onClick={() => ChangeImage(ad1)}>button 2</button>
        <button onClick={() => ChangeImage(ad2)}>button 3</button>
        <button onClick={() => ChangeImage(ad3)}>button 1</button>
        <button onClick={() => ChangeImage(ad4)}>button 4</button>
        </div> 
    </div>
  )
}

注:这里去掉了async,因为函数里没有异步操作,没必要用async。

修复方案2:用React状态管理(推荐,符合React范式)

用useState来控制当前显示的图片,完全避免DOM操作:

import React, { useState } from 'react'
import './BigAd.css'
import ad1 from './ad1.jpg'
import ad2 from './ad2.jpg'
import ad3 from './ad3.jpg'
import ad4 from './ad4.png'

export default function BigAd() {
    const [currentAd, setCurrentAd] = useState(ad1)

    const ChangeImage = (fileName)=>{
       setCurrentAd(fileName)
    }
  return (
    <div>
         <div className="container">
        <img src={currentAd} alt="Ad"/>
        <button onClick={() => ChangeImage(ad1)}>button 2</button>
        <button onClick={() => ChangeImage(ad2)}>button 3</button>
        <button onClick={() => ChangeImage(ad3)}>button 1</button>
        <button onClick={() => ChangeImage(ad4)}>button 4</button>
        </div> 
    </div>
  )
}

这样代码更简洁,也符合React的单向数据流理念,不需要手动操作DOM。

内容的提问来源于stack exchange,提问作者Afeef Raza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:30:56