redux 在react中URL更改时重新呈现相同组件

pn9klfpd  于 2022-11-12  发布在  React
关注(0)|答案(6)|浏览(168)

我有一个路径,它接受一个id,并为每个id呈现相同的组件,例如:<Route path='/:code' component={Card}/>
现在,在Link标记中,我向组件传递了一个id。现在,Card组件根据传递的id获取更多的细节。但问题是,它只呈现一个id,如果我单击“后退”并后藤下一个id,它将不会更新。我搜索并发现componentsWillReceiveProps可以使用,但在最近的React版本中,它已被弃用。那么,如何做到这一点呢?

jecbmhm3

jecbmhm31#

将当前位置作为关键字放在组件上可解决此问题。

<Route path='/:code' component={(props) => <Card {...props} key={window.location.pathname}/>}/>
0sgqnhkj

0sgqnhkj2#

我刚刚遇到了一个类似的问题。我想你是混淆更新/重新渲染和重新挂载。This图上的React生命周期方法帮助我当我处理它。
如果你的问题和我的问题一样,你有一个组件

class Card extend Component {
  componentDidMount() {
    // call fetch function which probably updates your redux store  
  }

  render () {
    return // JSX or child component with {...this.props} used, 
           // some of which are taken from the store through mapStateToProps
  }
}

当你第一次点击一个安装这个组件的网址时,一切都正常,然后,当你访问另一个使用相同组件的路径时,什么都没有改变。这是因为组件没有被重新安装,它只是被更新了,因为一些属性改变了,至少this.props.match.params在改变。
但是componentDidMount()不会在组件更新时被调用(见上面的链接),所以你不会获取新的数据并更新redux存储,你应该添加一个componentDidUpdate()函数,这样你就可以在属性改变时再次调用获取函数,而不仅仅是在组件最初被挂载时。

componentDidUpdate(prevProps) {
  if (this.match.params.id !== prevProps.match.params.id) {
    // call the fetch function again
  }
}

有关详细信息,请查看react文档。

lymnna71

lymnna713#

其实我想到了另一种方法。
我们将从示例代码开始:<Route path='/:code' component={Card}/>
您要做的是让<Card>成为一个 Package 器组件,最好是功能性的(我认为它实际上不需要任何状态),并通过将您的props传递给{...props}来呈现您想要呈现的组件,以便它获得Router属性,但重要的是给予它一个key prop,这将强制它从头开始重新呈现
例如,我有一个类似这样的东西:

<Route exact={false} path="/:customerid/:courierid/:serviceid" component={Prices} />

我希望组件在URL改变时重新呈现,但仅在customerid或serviceid改变时。因此,我将Prices制作成一个功能组件,如下所示:

function Prices (props) {
    const matchParams = props.match.params;
    const k = `${matchParams.customerid}-${matchParams.serviceid}`;
    console.log('render key (functional):');
    console.log(k);
    return (
        <RealPrices {...props} key={k} />
    )
}

请注意,我的键只考虑customerid和serviceid--当这两个参数发生变化时,它会重新呈现,但当courierid发生变化时,它不会重新呈现(如果需要的话,只需将其添加到键中即可)。

q5lcpyga

q5lcpyga4#

如果您正在寻找一个使用挂钩的解决方案。
如果您要从某个API获取数据,则可以将该调用 Package 在useEffect块中,并将history.location.pathname作为参数传递给useEffect
编码:

import { useHistory } from "react-router";

const App = () => {
  const history = useHistory();

  useEffect(() => {
    //your api call here
  }, [history.location.pathname]);
};

react-routeruseHistory挂钩将给予路径名,因此每次更改useEffecturl)时都会调用它

anauzrmj

anauzrmj5#

如@theshubhagrwl所述,但您可以使用location.href而不是location.pathname在所有情况下工作

import { useHistory } from "react-router";

const App = () => {
  const history = useHistory();

  useEffect(() => {
    // do you task here 
  }, [history.location.href]);
};
4dc9hkyq

4dc9hkyq6#

在React Router v4中,在路由器修复问题后添加交换机标记

相关问题