【问题标题】:React Router Link, onClick Action Not Firing反应路由器链接,onClick 操作未触发
【发布时间】:2017-09-01 00:32:42
【问题描述】:

我正在使用 React Router Dom Link。我想在呈现新页面之前触发一个动作。新页面的 componentDidMount() 生命周期方法取决于用户单击帖子的用户名时触发的操作。

代码示例:

 <Link to={`/Profile/${post.uid}`}
    onClick={(e) => this.handleItemClick(post.uid)}>{post.name}</Link>

handItemClick

handleItemClick = (uid) => {changeUserUidState(uid)}

changeUserUidState 是被调度的动作创建者。我正在使用 mapStateToProp 和 mapDispatchToProp,如下所示

export default connect(({posts, userData}) => ({posts, userData}), ({changeUserUidState}))(Feeds);

动作创建者 const changeUid = (uid) => {return uid}

export const changeUserUidState = uid => ({
  type: 'UPDATE_UID', payload: changeUid(uid),
});

我的有效载荷应该只返回 uid,我可以简单地返回而不是调用 changeUid。但是,我包含这段代码是为了说一旦用户单击用户名,我可以在 changeUid 中使用 console.log(),但是我的 redux 工具永远不会触发 'UPDATE_UID' 并且我的商店永远不会更新 uid。

我怎样才能调用一个动作,但动作的类型永远不会触发?

我的减速器

import initialState from './initialState';

export default function (userUid = initialState.userUid, action) {
  switch (action.type) {
    case 'UPDATE_UID':
      return action.payload;
    default:
      return userUid;
  }
}

并且 userUid 的 intialState 是一个空字符串。

【问题讨论】:

  • 你的初始状态怎么样?
  • 它是一个空字符串。

标签: reactjs redux react-redux action react-router-dom


【解决方案1】:

看起来你只是在调用函数而不调用dispatch

将动作发送到reducer的是调用dispatch。因此,您必须将发送的内容构造为 mapDispatch 到 props 和一个函数,该函数接受调度并返回一个使用它的对象。像这样:

const mapDispatch = dispatch => ({
  dispatchChangeUID: (uid) => {
    dispatch(changeUserUidState(uid))
  }
})

export default connect(({posts, userData}) => ({posts, userData}), mapDispatch)(Feeds);

然后你会在 onClick 中调用props.dispatchChangeUID 来获取链接。

【讨论】:

  • @DillGromle,我正在使用内联 mapStateToProp export default connect(({posts, userData}) => ({posts, userData}), ({changeUserUidState}))(Feeds); connect 函数中的第二个参数是 mapStateToProp
  • 是的,但是就像mapState是一个接受状态并返回一个对象的函数一样,mapDispatch必须是一个接受dispatch然后调用它的函数。在您的代码中,您只是传递对象而不是在任何地方使用调度。
  • 我在这里使用它 /Profile/${post.uid}} onClick={(e) => this.handleItemClick(post.uid)}>{post.name} 就像我在 OP 中所说的,正在调用 changeUserUidState。我正在采取行动,并能够从中 console.log 。但是,“UPDATE_UID”类型的操作没有被调度。
  • 没错,因为你得调用dispatch函数,传入this.handleItemClick。 action creator 只创建 action 对象,dispatch 就是将该对象传递给 reducer
  • 看看这篇文章,看看它是否有助于更好地解释。 stackoverflow.com/questions/39419237/what-is-mapdispatchtoprops
猜你喜欢
  • 2019-02-04
  • 2020-11-24
  • 1970-01-01
  • 2018-07-13
  • 2018-04-15
  • 2018-01-03
  • 2013-09-12
  • 1970-01-01
相关资源
最近更新 更多