react-router: How to disable a <Link>, if its active?

后端 未结 9 1024
谎友^
谎友^ 2020-12-14 06:10

How can I disable a in react-router, if its URL already active? E.g. if my URL wouldn\'t change on a click on I want to p

9条回答
  •  盖世英雄少女心
    2020-12-14 06:19

    Based on nbeuchat's answer and component - I've created an own improved version of component that overrides react router's Link component for my project.

    In my case I had to allow passing an object to to prop (as native react-router-dom link does), also I've added a checking of search query and hash along with the pathname

    import PropTypes from 'prop-types';
    import React, { Component } from 'react';
    import { Link as ReactLink } from 'react-router-dom';
    import { withRouter } from "react-router";
    
    const propTypes = {
      to: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.object]),
      location: PropTypes.object,
      children: PropTypes.node,
      onClick: PropTypes.func,
      disabled: PropTypes.bool,
      staticContext: PropTypes.object
    };
    
    class Link extends Component {
      handleClick = (event) => {
        if (this.props.disabled) {
          event.preventDefault();
        }
    
        if (typeof this.props.to === 'object') {
          let {
            pathname,
            search = '',
            hash = ''
          } = this.props.to;
          let { location } = this.props;
    
          // Prepend with ? to match props.location.search
          if (search[0] !== '?') {
            search = '?' + search;
          }
    
          if (
            pathname === location.pathname
            && search === location.search
            && hash === location.hash
          ) {
            event.preventDefault();
          }
        } else {
          let { to, location } = this.props;
    
          if (to === location.pathname + location.search + location.hash) {
            event.preventDefault();
          }
        }
    
        // Ensure that if we passed another onClick method as props, it will be called too
        if (this.props.onClick) {
          this.props.onClick(event);
        }
      };
    
      render() {
        let { onClick, children, staticContext, ...restProps } = this.props;
        return (
          
            { children }
          
        );
      }
    }
    
    Link.propTypes = propTypes;
    
    export default withRouter(Link);
    

提交回复
热议问题