从 Redirect 获取 mapStateToProps 中的 ownProps.match.params.id

Posted

技术标签:

【中文标题】从 Redirect 获取 mapStateToProps 中的 ownProps.match.params.id【英文标题】:Get ownProps.match.params.id in mapStateToProps from Redirect 【发布时间】:2019-12-07 21:54:22 【问题描述】:

卡片组件显示文章数据或笔记数据。

我想在Card组件中点击Link并在Details组件中显示后进入卡片详细信息,所以我使用了重定向,如下:

import React,  Component  from 'react';
import  Redirect  from 'react-router-dom';
import Link from 'components/atoms/Link/Link';

class Card extends Component 
  state =  redirect: false ;
  toggleButtonDetails = () => this.setState( redirect: true );

  render() 
    const  _id, type  = this.props;
    const  redirect  = this.state;

    if (redirect) 
      return <Redirect push to=`/$type/$_id` />;
    

    return (
      <Link onClick=this.toggleButtonDetails>See details</Link>
    );
  


export default Card;

这很重要,因为我不想根据 URL 发送 notes\:id 请求或 articles\:id 请求(在浏览器中输入)而是从有很多文章和注释的商店获取详细信息。

所以,我决定在mapStateToProps 中使用ownPropsDetails 组件中:

import React from 'react';
import  connect  from 'react-redux';

const Details = ( activeItem ) => 
  const [item] = activeItem;
  return (
    <>
      <p>item.id</p>
      <p>item.type</p>
    </>
  );
;

const mapStateToProps = (state, ownProps) => (
  activeItem: state[ownProps.type].filter(item => item._id === ownProps.match.params.id),
);

export default connect(mapStateToProps)(Details);

点击Card 中的Link 后,我移动到正确的URL(例如http://localhost:3000/notes/5d3c87034532003a6c666a67),但我有一个错误,我得到Cannot read property 'params' of undefinedactiveItem: state[ownProps.type]... 一致。

当我在 mapStateToProps 中使用 console.log(ownProps) 时,我看到 ownProps 只包含 type 而没有 id

当我将 ownProps.match.params.id 更改为 '5d3c87034532003a6c666a67' 时,我看到了正确的注释详细信息,但只有一个指定的注释 - 这很明显,但这意味着 store 工作正常,但我在 Details 中看不到 id 属性组件

编辑:Details 组件位于Article 组件内,没有id...

const Article = () => (
  <Online>
    <Wrapper>
      <Header>Your article</Header>
      <Details type="articles" />
    </Wrapper>
  </Online>
);

export default Article;

这应该是一种传递id属性的方法...我更接近解决方案...

【问题讨论】:

【参考方案1】:

Details 组件位于 Article 组件内部,没有 身份证...

嗯,你是对的。 Details 永远不会得到 match 属性。您需要使用withRouter HOC。

export default connect(mapStateToProps)(withRouter(Details))

或者(不推荐)来自Article的钻孔道具

const Article = (props) => (
  <Online>
    <Wrapper>
      <Header>Your article</Header>
      <Details type="articles" ...props />
    </Wrapper>
  </Online>
);

【讨论】:

以上是关于从 Redirect 获取 mapStateToProps 中的 ownProps.match.params.id的主要内容,如果未能解决你的问题,请参考以下文章

Spotify API 从 redirect_uri 获取授权码

为啥我无法从 OAuth 2 服务器作为 JSON 接收“访问令牌”并且我需要定义“redirect_uri”?

从浏览器获取重定向 URL - Android

在 facebook 应用程序中获取访问令牌时,redirect_uri 应该是啥?

H5页面获取微信信息授权,微信授权,微信授权“redirect_uri 参数错误

ASP.Net - Google Calendar API V3 redirect_uri_mismatch 错误