在React-Router中动态使用Link组件

时间:2019-05-09 07:02:15

标签: reactjs react-router react-router-v4 react-router-dom

根据组件状态中存储的条件,我希望呈现的特定组件被包装在Link标记或常规div标记中(或者没有标记同样有效! )

我目前正在做的事情似乎冗长而冗长;我觉得我可以使用一种更短的方法来编写此组件,以使代码保持DRY。

存储我的linkThumbnaildefaultThumbnnail组件的两个变量几乎完全相同,除了其中一个变量包含在Link组件中。

然后我在return语句中使用三元运算符为我提供所需的分量。

这里有一些伪代码作为示例:

import React, { Component } from "react";
import { Link } from "react-router-dom";

class ExampleComponent extends Component {
  state = {
    renderLink: false
  };

  render() {
    const linkThumbnail = (
      <Link
        to={{
          pathname: `/someMovieId`,
          state: 'some-data'
        }}
      >
        <div>
          <div className='movie' onClick={this.getMoviePreview}>
            <img
              src={
                poster
                  ? `https://image.tmdb.org/t/p/w300${poster}`
                  : "https://via.placeholder.com/300"
              }
              alt='something here'
            />
          </div>
        </div>
      </Link>
    );

    const defaultThumbnail = (
      <div>
        <div className='movie' onClick={this.getMoviePreview}>
          <img
            src={
              poster
                ? `https://image.tmdb.org/t/p/w300${poster}`
                : "https://via.placeholder.com/300"
            }
            alt='something here'
          />
        </div>
      </div>
    );

    //here I use a ternary operator to show the correct component...shorter method of doing this?
return this.state.renderLink ? linkThumbnail : defaultThumbnail;
  }
}

export default ExampleComponent;

1 个答案:

答案 0 :(得分:1)

尝试创建另一个将this.state.renderLink作为道具的组件:

const ThumbnailLink = ({enabled, children, ...props}) => {
    if (enabled) {
        return <Link {...props}>{children}</Link>;
    } else {
        return <div>{children}</div>;
    }
}

class ExampleComponent extends Component {
    render() {
        return (<ThumbnailLink enabled={this.state.renderLink} to={{pathname: `/someMovieId`, state: 'some-data'}}>
            <div>
                <div className='movie' onClick={this.getMoviePreview}>
                    <img
                        src={
                            poster
                            ? `https://image.tmdb.org/t/p/w300${poster}`
                            : "https://via.placeholder.com/300"
                        }
                        alt='something here'
                    />
                </div>
            </div>
        </ThumbnailLink>);
    }
}