【问题标题】:How to get the prop of another component如何获取另一个组件的 prop
【发布时间】:2020-01-17 19:40:49
【问题描述】:

我是 React 新手,我用 Google 搜索过,但不知道如何做我想做的事。

我想根据我所在的页面设置不同的标题链接样式。我想知道如何(或是否有可能)获得另一个组件的道具。


到目前为止我的代码:

class Header extends React.Component {

    getClass() {
        console.log(this.props.currentPage) // Prints the correct value
        let headerType = "h2";
        if (this.props.currentPage === /*Prop of current Link*/){
            headerType = "h1"
        }
        return ("header-links " + headerType);
    }

    render() {
        return (
            <Link to="/" page_name="Home" className={this.getClass()}>Home</Link>
            <Link to="/About" page_name="About" className={this.getClass()}>About</Link>
            <Link to="/Other" page_name="Other" className={this.getClass()}>Other</Link>               
        );
    }
}

有什么方法可以获取调用getClass()Linkpage_name


我知道我可以将页面名称传递给getClass()

<Link to="/" className={this.getClass("Home")}>Home</Link>

但我认为一定有更好的方法。


我确定我可以使用 vanilla JavaScript 获得它(也许这就是我应该做的)......但我想知道是否有办法使用 Link 的道具或类似的东西。


更新 我的Route

<Route exact path='/' component={Home}/>
<Route exact path='/About' component={About}/>
<Route exact path='/Other' component={Other}/>

我还注意到我偶然在 About Link 中将 Resume 作为 to 属性,现在已修复。

【问题讨论】:

  • 你能发布你的路线吗?
  • 嗨,Zac,检查我的解决方案,如果有帮助,请告诉我。

标签: reactjs react-props react-component


【解决方案1】:

您已有的传递静态名称的想法也将起作用,

<Link to="/" className={this.getClass("Home")}>Home</Link>

或者你可以简化这个,(我建议使用这个)

<Link to="/" className={"header-links " + (this.props.currentPage === "Home" ? "h1" : "h2")}>Home</Link>
<Link to="/About" className={"header-links " + (this.props.currentPage === "About" ? "h1" : "h2")}>About</Link>
<Link to="/Other" className={"header-links " + (this.props.currentPage === "Other" ? "h1" : "h2")}>Other</Link>   

或者另一种方式是在Route's中传递props

<Route exact path='/' component={() => <Home page_name="Home" />}/>
<Route exact path='/About' component={() => <About page_name="About" />}/>
<Route exact path='/Other' component={() => <Other page_name="Other" />}/>

现在您可以在您的 Header 组件中执行此操作,

getClass() {
   console.log(this.props.currentPage) // Prints the correct value
   let headerType = "h2";
   if (this.props.currentPage === this.props.page_name){ //get page_name passed from Route's
       headerType = "h1"
   }
   return ("header-links " + headerType);
}

通过在Route's 中传递props,您需要执行prop-drilling

<Header currentPage="Home" page_name={this.props.page_name} />  //Also need to do for other components

注意:prop-drilling 价格昂贵,不建议使用。

【讨论】:

  • 这太好了,如果你能解释一下 prop-drilling 代码是如何工作的(因为它对我来说似乎很奇怪,但正是我想要的)以及为什么不建议这样做,我会将您的答案标记为正确!
  • prop-drilling 是将 props 传递给子组件的概念。由于您的header 是子组件,而HomeAbout 是父组件,因此您需要将道具向下传递以访问header(子)组件中的道具。
  • prop-drilling 很昂贵,因为考虑到您有一个 Header 的孩子并且想要访问该组件中的道具,在这种情况下,您再次需要将道具传递给该子组件并且等等……
【解决方案2】:

我认为您基本上是以一种可行的方式来解决它,尽管我认为您可以通过使用三元运算符并映射到您的导航链接值数组来避免这种需要。

类似这样的:

const myLinks = [
  { name: "Home", to: "/" },
  { name: "About", to: "/Resume" },
  { name: "Other", to: "/Other" },
];

const Header = props => (
  <div>
    {myLinks.map((item, i) => (
      <Link
        to={item.to}
        page_name={item.name}
        className={`header-links ${
          props.currentPage === item.name ? " h1" : " h2"
        }`}
      >
        {item.name}
      </Link>
    ))}
  </div>
);

编辑:这是假设一个名为 currentPage 的道具被传递到你的标题组件中,当然!

【讨论】:

  • 谢谢,StoutLabs,我知道我可以映射所有链接并使用条件来确定类,但我正在寻找一种从当前上下文中的组件获取道具的方法零件。请参阅 ravibagul91 的回答。
【解决方案3】:

如果你想在 React 中获取另一个组件的 props,你可以使用像 Redux 这样的状态管理工具(这里不需要)或者将组件放在父组件中。 <ParentComponent props={this.state.links} /> //passes down links as a prop for example 然后您可以访问链接作为子组件中的道具,例如this.props.links。如果您不确定它是如何工作的,我建议您观看一些关于传递道具的教程。

【讨论】:

  • 谢谢,优素福。可以扩展(最好有一个例子)你的意思是“将组件放在父组件中”。
  • 假设我有一个名为 Home 的组件。在这个组件中,我有以下作为我的状态... this.state ={ name: " "} 。不要说我有另一个名为 Profile 的组件,我希望 name 变量也可以在 Profile 中使用。我会创建个人资料,然后将其导入主页。在 Home import Profile 的顶部,如下所示: import Profile from "../Profile/Profile.js"(或任何路径)。在您想要的主页中显示配置文件,例如 。您现在可以通过 this.props.name 访问 Profile 中的 name 变量
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 2023-02-14
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多