Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 93abf90

Browse files
feat(NavDropdown): Support 'as' prop (#5576)
* Added 'as' as prop * Added tests to 'as' as prop * Added back NavItem * Added .nav-item class to NavDropdown * Added assert nav-item class to test * Created var for bsPrefix and removed 'as' * Updated variable name * Added comment addressing NavItem
1 parent 4fb9523 commit 93abf90

File tree

2 files changed

+43
-22
lines changed

2 files changed

+43
-22
lines changed

src/NavDropdown.tsx

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import classNames from 'classnames';
12
import React from 'react';
23
import PropTypes from 'prop-types';
34

5+
import { useBootstrapPrefix } from './ThemeProvider';
46
import Dropdown, { DropdownProps } from './Dropdown';
5-
import NavItem from './NavItem';
67
import NavLink from './NavLink';
78
import { BsPrefixRefForwardingComponent } from './helpers';
89

@@ -69,6 +70,7 @@ const NavDropdown: NavDropdown = (React.forwardRef(
6970
title,
7071
children,
7172
bsPrefix,
73+
className,
7274
rootCloseEvent,
7375
menuRole,
7476
disabled,
@@ -77,28 +79,37 @@ const NavDropdown: NavDropdown = (React.forwardRef(
7779
...props
7880
}: NavDropdownProps,
7981
ref,
80-
) => (
81-
<Dropdown ref={ref} {...props} as={NavItem}>
82-
<Dropdown.Toggle
83-
id={id}
84-
eventKey={null}
85-
active={active}
86-
disabled={disabled}
87-
childBsPrefix={bsPrefix}
88-
as={NavLink}
82+
) => {
83+
/* NavItem has no additional logic, it's purely presentational. Can set nav item class here to support "as" */
84+
const navItemPrefix = useBootstrapPrefix(undefined, 'nav-item');
85+
86+
return (
87+
<Dropdown
88+
ref={ref}
89+
{...props}
90+
className={classNames(className, navItemPrefix)}
8991
>
90-
{title}
91-
</Dropdown.Toggle>
92-
93-
<Dropdown.Menu
94-
role={menuRole}
95-
renderOnMount={renderMenuOnMount}
96-
rootCloseEvent={rootCloseEvent}
97-
>
98-
{children}
99-
</Dropdown.Menu>
100-
</Dropdown>
101-
),
92+
<Dropdown.Toggle
93+
id={id}
94+
eventKey={null}
95+
active={active}
96+
disabled={disabled}
97+
childBsPrefix={bsPrefix}
98+
as={NavLink}
99+
>
100+
{title}
101+
</Dropdown.Toggle>
102+
103+
<Dropdown.Menu
104+
role={menuRole}
105+
renderOnMount={renderMenuOnMount}
106+
rootCloseEvent={rootCloseEvent}
107+
>
108+
{children}
109+
</Dropdown.Menu>
110+
</Dropdown>
111+
);
112+
},
102113
) as unknown) as NavDropdown;
103114

104115
NavDropdown.displayName = 'NavDropdown';

test/NavDropdownSpec.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,14 @@ describe('<NavDropdown>', () => {
5959

6060
wrapper.assertSingle('a#test-id');
6161
});
62+
63+
it('should support as as prop', () => {
64+
const wrapper = mount(
65+
<NavDropdown as="li" id="test-id" title="title">
66+
<DropdownItem eventKey="1">Item 1</DropdownItem>
67+
</NavDropdown>,
68+
);
69+
70+
wrapper.assertSingle('li.nav-item');
71+
});
6272
});

0 commit comments

Comments
 (0)