【发布时间】:2020-04-10 20:25:53
【问题描述】:
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { Container } from './styles';
import { MdContentCopy, MdGroup, MdPerson, MdMovie, MdSettings } from 'react-icons/md';
const items = [
{
route: '/',
icon: <MdContentCopy />,
title: 'Orders',
},
{
route: '/customers',
icon: <MdGroup />,
title: 'Customers',
},
{
route: '/movies',
icon: <MdMovie />,
title: 'Movies',
},
{
route: '/settings',
icon: <MdSettings />,
title: 'Settings',
},
{
route: '/Profile',
icon: <MdPerson />,
title: 'Profile',
},
];
class ItemList extends Component {
state = {
active: false,
};
render() {
const { open, history } = this.props;
const pathName = history.location.pathname;
return (
<Container open={open} active={this.state.active}> // PASSING ACTIVE PROPS TO STYLED COMPONENT
{items.map((item, index) => {
if (item.route === pathName) this.setState({ active: true }); // THIS THROWS AN ERROR BECAUSE TOO MANY RE-RENDERS
return (
<Link to={item.route} key={index}>
{item.icon}
<span>{item.title}</span>
</Link>
);
})}
</Container>
);
}
}
export default ItemList;
我正在尝试将活动道具传递给循环内的样式化组件(容器)。我尝试使用 setState 来触发重新渲染,因为如果我只是分配一个变量(让 active = false 并且如果 if 语句为 true 则 active = true)它不会重新渲染组件并且 active 将始终为 false .但是循环内的 setState 会进行大量的重新渲染并引发深度超出错误。关于如何做到这一点的任何想法?
【问题讨论】:
-
您如何确定容器是否处于活动状态?是什么设置了这种状态?正如您所发现的那样,您显然不能在渲染中
setState。 -
这一行: if (item.route === pathName) this.setState({ active: true });确定 active 是 true 还是 false。如果 item.route 与 pathName 匹配,则 active 应该为 true。
-
我认为订阅
onhashchange或onpopstate类型的事件并在这些事件处理程序中设置您的状态是更好的主意。 -
你能给我看一些Eldar的例子吗?
-
让我困惑的部分是
ItemList将被激活还是Link组件本身?
标签: javascript reactjs styled-components