当前位置: 首页 > 知识库问答 >
问题:

如何使用React从父组件访问历史支柱?

习斌
2023-03-14

我有一个方法showInfo,它由两个组件Child1和child2访问。

最初,我在Child1组件中有showInfo方法,如下所示

const Child1 = ({history}: RouteComponentProps) => {
    type Item = {
        id: string,
        name: string,
        value: string,
    };

    const showInfo = (item: item) => {
        const id = item.id;
        const value = item.value;
        const handleRouteChange = () => {
            const path = value === 'value1' ? `/value1/?item=${itemId}` : `/value2/?item=${itemId}`; 
            history.push(path);
        }

       return (
           <Button onClick={handleRouteChange}> Info </Button>
       );
   }


   return (
       <SomeComponent 
           onDone = {({ item }) => {
               notify({
                   actions: showInfo(item)
               }) 
           }}
       />
   );

}

上面的代码起作用。但现在我有另一个组件child2,它需要使用相同的方法showinfo。

组件child2如下所示

const Child2 = () => {
   return (
       <Component 
           onDone = {({ item }) => {
               notify({
                   actions: showInfo(item)
               }) 
           }}
       />
   );

}

我没有在Child2组件中编写相同的方法showInfo,而是将它放在不同的文件中,在这个文件中,child1和Child2组件可以共享showInfo方法。

下面是名为utils.tsx的文件,该文件具有showInfo方法

 export const showInfo = (item: item) => {
        const id = item.id;
        const value = item.value;
        const handleRouteChange = () => {
            const path = value === 'value1' ? `/value1/?item=${itemId}` : 
            `/value2/?item=${itemId}`; 
            history.push(path); //error here push is not identified as no 
            //history passed
        }

       return (
           <Button onClick={handleRouteChange}> Info </Button>
       );
   }


   return (
       <SomeComponent 
           onDone = {({ item }) => {
               notify({
                   actions: showInfo(item)
               }) 
           }}
       />
   );

}

通过上面的操作,我在showInfo方法中使用history.push时得到了错误。未定义推送。

这是因为在此文件utils.tsx中未定义历史记录

现在的问题是我如何从child1或child2组件传递历史记录。或者在这种情况下我可以访问历史记录的另一种方式是什么。

有人能帮我一下吗。多谢了。

共有1个答案

蒋啸
2023-03-14

虽然您可能会创建一个自定义钩子,但您的函数返回JSX。这里讨论了在自定义钩子中返回JSX的问题。IMO,这与其说是一个util或自定义钩子场景,不如说是一个可重用的组件。这很好!

export const ShowInfo = (item: item) => { // capitalize

   const history = useHistory(); // use useHistory

   // ... the rest of your code

}

现在在Child1和child2中:

return (
  <SomeComponent 
    onDone = {({ item }) => {
      notify({
        actions: <ShowHistory item={item} />
      }) 
    }}
  />
);

您可能必须根据ondone属性和notify函数调整一些代码,但这种模式提供了您所要寻找的可重用行为。

 类似资料:
  • 如何在孩子的标签和函数sayhello中访问家长的道具? (我可以访问兄弟姐妹和孩子,而无需将道具作为参数传递,但不能访问家长) \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 和(远离本例) 如果此代码引用了 如何访问家长的道具 如果将Chi

  • 问题内容: 如果我有类似的东西 我想从我拥有的地方访问,该怎么办? 问题答案: 推荐用于16.3之前的React版本 如果无法避免,那么从React文档中提取的建议模式将是: 该 家长 转发绑定到一个功能道具 家长 。当呼叫作出反应的 儿童的 道具也将分配 孩子的 给 父母的 财产。 建议用于React> = 16.3 引用转发是一种选择加入功能,它使某些组件可以接收它们收到的引用,并将其进一步向

  • 我在用vue-cli支架做网页包 我的Vue组件结构/传家宝目前看起来如下: 应用程序 在应用程序级别,我需要一个vuejs组件方法,该方法可以将子组件的所有数据聚合到一个JSON对象中,然后发送到服务器。 有没有办法访问子组件的数据?具体来说,多层深? 如果没有,传递oberservable数据/参数的最佳实践是什么,这样当子组件修改它时,我就可以访问新的值?我试图避免组件之间的硬依赖关系,所以

  • 我使用Expo,我想添加访问我的应用程序的用户有一个谷歌帐户。然后我需要得到有关用户登录到我的应用程序谷歌日历的信息。 我使用:(https://docs.expo.io/versions/latest/sdk/google)实现登录功能。我的范围如下所示: 当有人试图登录我的应用程序时,它会询问查看日历列表的权限。作为回应,我得到: 我收到了关于用户的数据,但我没有关于它的日历的任何数据。我尝试