В компоненте React, который обрабатывает боковую панель, у нас есть Menu Items
, как modules
.Я хочу передать определенное состояние из Redux, а в случае ложного скрыть определенный элемент.Я сделал это, но с передачей состояния в качестве реквизита с componentWillRecieveProps
.Но мне нужно сделать это специально с createSelector
из reselect
, так как componentWillRecieveProps устареет, и мы начинаем использовать повторный выбор все больше и больше.
Проблема в том, что я понятия не имею, как это сделать.Повторный выбор документов скорее сбивает с толку, чем помогает. Так вы можете немного помочь?
Компонент:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { createSelector } from 'reselect';
import { isRouteActive } from './location';
class ModuleNavigation extends Component {
static propTypes = {
modules: PropTypes.array,
user: PropTypes.object,
currentRoute: PropTypes.string,
isMinimized: PropTypes.bool,
isItAvailable: PropTypes.bool,
}
state = {
isOpen: false,
}
constructor(props) {
super(props);
this.topNavRef = React.createRef();
this.bottomNavRef = React.createRef();
this.moduleNavRef = React.createRef();
}
componentDidUpdate() {
this.updateArrows();
}
componentDidMount() {
this.updateArrows();
window.addEventListener('resize', this.updateArrows);
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateArrows);
}
onToggle = () => {
this.setState({ isOpen: !this.state.isOpen });
}
getRefId = (index) => {
if (index === 0) return this.topNavRef;
if (this.props.modules && index === this.props.modules.length - 1) return this.bottomNavRef;
return null;
}
renderGroup = (group, index, user, currentRoute, isMinimized) => (
<ul ref={this.getRefId(index)} key={group.name} className="module-navigation-group nav">
{
<li className={classNames('mt-10 mb-10 module-navigation-group-separator', { hidden: index === 0 })} />
}
{group.children
.filter(mod =>
mod.route && (!mod.permissions || userHasPermission(user, mod.permissions)))
.map(mod =>
(<li key={mod.name} className={classNames('module-navigation-group-item', { active: isRouteActive(currentRoute, mod.route) })}>
<a href={(mod.parentApp ? '#' : '') + mod.route} target={mod.target} title={mod.name}>
<i className={`fa ${mod.classNames} module-navigation-group-item-icon`} />
{!isMinimized && <span className="hidden-xs hidden-sm ml-15 module-navigation-group-item-label">{mod.name}</span>}
</a>
</li>))}
</ul>
)
render() {
const {
modules,
currentRoute,
user,
isItAvailable,
} = this.props;
if (!user || !modules || !modules.length) return null;
return (
<div className={classNames('module-navigation-wrapper', { 'is-minimized': isMinimized })}>
<div ref={this.moduleNavRef} isZKAvailable={isZKAvailable} className="module-navigation">
{
modules.map((group, index) =>
this.renderGroup(group, index, user, currentRoute, isMinimized))
}
</div>
);
}
}
export default ModuleNavigation;
Я хочу передать логическое значение isItAvailable
пунктам меню, называемымmodules
здесь, и проверьте дочерние элементы модулей, для конкретного.Если isItAvaialable =false
не показывать