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

如何向Redux Dispatch传参?React-Bootstrap按钮传参至Reducer问题

解决方法:将专属bsName传递到Redux Reducer

嘿,我懂你的需求——给每个带专属bsName的自定义react-bootstrap Button组件,把这个属性传递到Redux reducer里对吧?核心思路就是在触发action的时候把bsName作为参数携带过去,下面我一步步给你拆解实现步骤:

1. 调整Action Creator,让它接收bsName参数

首先要让你的Redux action能够承载bsName信息,修改你的action文件:

// actions.js
export const handleButtonHover = (bsName) => ({
  type: 'BUTTON_HOVER',
  payload: { bsName } // 将bsName放入payload中传递给reducer
});

export const handleButtonLeave = (bsName) => ({
  type: 'BUTTON_LEAVE',
  payload: { bsName }
});

2. 修改mapDispatchToProps,支持传递动态参数

原来的mapDispatchToProps可能是直接绑定action,现在要改成返回可接收参数的函数,这样才能从组件拿到bsName:

// 你的组件文件中
import { handleButtonHover, handleButtonLeave } from './actions';

const mapDispatchToProps = (dispatch) => ({
  // 返回函数,等待组件触发事件时传入bsName
  onMouseEnter: (bsName) => dispatch(handleButtonHover(bsName)),
  onMouseLeave: (bsName) => dispatch(handleButtonLeave(bsName))
});

⚠️ 注意:不要直接写成dispatch(handleButtonHover(bsName)),那样会在组件初始化时就执行action,必须返回一个函数延迟执行。

3. 在自定义Button组件中传递bsName给事件回调

你的自定义Button组件需要接收bsName作为props,然后在鼠标事件触发时把它传给Redux的回调:

class CustomHoverButton extends React.Component {
  static propTypes = {
    bsName: PropTypes.string.isRequired,
    onMouseEnter: PropTypes.func.isRequired,
    onMouseLeave: PropTypes.func.isRequired
  };

  render() {
    // 解构出bsName和事件回调,剩下的props传给原生Button
    const { bsName, onMouseEnter, onMouseLeave, ...rest } = this.props;
    return (
      <Button
        {...rest}
        // 用箭头函数包裹,触发时传入当前按钮的bsName
        onMouseEnter={() => onMouseEnter(bsName)}
        onMouseLeave={() => onMouseLeave(bsName)}
      />
    );
  }
}

// 用connect连接组件和Redux
export default connect(null, mapDispatchToProps)(CustomHoverButton);

4. 在Reducer中接收并处理bsName

现在你的reducer就能从action.payload中拿到bsName,进行对应的状态处理了:

// reducers.js
const initialState = {
  hoveredButtonNames: [] // 示例:存储当前处于hover状态的按钮名称
};

const buttonReducer = (state = initialState, action) => {
  switch(action.type) {
    case 'BUTTON_HOVER':
      return {
        ...state,
        hoveredButtonNames: [...state.hoveredButtonNames, action.payload.bsName]
      };
    case 'BUTTON_LEAVE':
      return {
        ...state,
        hoveredButtonNames: state.hoveredButtonNames.filter(name => name !== action.payload.bsName)
      };
    default:
      return state;
  }
};

export default buttonReducer;

可选优化(针对性能敏感场景)

如果你的按钮组件渲染频率极高,担心render里的箭头函数导致不必要的重渲染,可以用useCallback(函数组件)或者在class组件中提前绑定方法:

// 函数组件版本示例
import { useCallback } from 'react';

const CustomHoverButton = ({ bsName, onMouseEnter, onMouseLeave, ...rest }) => {
  // 用useCallback缓存回调函数
  const handleEnter = useCallback(() => onMouseEnter(bsName), [bsName, onMouseEnter]);
  const handleLeave = useCallback(() => onMouseLeave(bsName), [bsName, onMouseLeave]);

  return (
    <Button {...rest} onMouseEnter={handleEnter} onMouseLeave={handleLeave} />
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:22:52