如何获得其他组件的道具

时间:2019-09-17 00:15:51

标签: reactjs react-props react-component

我是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>               
        );
    }
}

是否有某种方法可以获取正在调用page_name的{​​{1}}中的Link


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

getClass()

但我认为必须有更好的方法。


我确定我可以使用普通JavaScript来获取它(也许那是我应该做的)...但是我想知道是否有一种方法可以使用<Link to="/" className={this.getClass("Home")}>Home</Link> 道具或类似物品。


更新 我的Link

Route

我还注意到,我偶然将“ <恢复> 作为<Route exact path='/' component={Home}/> <Route exact path='/About' component={About}/> <Route exact path='/Other' component={Other}/> 中的to道具,现已修复。

3 个答案:

答案 0 :(得分:2)

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

<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>   

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

<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);
}

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

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

注意prop-drilling昂贵,不建议这样做。

答案 1 :(得分:0)

好吧,如果您想在React中获取其他组件的道具,则可以使用Redux之类的状态管理工具(此处没有必要)或将该组件放入父组件中。 <ParentComponent props={this.state.links} /> //passes down links as a prop for example      然后您可以在this.props.links之类的子组件中以访问链接作为道具。如果您不确定道具的工作方式,我建议您看一些有关传递道具的教程。

答案 2 :(得分:0)

我认为您实质上是在以一种可行的方式进行操作,尽管我认为您可以通过使用三元运算符并映射到导航链接值的数组来避免这种情况。

类似这样的东西:

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的道具正在传递到您的标头组件中!