NavLink returns 对所有链接都有效,SO 中似乎没有解决方案
NavLink returns active to all links and no solution in SO seems to work
似乎 none 其他地方提供的解决方案有效,所以我决定问问。无论我做什么,无论是否处于活动状态,我都无法让 NavLinks 以不同的方式呈现。我直接从 react-router-dom 的文档中关于 NavLinks 的部分获取了三元运算符,我会尝试创建一个函数来避免将所有这些代码写三次,但在此之前我想至少要有正确的渲染工作。
(附带问题:如果我从 return 语句中删除 Router 标签,为什么它会中断?它们在那里是因为,在我需要不同样式的 NavLinks 之前,我使用的是常规路由,但是如果我把它们拿出来,它就会中断并显示一条关于 useHref 的消息,类似的东西)
这是我的 return 声明及其下方的样式组件:
return (
<>
<GlobalStyles />
<Router>
<Header />
<Wrapper>
<NavBar>
<NavLink
to="/search"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Search song
</NavLink>
<NavLink
to="/weekly-thread"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Weekly thread
</NavLink>
<NavLink
to="/game"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Game
</NavLink>
</NavBar>
</Wrapper>
</Router>
</>
);
};
const Wrapper = styled.div`
width: 100vw;
height: 100vh;
position: absolute;
z-index: -1;
`;
const NavBar = styled.div`
display: flex;
padding: 20px 20px;
position: relative;
gap: 20px;
font-size: 18px;
a {
text-decoration: none;
}
.nav-link {
color: blue;
&:inactive {
color: black;
}
}
`;
编辑:越来越奇怪了。在甚至简单地粘贴下面答案中的代码但没有得到任何结果之后,我试图弄乱活动 NavLink 的字体大小。令我惊讶的是,现在发生了一些变化,但是以完全奇怪的方式,因为它使第一个元素保持原样,而第二个和第三个元素仅在字体大小方面发生了变化,但没有其他变化。当我单击其他 NavLink 时,URL 发生变化,但它们保持不变:第一个为原始大小,另外两个已更改。
第二次编辑:尝试进一步调试,我对我的一个 NavLinks 做了这个,结果很奇怪:
<NavLink to="/search" exact className={(isActive) => {
console.log(isActive);
isActive === false ? console.log(isActive) : console.log("foo");
}}>Search song</NavLink>
现在,第一个 console.log return 是 isActive 的实际值,但第二个和第三个 console.log 总是 return,“foo”,即三元运算符中的第二个值,即使我将“isActive === false”更改为“isActive === true”,也应该交换它们。我不知道这里发生了什么。
路由器
您可能想阅读文档。
primary components 页面解释了您需要路由器的原因。
它为其他组件提供信息; IE当前路线是什么。
导航链接
NavLink 应该能够根据路由器是否与 NavLink
[=20= 的 to
属性相匹配,自行设置 active
class ]
查看此 CodePen 示例。
请注意,您仍然需要为应用的 class 提供 CSS。如果您使用 bootstrap 或 material-ui 之类的框架;默认情况下,他们通常会有 .active
css 样式。
CSS
css 规则可能不正确,&:inactive
处似乎有一个冒号,应该是 .inactive
class:
.nav-link {
color: blue;
&.inactive {
color: black;
}
}
在 console.logs 之后,到处都是,有件事引起了我的注意:isActive 作为一个对象出现在控制台上。这就是为什么我总是得到相同的结果。
当我将三元运算符的条件更改为 isActive.isActive ?
时,我开始获得预期的结果。
您应该能够从 NavLink 中删除您的 class姓名 属性。
删除:
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
这是不必要的,因为 React-Router 已经将 .active class 添加到活动的 link,所以你在做什么属性 无疑是在制造怪事。
您可以随意设置 a.active 的样式。
似乎 none 其他地方提供的解决方案有效,所以我决定问问。无论我做什么,无论是否处于活动状态,我都无法让 NavLinks 以不同的方式呈现。我直接从 react-router-dom 的文档中关于 NavLinks 的部分获取了三元运算符,我会尝试创建一个函数来避免将所有这些代码写三次,但在此之前我想至少要有正确的渲染工作。
(附带问题:如果我从 return 语句中删除 Router 标签,为什么它会中断?它们在那里是因为,在我需要不同样式的 NavLinks 之前,我使用的是常规路由,但是如果我把它们拿出来,它就会中断并显示一条关于 useHref 的消息,类似的东西)
这是我的 return 声明及其下方的样式组件:
return (
<>
<GlobalStyles />
<Router>
<Header />
<Wrapper>
<NavBar>
<NavLink
to="/search"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Search song
</NavLink>
<NavLink
to="/weekly-thread"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Weekly thread
</NavLink>
<NavLink
to="/game"
exact
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
Game
</NavLink>
</NavBar>
</Wrapper>
</Router>
</>
);
};
const Wrapper = styled.div`
width: 100vw;
height: 100vh;
position: absolute;
z-index: -1;
`;
const NavBar = styled.div`
display: flex;
padding: 20px 20px;
position: relative;
gap: 20px;
font-size: 18px;
a {
text-decoration: none;
}
.nav-link {
color: blue;
&:inactive {
color: black;
}
}
`;
编辑:越来越奇怪了。在甚至简单地粘贴下面答案中的代码但没有得到任何结果之后,我试图弄乱活动 NavLink 的字体大小。令我惊讶的是,现在发生了一些变化,但是以完全奇怪的方式,因为它使第一个元素保持原样,而第二个和第三个元素仅在字体大小方面发生了变化,但没有其他变化。当我单击其他 NavLink 时,URL 发生变化,但它们保持不变:第一个为原始大小,另外两个已更改。
第二次编辑:尝试进一步调试,我对我的一个 NavLinks 做了这个,结果很奇怪:
<NavLink to="/search" exact className={(isActive) => {
console.log(isActive);
isActive === false ? console.log(isActive) : console.log("foo");
}}>Search song</NavLink>
现在,第一个 console.log return 是 isActive 的实际值,但第二个和第三个 console.log 总是 return,“foo”,即三元运算符中的第二个值,即使我将“isActive === false”更改为“isActive === true”,也应该交换它们。我不知道这里发生了什么。
路由器
您可能想阅读文档。
primary components 页面解释了您需要路由器的原因。
它为其他组件提供信息; IE当前路线是什么。
导航链接
NavLink 应该能够根据路由器是否与 NavLink
[=20= 的 to
属性相匹配,自行设置 active
class ]
查看此 CodePen 示例。
请注意,您仍然需要为应用的 class 提供 CSS。如果您使用 bootstrap 或 material-ui 之类的框架;默认情况下,他们通常会有 .active
css 样式。
CSS
css 规则可能不正确,&:inactive
处似乎有一个冒号,应该是 .inactive
class:
.nav-link {
color: blue;
&.inactive {
color: black;
}
}
在 console.logs 之后,到处都是,有件事引起了我的注意:isActive 作为一个对象出现在控制台上。这就是为什么我总是得到相同的结果。
当我将三元运算符的条件更改为 isActive.isActive ?
时,我开始获得预期的结果。
您应该能够从 NavLink 中删除您的 class姓名 属性。
删除:
className={(isActive) =>
"nav-link" + (!isActive ? " inactive" : "")
}>
这是不必要的,因为 React-Router 已经将 .active class 添加到活动的 link,所以你在做什么属性 无疑是在制造怪事。
您可以随意设置 a.active 的样式。