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

React函数组件中两个按钮点击均输出2的原因排查求助

问题原因分析与解决方案

嘿,我来帮你搞定这个问题!你现在遇到的核心问题是全局变量引发的闭包陷阱,具体来说:

你在BtnClick.js里把funcc和btnType声明成了组件外部的全局变量:

var funcc;
var btnType;

当React渲染两个BtnClick组件时,第一个组件会把这两个变量设为props.func和"1",但紧接着第二个组件会覆盖这两个变量的值为props.func和"2"。这就导致不管你点击哪个按钮,触发cliquage函数时,调用的都是最后被覆盖的btnType(也就是"2"),自然控制台只会输出"2"了。


修复方案(两种可选)

方案1:直接用内联箭头函数传递参数

修改BtnClick.js,去掉全局变量,直接在onClick事件里调用props.func并传入当前组件的type:

import React from 'react';
import './BtnClick.css';

function BtnClick (props){
 return (
  <div className="BtnClick" onClick={() => props.func(props.type)}>
   hi {props.type}
  </div>
 )
}

export default BtnClick;

方案2:组件内部定义点击函数(利用闭包保存props)

如果不想用内联函数,也可以把点击函数定义在组件内部,这样每个组件实例都会拥有自己的cliquage函数,通过闭包拿到当前的props:

import React from 'react';
import './BtnClick.css';

function BtnClick (props){
  // 每个组件实例都有自己的cliquage函数,能获取当前的props
  const cliquage = () => {
    props.func(props.type);
  };

 return (
  <div className="BtnClick" onClick={cliquage}>
   hi {props.type}
  </div>
 )
}

export default BtnClick;

补充:实现完整需求(更新Quote组件文本)

如果你还需要让Quote组件根据点击显示"left"或"right",记得在App.js的updateQuote函数里调用setQuoteText:

function updateQuote(type){
 console.log(type);
 // 根据type设置对应的文本
 setQuoteText(type === "1" ? "left" : "right");
}

这样点击左侧按钮(type="1")时,Quote就会显示"left",点击右侧按钮(type="2")时显示"right"啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:42:51