React Routerは、リンク先のページを表示しているときに、active
クラスをNavLinksに追加します。スタイル付きコンポーネントを使用してこのプロパティにアクセスするにはどうすればよいですか。あなたが彼らのページにいるとき、私はメニュー項目に異なるスタイルを付ける必要があります。
const LinkElem = styled(NavLink)`
font-size: 16px;
font-weight: 400;
${props => console.log(props)};
&:hover {
color: ${props => props.theme.colorOrange};
}
`;
const Menu = props => {
const { me } = props;
return (
<MenuElem>
<li>
{me ? (
<LinkElem to="/account">Account</LinkElem>
) : (
<LinkElem to="/login">Log in / sign up</LinkElem>
)}
</li>
</MenuElem>
);
};
ルーターに依存しないスタイル付きコンポーネントを構築しようとしている場合、&.active
アプローチには特に熱心ではないので、これに対処するために asNavLink
を作成しました:
npm install as-nav-link --save
与えられたコンポーネント:
const MyNavAnchor = styled(({
as: T = 'a',
active, // destructured so it is not passed to anchor in props
...props
}) => <T {...props} />)({
textDecoration: 'blink',
color: 'blue',
}, ({ active }) => (active && {
color: 'red',
}));
次のように使用できます。
import asNavLink from 'as-nav-link';
const MyNavLink = asNavLink(config)(MyNavAnchor);
そして、アクティブな小道具をスタイル付きコンポーネントに渡します。
config
はオプションであり、isActive
関数(ReactRouterのNavLinkによる)とactiveProp
文字列(コンポーネントに渡されるプロップ名)を含めることができます。
小道具classNameはNavLinkの子に追加されているため、NavLinkレベルではアクセスできません。 docs はこれについて明確ではありませんでした。したがって、props.className === 'active'を確認してスタイルを追加することはできません。
代わりに、スタイル付きコンポーネントの内部でcssを使用することもできます。
const LinkElem = styled(NavLink)`
// example style
&.active {
color: ${props => props.theme.orange }
}
`;
_react-router
_ v4以降、NavLink
とスタイル付きコンポーネントのattrs()
関数を使用して、依存関係なしにactiveClassName
のアクティブな状態をスタイル設定できます。
_export const StyledNavLink = styled(NavLink).attrs({
activeClassName,
})`
&.${activeClassName} {
background: red;
}
`;
_
関連ドキュメント:
const StyledLink = styled(NavLink)`
color: blue;
&.active {
color: red;
}
`;
スタイル付きコンポーネント:
import { NavLink } from 'react-router-dom';
export const MyNavLink = styled(NavLink)`
&.${props => props.activeClassName} {
color: red;
}
`;
使用法:
<MyNavLink to="/dashboard" activeClassName="anyClassNameWillWork">Dashboard</MyNavLink>
テスト済み:
react-router-dom 5.1.2
styled-components 5.0.1
一番簡単な決断だと思います。
const StyledLink = styled(NavLink)`
color: blue;
&.${props => props.activeClassName} {
color: red;
}
`;
styled-componentsでオブジェクト構文を使用している場合、次のソリューションを実装できます:
const activeClassName = 'nav-item-active'
export const StyledLink = styled(NavLink).attrs({
activeClassName,
})(props => ({
height: '20px',
width: '20px',
backgroundColor: 'green',
['&.' + props.activeClassName]: {
backgroundColor: 'red'
}
}))
次のStackBlitzプロジェクトでライブの例を確認できます: