Как скрыть элементы навигационной панели при изменении URL-адреса?

У меня есть компонент навигационной панели с именем Header, который вызывается почти на каждой странице моего веб-приложения, теперь я хочу, чтобы некоторые элементы навигационной панели исчезали при открытии определенных страниц, например, я хочу, чтобы элементы навигации исчезали на http: // localhost: 3000 / рассказы, но должны отображаться на http: // локальный: 3000 /, у меня есть прикрепленные изображения. Например, я хочу "что такое ценность" и "как работает ценность?" исчезнуть на странице / stories Я написал функцию установки состояния для этих элементов при нажатии, но они срабатывают во второй раз, когда я нажимаю элемент навигации историй.

operation()
{
  this.setState({showme:false})

}
 <Navbar className = "fixed-top navbar-custom" color = "white" light expand = "lg">
        <Container>
          <NavbarBrand tag = {Link} to='/'>
            <img src = {logo} alt = "logo" className = "logo" />
          </NavbarBrand>

          <NavbarToggler onClick = {this.toggle} />

          <Collapse isOpen = {this.state.isOpen} navbar>
          { this.state.showme?
            <Nav className = "mr-auto" navbar style = {{cursor:'pointer'}}>
              <NavItem>
              <NavLink onClick = {this.scrollToTop} className = "navlink-custom">What is Valu?</NavLink>
                </NavItem> 
              <NavItem>
                <NavLink onClick = {this.scrollTo} className = "navlink-custom">How Valu work ?</NavLink>
              </NavItem>
            </Nav>
            :null
          }


            <Nav className = "ml-auto" navbar  >
              <NavItem>
                <NavLink onClick = {this.operation}  tag = {Link} to='/stories' className = "navlink-custom">Stories</NavLink>
              </NavItem>
              <NavItem >
                <NavLink  tag = {Link} to='/aboutus' className = "navlink-custom" Link to = "/aboutus">About us</NavLink>
              </NavItem>
              <NavItem>
              <Link to = "/signup">
                <button className = "btn-login">
                  <div className = "login">Register/login</div>
                </button>{' '}
                </Link>
              </NavItem>
            </Nav>
          </Collapse>
        </Container>
      </Navbar>

Routes.js В маршрутах:

    const AppRouter = () =>
    { 
    return ( 
    <Router> 
    <Switch> 
    <Route exact path='/' component = {App}/> 
    <Route path='/howvaluworks' component = {HowValuWorks} /> 
    <Route path='/Footer' component = {footer} /> 
    <Route path='/aboutus' component = {AboutUs} /> 
    <Route path='/login' component = {loginform}/> 
    <Route path='/signup' component = {signupform}/>
    <Route path='/signup' component = {signupform}/> 
    <Route path='/profile-tutorial' component = {profiletutorial}/> 
    <Route path='/profile-account' component = {profileaccount}/> 
    <Route path='/stories' component = {stories}/> 
    <Route path='/profilelaunch' component = {profilelaunch}/> 
  )};

Я обновил свой ответ

CodeZombie 20.08.2018 14:31

Теперь он работает, большое спасибо, я использовал эту ссылку, чтобы получить маршрут stackoverflow.com/a/51389622/10248999

Usman 20.08.2018 15:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
2
4 007
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Задайте условие в зависимости от местоположения маршрута в componentWillReceiveProps.

constructor(props){
 super(props);
  this.state = { 
    hideValu : 1
  };
 this.changeNavItem = this.changeNavItem.bind(this);
}

componentDidMount(){
 this.changeNavItem(this.props.location.pathname);
}

componentWillReceiveProps(nextProps){
 if (this.props.location.pathname !== nextProps.location.pathname){
   this.changeNavItem(nextProps.location.pathname); 
  }
}

changeNavItem(currentRoute){
  if (currentRoute == "\stories"){
       this.setState({
          hideValu : 0
       });
    }
}

На панели навигации

{ this.state.showme? <Nav className = "mr-auto" navbar style = {{cursor:'pointer'}}>
        this.state.hideValu && <div>
          <NavItem>
             <NavLink onClick = {this.scrollToTop} className = "navlink-custom">What is 
             Valu?</NavLink>
          </NavItem> 
          <NavItem>
            <NavLink onClick = {this.scrollTo} className = "navlink-custom">How Valu 
            work ?
            </NavLink>
          </NavItem>
        </div>
        </Nav>
        :null
      }

ОБНОВИТЬ

Оберните свои маршруты компонентом MainLayout, в котором вы определяете компоненты header и footer. Таким образом, вы обновите значение props.location и получите к нему доступ.

  <Router>
        <Switch>
         <MainLayout>
            <Route exact path='/' component = {App}/>
            <Route path='/howvaluworks' component = {HowValuWorks} />
            <Route path='/Footer' component = {footer} />
            <Route path='/aboutus' component = {AboutUs} />
            <Route path='/login' component = {loginform}/>
            <Route path='/signup' component = {signupform}/>
            <Route path='/profile-tutorial' component = {profiletutorial}/>
            <Route path='/profile-account' component = {profileaccount}/>
            <Route path='/stories' component = {stories}/>
            <Route path='/profilelaunch' component = {profilelaunch}/>
            <Route path='/draft' component = {draft}/>
            <Route path='/dashboard' component = {dashboard}/>
            <Route path='/launchsurvey' component = {launchsurvey}/>
          </MainLayout>
        </Switch>
    </Router>

MainLayout.js

import React from "react"
import Header  from '../containers/Header';
import Footer from "./Footer"

class MainLayout extends React.Component{
  render() {
      return(
         <div>
            <Header />
              <div className = "appLayout">
                { this.props.children }
              </div>
            <Footer />
         </div>
      );
  }
}

export default MainLayout

Добавьте также добавьте navbar в компонент заголовка

Я добавил ваш код, но он говорит: "pathname" undefined. Итак, где мне нужно инициализировать это имя пути, я новичок, чтобы реагировать, так что обнажите меня, если я веду себя глупо в этой ситуации.

Usman 20.08.2018 13:55

Я использую response-router-dom

Usman 20.08.2018 14:06
react-router-dom: 4.2.2 это то, что я использую
Usman 20.08.2018 14:10

Хорошо, это круто. Пожалуйста, поделитесь своим пользовательским routes.js , который обрабатывает ваши компоненты.

CodeZombie 20.08.2018 14:11

Я добавил кодировку файла в свой вопрос .. !!

Usman 20.08.2018 14:20

Ваша логика работает, но, к сожалению, она не получает своего значения path ... У вас есть другой способ сделать это, я применил все изменения в проекте, рекомендованном вами !!

Usman 20.08.2018 15:34

Если вам нужно быстрое решение. Вы можете просто использовать window.location.pathname, чтобы проверить свой URL-адрес и выполнить некоторые условия, подобные этому

    this.state = {
  hideNavItems: false
}

componentDidMount() {
  if (window.location.pathname === '/stories') {
    this.setState({hideNavItems: true});
  }
}

render() {
  return (
    <Navbar className = "fixed-top navbar-custom" color = "white" light expand = "lg">
      <Container>
        <NavbarBrand tag = {Link} to='/'>
          <img src = {logo} alt = "logo" className = "logo" />
        </NavbarBrand>

        <NavbarToggler onClick = {this.toggle} />

        <Collapse isOpen = {this.state.isOpen} navbar>
        { !this.state.hideNavItems 
          ? (<span>
              <Nav className = "mr-auto" navbar style = {{cursor:'pointer'}}>
                <NavItem>
                  <NavLink onClick = {this.scrollToTop} className = "navlink-custom">What is Valu?</NavLink>
                </NavItem> 
                <NavItem>
                  <NavLink onClick = {this.scrollTo} className = "navlink-custom">How Valu work ?</NavLink>
                </NavItem>
              </Nav>
            </span>)
          : null
        }


          <Nav className = "ml-auto" navbar  >
            <NavItem>
              <NavLink onClick = {this.operation}  tag = {Link} to='/stories' className = "navlink-custom">Stories</NavLink>
            </NavItem>
            <NavItem >
              <NavLink  tag = {Link} to='/aboutus' className = "navlink-custom" Link to = "/aboutus">About us</NavLink>
            </NavItem>
            <NavItem>
            <Link to = "/signup">
              <button className = "btn-login">
                <div className = "login">Register/login</div>
              </button>{' '}
              </Link>
            </NavItem>
          </Nav>
        </Collapse>
      </Container>
    </Navbar>
  )
}

Другие вопросы по теме