ããã¯äžè¬çãªäœ¿çšäŸã§ã¯ãªããããåªå 床ã¯äœããªããŸãã ããããããã§ã話ãåããæ¹åãè©Šã¿ãããšãã§ããŸãã
Menu
Menu.SubMenu
Menu.MenuItem
ã instance.onKeyDown
äŸåããããŒããŒãæäœçšã«ã©ããããããšã¯ã§ããŸããhttps://github.com/ant-design/ant-design/issues / 4849Table.Column
ã Table
å Žåãæ§æãšããŠchildren[n].props
èªã¿åãããåäŸã®ææè
ã®å°éå
·ãèªã¿åãããšãã§ããªããªããŸãhttps://github.com/ant-design/ant-design/issues / 4029 https://github.com/ant-design/ant-design/issues/4324Collpase.Panel
ã Collapse
ã¯ãã¿ã€ãã«ãšããŠchildren[n].header
ãèªã¿åããŸããTabs.TabPane
ã Tabs
ã¯ã children[n].tab
ãèªã¿åã£ãŠTabBarãçæããŸãã https://github.com/ant-design/ant-design/issues/5165Select.Option
ã Select
ã¯ããªãã·ã§ã³ã®key
å°éå
·ã«äŸåããŸããDescriptions.Item
https://github.com/ant-design/ant-design/issues/27411äžéšã®ã³ã³ããŒãã³ãã¯APIã®äžéšãšããŠkey
ã䜿çšããŠããããããã¹ãŠã®APIã®ååãå€æŽãããŸã§ãããä¿®æ£ããããšã¯ã§ããŸããã äŸãã°
key => id
expandedKeys => expandedIds
selectedKeys => selectedIds
....
ããã¯é倧ãªå€æŽã«ãªããŸããããã®ãããªantd-codemodã«ãã£ãŠè§£æ±ºã§ããŸãã
ããã§ããããã䟡å€ããããšæããŸããïŒ
ããã¯è¯ãèãã§ã¯ãªããšæããŸãã
codemodãœãªã¥ãŒã·ã§ã³ã®ãã¡ã³ã§ã¯ãããŸããã
ç§ã®èŠè§£ã§ãããæ²ããããšã«ãã»ãšãã©ã®äººã«ãšã£ãŠãããã¯æè¿ããããããåçºçã§ãããšç§ã¯ä¿¡ããŠããŸãã
ã³ã³ããŒãã³ããã«ã¹ã¿ã ã³ã³ããŒãã³ãã«åã蟌ãããšã¯ãReactã®äžè¬çãªæ¹æ³ã§ãã
ãããä¿®æ£ããŠãééããªãant-designã®æ¡çšãæ¥éã«å¢å ããã®ãèŠãŠãã ããã
Ant Designã¯æ¬åœã«é åçã§ãreact-bootstrapãé¢ããããªãæåã®ã©ã€ãã©ãªã§ãã
@MacKentoch
äžéšã®ã³ã³ããŒãã³ãã¯APIã®äžéšãšããŠããŒã䜿çšããããããã¹ãŠã®APIã®ååãå€æŽãããŸã§ãããä¿®æ£ããããšã¯ã§ããŸããã
@ afc163ãããã®APIã®ååãå€æŽã§ããªãå Žåããã®åé¡ã解決ã§ããŸããã ãã ããåé¿çãæäŸã§ããŸããhttps ïŒ
ãããããã¥ã¡ã³ãã«è¿œå ããå¿ èŠããããšæããŸããïŒ
@benjycuiããããŸããã
ãšã«ãããçµå±ãããã¯ããŠããŸããã
ãæéãå²ããŠããã ãããããšãããããŸãã
@benjycuiç§ã¯ããªããææ¡ããåé¿çã調æ»ããŠããŸããããããã¯é©åãªè§£æ±ºçã§ã¯ãªããšæããŸãã éåžžãã³ã³ããŒãã³ããã©ãããããšãã¯ãå
éšç¶æ
ãå¿
èŠã§ãã ææ¡ããããœãªã¥ãŒã·ã§ã³ã§ã¯ãããã¯äžå¯èœã§ãã
ãŸããããã¯å°ãªããã¬åé¡ã ãšæããŸãã å
±éã®ã³ã³ããŒãã³ããåé¢ã§ããªããšããããšã¯ãã¢ããªã±ãŒã·ã§ã³å
ã§åãã³ãŒããäœåºŠãç¹°ãè¿ãããšãæå³ããŸãã ã¢ããªã±ãŒã·ã§ã³ã倧ããå Žåã¯ãantdããŸã£ããæ¡çšããªãããšãæ€èšããŸãã ããã建èšçãªæ¹è©å®¶ãšèããŠãã ããã
ãç²ãæ§ã§ããïŒ
ããã¯å°ããªåé¡ã§ã¯ãªããAnt Designã©ã€ãã©ãªã䜿ãå§ãããšãã¯äºæããŠããªãã£ãããšã§ãããšèšãããšã«åæããŸãããã«ã¹ã¿ã ã³ã³ããŒãã³ãã®ã°ãããã©ã¯ãã£ã¹ã¯ãReactãããžã§ã¯ãå šäœã§äœ¿çšãããŠããŸãã å人çã«ã¯ãAnt Designã倧奜ãã§ãããäžéšã®äººã«ãšã£ãŠã¯ãããã¯å€§ããªåé¡ã«ãªãå¯èœæ§ããããŸãã ä»åŸã®AntDesignv3ã§ãããæ¹åãããã®ãæ¬åœã«æ¥œãã¿ã«ããŠããŸãã
v3ã§ããã«å¯Ÿãã解決çãèŠã€ããŠãã ããã
ãã®ããã±ãŒãžããªãªãŒã¹ãããåŸã«è§£æ±ºã§ããŸãïŒå€åïŒã
ã¡ãã¥ãŒã䜿çšããŠããã²ãŒã·ã§ã³ããŒãäœæããã¡ãã¥ãŒã«React Router <Link />
ã¿ã°ã<Icon />
ãã¹ãããããšãããšããã®è©Šã¿ã«ééããŸããïŒãããééã£ãŠããå Žåã¯ç³ãèš³ãããŸããïŒã
ãã奜ãŸãã解決çã¯ãããŸããïŒ
ç§èŠã§ããããã®ã¹ã¬ããã¯å
¬åŒããã¥ã¡ã³ãã«å«ãŸããŠããå¿
èŠããããŸããããã¯ããã®åé¡ãå€ãã®ãŠãŒã¶ãŒã«ãšã£ãŠå€§ããªåé¡ã«ãªãå¯èœæ§ãããããã§ãã
ããã¥ã¡ã³ãã«ã¯ãç¶æ
ãäžèŠãªå Žåã®ä»£æ¿æ段ãšããŠhttps://github.com/react-component/collapse/issues/73#issuecomment-323626120ãèšèŒããå¿
èŠããããŸãã
ããã¥ã¡ã³ãã§ããã«ã€ããŠèšåããŠããã ããã°å¹žãã§ãã ç§ã¯ãã®ãããªããšãããããšããŠããŠãããŸããããªãã®ã§ããªãã®æéãç¡é§ã«ããŸããã
<Collapse>
<MyCollapseItem />
<MyCollapseItem2 />
</Collapse>
MyCollapseItem
ãšMyCollapseItem2
ãCollapse.Panel
ã¬ã³ããªã³ã°ããå Žæã
ãŸããreact16ã§ã¬ã³ããªã³ã°ããã³ã³ããŒãã³ãã®é åãè¿ãããšãã§ããããã«ãªã£ãã®ã§ããããå®è¡ã§ãããšç¹ã«åœ¹ç«ã¡ãŸãã ããã§ãªããã°ãéè€ã³ãŒããé²ãããšã¯å°é£ã§ãã
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
ããã¯å®éã«ç§ãã¡ã«ãšã£ãŠå€§ããªåé¡ã§ãã èããããåé¿çããªããããååã®å€æŽã解é€ããå€æŽã«æ祚ããŸãã
ããã§ãåãã§ã- Tabs.TabPane
ãšMenu.MenuItem
ã§ãã
åºæ¬çã«æ®ãã®å°éå
·ãæž¡ãããšãã§ããåé¿çãèŠã€ããŸãã
React.Children.map(children, (child, index) => { ... })
䜿çšããå Žåãå°ãªããšãç§ã«ãšã£ãŠã¯åé¿çã¯æ©èœããŸããã çµå±ãkeyããããã£ã¯mykey/.0
ãããªå€ãååŸããŸãããããã¯ç§ãäœæ¥ã§ãããã®ã§ã¯ãããŸããã ãŸããããããã£ã®ååã®å€æŽã«ãæ祚ããŸãã
ãã®åé¡ã¯å®éã«ç§ãantdããé ããããããããŸãã...ãŸãã¯å°ãªããšããããã®ã³ã³ããŒãã³ãã®ä»£æ¿åãèŠã€ããåå ã«ãªããŸãã åå©çšå¯èœãªã³ã³ããŒãã³ããäœæããèœåãå®éã«å¶éãããŸãã
Menu.Item @yunshuipiaoå ã§ReactRouterãå©çšããããšããŠãã人ã®ããã«ãïŒ6576ã§ç§ã®ããã«åããæåãããœãªã¥ãŒã·ã§ã³ããããŸãã
ãã1ã€ã®å°ããªåé¡ïŒMenu.Itemãã©ãããããšãå°ãªããšãåçŽã¢ãŒãã§ã¯ãåã¢ã€ãã ã®1ã€ãéžæããããšãã«ããµãã¡ãã¥ãŒãéžæãããç¶æ ã§è¡šç€ºãããªããªããŸãã é¢é£ããè¡ïŒ
https://github.com/react-component/menu/blob/018d6f84d622ee140d9695ba57e7a773cf368efa/src/util.js#L40
https://github.com/react-component/menu/blob/018d6f84d622ee140d9695ba57e7a773cf368efa/src/SubMenu.jsx#L314
ã«ã¹ã¿ã ã³ã³ããŒãã³ãã§Collapseãæ©èœãããããšããŠãã人ã®ããã«ãããææžåãããšæããŸãïŒ @jfreixaãè¿°ã¹ãã®ãšåæ§ã«ãã«ã¹ã¿ã ã³ã³ããŒãã³ãã«äžãããããã¹ãŠã®å°éå ·ãããã«ã«æž¡ãã ãã§ãã
<Collapse>
<Custom/>
<Custom/>
</Collapse>
Custom.render() {
return (
<Panel {...this.props}>
<div>My custom stuff here</div>
</Panel>
)
}
@ncknunaãšåãåé¡ã
Menu.Itemã¯ãã©ããããããšãã«éžæãããŸããã åé¿çã¯ãããŸããïŒ
@Nomeyhoé¢é£ããã¡ãœãããã³ããŒããŠè²Œãä»ããå
ã®ãã§ãã¯ãã³ã¡ã³ãã¢ãŠãããŠãã©ãããŒã§ã¯ã©ã¹ãclassName
ãšããŠæž¡ãããšã«ããã ant-menu-submenu-selected
ã¯ã©ã¹ãè¿œå ãããã©ããã決å®ããããžãã¯ãåæ§ç¯ããããšã«ãªããŸããã
function loopMenuItemRecusively (children: Array<any>, keys: Array<string>, ret: { find: boolean }) {
if (!children || ret.find) {
return
}
React.Children.forEach(children, (c: any) => {
if (ret.find) {
return
}
if (c) {
const construt = c.type
// Original check that caused problems. I'm not concerned about omitting it
// because I don't plan on putting a bunch of weird, large stuff in my menus...
// if (!construt || !(construt.isSubMenu || construt.isMenuItem || construt.isMenuItemGroup)) {
// return;
// }
if (keys.indexOf(c.key) !== -1) {
ret.find = true
} else if (c.props && c.props.children) {
loopMenuItemRecusively(c.props.children, keys, ret)
}
}
})
}
function isChildrenSelected (children: Array<any>, selectedKeys: Array<string>) {
const ret = { find: false }
loopMenuItemRecusively(children, selectedKeys, ret)
return ret.find
}
// Omitting other custom code below...
export const SubMenu = ({ children, className, selectedKeys, title, ...rest }: any) => {
const isSelected = isChildrenSelected(children, selectedKeys)
className = [
className,
isSelected ? 'ant-menu-submenu-selected' : ''
].filter(className => classname).join(' ')
return (
<SubMenu title={title} className={className} selectedKeys={selectedKeys} {...rest}>
{children}
</SubMenu>
)
}
ããã«å¯Ÿããä¿®æ£ã¯ãããŸããïŒ
@ChuckJonasã«åæã
ãã®åé¡ã¯å®éã«ç§ãantdããé ããããããããŸãã...ãŸãã¯å°ãªããšããããã®ã³ã³ããŒãã³ãã®ä»£æ¿åãèŠã€ããåå ã«ãªããŸãã åå©çšå¯èœãªã³ã³ããŒãã³ããäœæããèœåãå®éã«å¶éãããŸãã
次ã®ãããªMenuSubMenuãšMenu.itemsã䜿çšããå¿
èŠããããŸãã
ã©ãããŠïŒ ä»ã®ããŒãžã§ãCustomSubMenuãèŠçŽ ã䜿çšã§ãããã...ããã¯ãåå©çšå¯èœãªãã³ã³ããŒãã³ãã®éèŠãªéšåã§ãã
_MainFile.js_
Import CustomSubMenu from './OtherFile.js';
<Menu>
<CustomSubMenu />
<CustomSubMenu2 />
<CustomSubMenu3 />
</Menu>
ããã³OtherFile.jsã¯æ¬¡ã®ããã«ãªããŸãã
render(){
return(
<SubMenu>
<SubMenu.item />
<SubMenu.item2 />
etc...etc...
</SubMenu>
);
}
ãµãã¡ãã¥ãŒã®äžæçãªåé¿çïŒç°¡åã«ããããã«ç·šéïŒïŒ
const SubMenuArray = ({ ...props }) =>
[1, 2].map(i => (
<Menu.SubMenu {...props} eventKey={`item_${i}`} subMenuKey={`${i}-menu-`} />
));
é åãæ±ãå ŽåïŒ
eventKey
ãšsubMenuKey
è¿œå ããŸãããããã¯äžæã§ããå¿
èŠããããŸãããè¯ãã¢ãããŒãã¯ãããã次ã®ãšããã§ãã
const SubMenuWrapper = ({ children, ...props }) =>
React.Children.map(children, (child, i) =>
React.cloneElement(child, {
...props,
eventKey: `item_${i}`,
subMenuKey: `${i}-menu-`
})
);
䜿çšæ³ïŒ
<Menu>
<SubMenuWrapper>
<CustomSubMenu title={"one"}/>
<CustomSubMenu title={"two"}/>
</SubMenuWrapper>
</Menu>
ç¹°ãè¿ãã«ãªããŸãããé åã§ã€ã³ããã¯ã¹ã䜿çšããããªãå Žåããããããæ¬çªç°å¢ã§ã¯äœ¿çšããªãã§ãã ããããã ããã¢ã€ãã¢ã¯ç¢ºãã§ãã
ããŒã®äŸåé¢ä¿ãåãé€ãæ¹æ³ããããšæããŸãã ã¡ãã¥ãŒãäŸã«ãšããšã itemKey
å°éå
·ãå°å
¥ããŠcontext
ã䜿çšããŠã¡ãã¥ãŒãå®è£
ã§ããŸãã äºææ§ãç¶æããããã«ãã¡ãã¥ãŒã¯åŒãç¶ãåããã©ããŒã¹ãã key
ããå Žåã¯itemKey
ã«å€æŽããŸãã åæã«ã selectedKeys
ãªã©ã®å°éå
·ã®ã»ãã³ãã£ã¯ã¹ãç¶æããããšãã§ããŸãã
@yesmeckæ£çŽãªãšãããç§ã¯ant design
ã䜿çšããŠããªãã®ã§ããã°ããæéãããããŸãïŒãã ããä»é±äžã«éèŠãªã¢ããªã±ãŒã·ã§ã³ã«äœ¿çšããäºå®ã§ãïŒã
ç§ãç解ããŠããéããåé¿çãšããŠæ°ããcontext API
åå¿ããããšã§å©çãåŸãããšãã§ããŸããïŒ
ããã¯çŽ æŽããããã¥ãŒã¹ã§ã
ã¯ããåé¡ã解決ããã«ã¯ã cloneElement
ã§ã¯ãªãcontext
ã«ããå¿
èŠããããŸãã
解決çã¯ããReact.Children.forEachããšãReact.cloneElementãã䜿çšããŠå°éå ·ãæž¡ããããæ°ããå°éå ·ãèšå®ãããããªãããšã ãšæããŸããããšãã°ãã«ã¹ã¿ã ã®é¢æ°ã䜿çšããŸãã
<Select>
{({ onSelect }) => (
<div>
<Option onClick={onSelect} key="0">option1</Option>
<Option onClick={onSelect} key="1">option2</Option>
</div>
)
</Select>
antd select sourceãããReact.Children.forEachãããReact.cloneElementãã§ã¯ãªããé¢æ°ã®åã®å°éå ·ã䜿çšããŸã
ãããã°ããã質åã§ãããªããã¿ãŸããããç§ã¯ãŸã ReactãšAntDesignã«ããªãæ
£ããŠããŸããã
ããã¯ãreact-reduxã«æ¥ç¶ãããSPAå
ã§Antãã¶ã€ã³ã¡ãã¥ãŒãå®éã«äœ¿çšã§ããªãããšãæå³ããŸããïŒ
ãããããªããAnt Designã§æ¯èŒçè€éãªSPAãã©ã®ããã«æžãããšãã§ããŸããïŒ åé¿çã¯ãããŸããïŒ
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
ãã®åé¡ã«é¢ããæŽæ°ã¯ãããŸããïŒ ã¡ãã¥ãŒé ç®ãHOCã§ããããªåäœãããŠããŸãã
ããã«ã¡ã¯ ïŒ ããã§ãåãã§ããããã®çš®ã®ã³ã³ããŒãã³ããã«ã¹ã¿ãã€ãºã§ããããšã«æ¬åœã«èå³ããããŸãã
å®éã«ã«ã¹ã¿ã Select.Option
åé¡ããããŸã
ãã®ã¹ã¬ããã§ææ¡ãããåé¿çã¯ç§ããããæ©èœãããã®ã«åœ¹ç«ã¡ãŸããã§ãããç§ã¯ç©ºã®ãªãã·ã§ã³ã§åäœããéžæãæã£ãŠããŸã...
import React from 'react';
import PropTypes from 'prop-types';
import { Select } from 'antd';
const { Option } = Select;
const PictureOption = ({ label, value, pictureId, ...props }) => (
<Option label={label} value={value} className="select-item" {...props}>
<div className="select-item__thumbnail">
<img src={pictureId} alt="item-img" />
</div>
<div className="select-item__name">{label}</div>
</Option>
);
PictureOption.propTypes = {
label: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
pictureId: PropTypes.string.isRequired,
};
export default PictureOption;
CASLã䜿çšããŠããŠãŒã¶ãŒã®èš±å¯ã«åºã¥ããŠUIèŠçŽ ãã¬ã³ããªã³ã°ãå§ããŸããã ãã ããå°éå ·ãåèŠçŽ ã«æ£ããäŒæãããªãããã«isRootMenué¢æ°ã®åŒã³åºãã倱æããããããµãã¡ãã¥ãŒãã¬ã³ããªã³ã°ãããªããšããåé¡ãçºçããŸããã
åé¿çãšããŠããµãã¡ãã¥ãŒãå®æ°ãšããŠå®çŸ©ãããæäœæ¥ã§ãå°éå
·ã«æž¡ããŸããã
ãã
renderïŒïŒ{
// ### Administration Menu ###
const AdminMenu = ({ ...props }) => {
return (
<Can I="access" on="admin-content">
<Menu.Divider {...props} />
<Menu.SubMenu
{...props}
title={
// FIXME: Icon is not rendered... :-/
<span>
<Icon type="tools" />
<span>Administration</span>
</span>
}
// title={<span>Administration</span>}
key="admin">
<Menu.Item key="users" tabIndex={0}>
<Icon type="android" />
<span>User Administration</span>
</Menu.Item>
<Menu.Item key="permissions" tabIndex={0}>
<Icon type="lock" />
<span>Permissions</span>
</Menu.Item>
</Menu.SubMenu>
</Can>
);
};
return (
<Layout id="menu-component-layout">
<Layout.Sider width="300px" collapsible="false" trigger={null}>
<Menu theme="dark" mode="inline" defaultSelectedKeys={['user']} defaultOpenKeys={['user', 'config', 'admin']}>
<AdminMenu />
</Menu>
</Layout.Sider>
<Layout.Content id="menu-component-content">
<h3>Page containing a side menu</h3>
</Layout.Content>
</Layout>
);
}
ãã
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ããŸã䟿å©ã§ã¯ãããŸããããä»ã®ãšããã¯æ©èœããŸãã ãã ããã¢ã€ã³ã³ãå«ããµãã¡ãã¥ãŒã®ã¿ã€ãã«ãæ£ããã¬ã³ããªã³ã°ãããªããšããåé¡ããŸã ãããŸãã ã¢ã€ã³ã³ããããŸããã
誰ãããããä¿®æ£ããæ¹æ³ãç¥ã£ãŠããŸããïŒ
ããã§ã·ã§ãŒã±ãŒã¹ãäœæããŸããïŒ https ïŒ
GitHubant-designUIã©ã€ãã©ãªã䜿çšããmeteor / reactç°å¢ã§ã®CASLèªèšŒã©ã€ãã©ãªã®äœ¿çšæ³ã®ã·ã§ãŒã±ãŒã¹-gibelium / meteor-react-antd-casl
@gibeliumã¢ã€ã³ã³ã®ã¬ã³ããªã³ã°ã¯ãå®éã«ã¯ç¬èªã®åé¡ã«å€ãããšæããŸãã ãªããžããªã®ã¯ããŒã³ãäœæããã¢ã€ã³ã³ããŽãŒã¹ããã¿ã³ã«çœ®ââãæããŠã¿ãŸããããã¿ã³ã®ã¢ãŠãã©ã€ã³ã衚瀺ãããŠããŸãããã¢ã€ã³ã³ããã¿ã³å /ãã¿ã³äžã«è¡šç€ºãããŸãã...
@gotjoshuaããªãã¯ãã®å°çšã®åé¡ãäœæããŸããïŒ
ããã©ã«ãã®å±éã¡ãã¥ãŒé
ç®ã®èšå®ãæ©èœããŸããã ç§ã®åé¿çã®å®è£
ã¯ãMenuã®defaultOpenKeys
ããããã£ãç¡èŠããŸãã
ããã解決ããæ¹æ³ã¯ãããŸããïŒ
ãã®åé¡ã¯å®éã«ããã¥ã¡ã³ãã§èšåãããŠããã¯ãã§ãããã®ã©ã€ãã©ãªãç§ã«ã¯äœ¿çšã§ããªãããšãç解ããããã ãã«ããã®ãã°ã調æ»ããããã«äžžäžæ¥ç¡é§ã«ãªããŸããã ä»ã®éçºè
ãã¢ã³ããã¿ãŒã³ã䜿çšããŠReactããŒãäžç¶ããŠããããšãç解ããã®ã«ããã»ã©å€ãã®æéãç¡é§ã«ããå¿
èŠããªãããã«ãèŠåãåºããŠãã ãããã³ãã¥ããã£ã§å©çšã§ããéåžžã«å€ãã®HOCããã³ã¬ãŒã¿ã«å¯ŸããŠéåžžã«è匱ã§ãã
ããã¯æ¬åœã«æ®å¿µã§ãã 次ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ä¿®æ£ããŠããã ããã°å¹žãã§ãã
ãã®åé¡ã«é¢ããæŽæ°ã¯ãããŸããïŒ ã»ããã¡ãã¥ãŒdefaultOpenKeysãæ©èœããªã
å®å šã«é«éã§åªå 床ãé«ããšèŠãªãããã¹ããã®ã ð¥
ç§ã«ã¯ïŒããããïŒå®è£
ã§ããªãåæ§ã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
reduxã¹ãã¢ã®ããŒã¿ã«åºã¥ãããªãã·ã§ã³ã§Select
ãã¬ã³ããªã³ã°ããreduxé£çµæåãäœæããããšæããŸãã åãã³ãŒããã©ãã«ã§ããã³ããŒã¢ã³ãããŒã¹ããããããªãã®ã§ããã®ã¿ã€ãã®ã³ã³ããŒãã³ããForm.getFieldDecorator
å
ã§äœ¿çšãããã®ã§ããã connect
HOCã䜿çšããŠãããããå®è¡ã§ããŸãããããã
ç·šéïŒç§ã¯èªåã®ãŠãŒã¹ã±ãŒã¹ã®è§£æ±ºçãèŠã€ããŸããã 次ã®ãããªforwardRef
ãªãã·ã§ã³ã䜿çšããŠãäžèšã®ãããªã³ã³ããŒãã³ããäœæã§ããŸããã
connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true })(Component);
ãã®ãœãªã¥ãŒã·ã§ã³ã¯connect
HOCã«åºæã§ããã ã§ãã
以åã®ã³ã¡ã³ãã«å ããŠ-ã¯ãããããåªå
床ãé«ããšèŠãªãããšãã§ãããšæããŸãã åé¡ã®1ã€ãæ£åžžã«è§£æ±ºããåŸïŒäžèšã§èª¬æããããã«ïŒãã«ã¹ã¿ã ã³ã³ããŒãã³ãã§ã©ãããããTabs.TabPane
ã³ã³ããŒãã³ããäœæããå¿
èŠããããŸãã ç§ã«ã¯éåžžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ããããŸã->ããŒããã·ã§ã³ããã§ãã¯ããããã«ã©ããã³ã°ã³ã³ããŒãã³ãã䜿çšããããããæ¡ä»¶ãæºããããŠããå Žåã¯åã³ã³ããŒãã³ããã¬ã³ããªã³ã°ãããããã§ãªãå Žåã¯ã¬ã³ããªã³ã°ãããŸããã
ããã«å¯Ÿããç°¡åã§å®çšçãªåé¿çã¯ãããŸããïŒ
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
åºæ¬çã«æ®ãã®å°éå ·ãæž¡ãããšãã§ããåé¿çãèŠã€ããŸãã
ã©ãããããã³ã³ããŒãã³ãããã
ããã¯ã³ã³ãœãŒã«ã®èŠåã瀺ããŠããŸãããã解決ããæ¹æ³ã¯ãããŸããïŒ
代ããã«index.js:1437 Warning: React does not recognize the
staticContext prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase
staticcontext`ã 誀ã£ãŠèŠªã³ã³ããŒãã³ãããæž¡ããå Žåã¯ãDOMèŠçŽ ããåé€ããŠãã ããã
index.jsïŒ1437èŠåïŒprop dispatch
å€ãç¡å¹ã§ã
åãåé¡... Menu.Itemãã©ããããHOCãšããŠã¢ã¯ã»ã¹èš±å¯ã³ã³ããŒãã³ããäœæãããã®ã§ãããantdã§ã¯ãããèš±å¯ãããŠããŸãã...æ²ãã
ç§ã¯ãã®åé¡ã«ãã°ããæéãè²»ãããŸãã...
ãããŠããã¯å®è¡å¯èœã§ãðãããªãã¯ãã æ®ãã®å°éå ·ãieã«æž¡ãå¿ èŠããããŸãã Collapse.PanelïŒrc-panelã®ãœãŒã¹ã³ãŒãã確èªããŠç解ããŠãã ããïŒ
export const CustomPanel: React.FC = ({ header, children, ...props }) => {
// do whatever you like
return <Collapse.Panel header={header} {...props}>
{children}
</Collapse.Panel>
};
ãããŠããããã®ããã«äœ¿çšããŸãïŒ
<Collapse>
<CustomPanel key="first" header="Header 1">Body</CustomPanel>
<CustomPanel key="second" header="Header 2">Body</CustomPanel>
</Collapse>
4.0ãªãªãŒã¹ã§ãã®ãœãªã¥ãŒã·ã§ã³ãèŠãã®ã¯çŽ æŽãããããšã§ãïŒ
ããã¯çµ¶å¯Ÿã«åªå
床ãé«ãã§ãã
æåéããç¹å¥ãªåäœãå¿
èŠãªå ŽåïŒæ¿èªãªã©ã®åçŽãªåäœã§ããïŒããããã®ã³ã³ããŒãã³ãã䜿çšã§ããªããªããŸãã
ããšãã°ãåçã«èªã¿èŸŒãŸããã¡ãã¥ãŒãäœæããããšããŠããã®ã§ãããŒã¿ãå°çãããŸã§ãååãšããŠã¹ãããŒã䜿çšããŠãç¡å¹ã«ãªã£ãŠããMenu.Item
ãæåéã衚瀺ããŸãã
ããã¯æé©ãšã¯ã»ã©é ãã§ãã
ç§ã¯ãã®åé¡ã«ãã°ããæéãè²»ãããŸãã...
ãããŠããã¯å®è¡å¯èœã§ãðãããªãã¯ãã æ®ãã®å°éå ·ãieã«æž¡ãå¿ èŠããããŸãã Collapse.PanelïŒrc-panelã®ãœãŒã¹ã³ãŒãã確èªããŠç解ããŠãã ããïŒ
ããã¯çŽ æŽããã解決çã§ããïŒæ¬åœã«ïŒç§ã®ãããžã§ã¯ãã§äœ¿çšããŠããŸãïŒãããã€ãã®æ©èœã倱ãããŸãã
ã€ãŸãã <SubMenu>
ã<Menu>
çŽæ¥ã®åã§ãªãå Žåã defaultOpenKeys
ã¯æ©èœããŸããã ð
ãã®åé¡ãçºçããã°ããã§ãã
ééããªãããã¥ã¡ã³ãã§ã®æ¿èªãå¿ èŠã§ãã ç§ã®ãããžã§ã¯ãã§AntDesignã䜿çšããããšãçå£ã«åèãããŠãããã®åé¡ïŒä»ã®ããªãã®æ°ã®ãã€ããŒãªåé¡ã®äžã§ïŒã«ééããããšã¯éåžžã«ã€ã©ã€ã©ããŸãã
ããã«å¯Ÿããä¿®æ£ããŸã ãªããªããŠä¿¡ããããŸããã
ããã¯æ¬åœã«ä¿®æ£ããå¿ èŠããããŸãã ã»ãšãã©ã®éçºè ã¯ãç®±ããåºããŠããã«ã³ã³ããŒãã³ãã䜿çšããã ãã§ã¯ãããŸããã ããã¯ãæäŸãããAPIãä»ããŠä»ã®æ¹æ³ã§ã¯è¿œå ã§ããªãæ©èœãããã«çµ±åãããå Žåãããããšãæå³ããŸãã ç§ã¯HOCãäžè¬çã§ãªããŸãã¯åªå 床ã®äœããŠãŒã¹ã±ãŒã¹ãšã¯åŒã³ãŸããã ããã¯ãReactã®æ§æäžã®æ§è³ªã®åºæ¬ã§ãã
ãããä¿®æ£ããŠãã ãããä¿®æ£äžã«ãæ å ±ãšãããã§èŠã€ããåé¿çãå ¬åŒããã¥ã¡ã³ãã«è¿œå ããŠãã ããã
ãããä¿®æ£ããŠãã ãããä¿®æ£äžã«ãæ å ±ãšãããã§èŠã€ããåé¿çãå ¬åŒããã¥ã¡ã³ãã«è¿œå ããŠãã ããã
ã¡ã³ããã¯PRãåãå ¥ããŠããŸããå¿ èŠã«å¿ããŠãããã¥ã¡ã³ãã®æŽæ°ã®ããã«PRãéä¿¡ããããšãã§ããŸãã
@ afc163
ç§ã¯ãã®åé¡ã«ãã°ããæéãè²»ãããŸãã...
ãããŠããã¯å®è¡å¯èœã§ããããªãã¯ãã æ®ãã®å°éå ·ãieã«æž¡ãå¿ èŠããããŸãã Collapse.PanelïŒrc-panelã®ãœãŒã¹ã³ãŒãã確èªããŠç解ããŠãã ããïŒ
export const CustomPanel: React.FC = ({ header, children, ...props }) => { // do whatever you like return <Collapse.Panel header={header} {...props}> {children} </Collapse.Panel> };
ãããŠããããã®ããã«äœ¿çšããŸãïŒ
<Collapse> <CustomPanel key="first" header="Header 1">Body</CustomPanel> <CustomPanel key="second" header="Header 2">Body</CustomPanel> </Collapse>
誰ãã以äžã§äœãèµ·ãã£ãŠããã®ã説æããŠããããŸããïŒ ãŸããã³ã³ããŒãã³ãå
ã§Panel
ãã©ããããããšããŠããŸãã
ãã®ã³ãŒãã䜿çšããå Žå::
<PersonalInfoPanel
header="header"
key={"personalInfo" + i}
extra={genExtra()}
/>
PersonalInfoPanel
ïŒ
function PersonalInfoPanel(props, ref) {
return (
<Panel header={props.header} key={props.key} extra={props.extra}>
...
åäœããŸããã
ãããã代ããã«ããã䜿çšãããšããã«ïŒ
function PersonalInfoPanel(props, ref) {
return (
<Panel {...props}>
...
ããã¯åãå§ããŸãã
誰ããçç±ã説æã§ããŸããïŒ
<Panel {...props}> ...
ããã¯åãå§ããŸãã
誰ããçç±ã説æã§ããŸããïŒ
ç§ãç解ããŠããããã«ã芪ã®Collapseã¯ãããããŒãããŒãããã³è¿œå 以å€ã®å°éå ·ãèšå®ããå¿ èŠããããŸãïŒæ©èœããŠããªãäŸããïŒã 芪ã®Collapseããã®ãããã®å°éå ·ã¯ãã«ã¹ã¿ã ã³ã³ããŒãã³ãå ã®ããã«ã³ã³ããŒãã³ãã«æ瀺çã«é 眮ããå¿ èŠããããŸãã
React Inspectorã䜿çšããŠãå€æŽãããå¯èœæ§ã®ãããã¹ãŠã®å°éå ·ãåŠç¿ãããããã1ã€ãã€æž¡ãããšãã§ãããšæããŸããã... propsæ§æã«ããã芪ãåããã«ã«è¿œå ããããã®ããã¹ãŠæ·»ä»ãããŸãïŒæ瀺çã«èšå®ããå¿ èŠããããã®ãå«ã¿ãŸãããããã«éå®ãããŸããïŒ
ãã®åé¡ã¯ä¿®æ£ããå¿
èŠããããŸãã
å€ãã®ïŒãŸãã¯ã»ãšãã©ïŒéçºè
ã¯ãã«ã¹ã¿ã ã³ã³ããŒãã³ãã«ã©ã€ãã©ãªã䜿çšããããšèããŠããŸãã
äŸïŒ
ãã®ã³ãŒãã¯æ©èœããŠããŸããã ã¡ãã¥ãŒãšã¡ãã¥ãŒã¢ã€ãã ã«ã¯äžéæãªå°éå
·ãå¿
èŠã ããã§ãã
<Menu>
{ menus.map((item) => {
if (item.to) {
return <Menu.Item title={item.title} />;
}
// some codes...
return null;
})}
</Menu>
@moonjoungyoung @adamerose
ã¹ã¬ãããèªã¿ãŸãããïŒ
ãããæ©èœãããã«ã¯ãã¬ã¹ããããããå
åŽã®antdã³ã³ããŒãã³ãã«æž¡ãå¿
èŠããããŸãã
ãããç§ãã«ã¹ã¿ã ã³ã³ããŒãã³ããšreact-router
NavLinks
æ¡ä»¶ä»ãã¬ã³ããªã³ã°ãreact-router
antd
Menu
å
ã§ååŸããããã«åãããã®ã§ãããããã«ã¯ä¿®æ£ãå¿
èŠã§ã-ç§ã¯ç¡é§ã«ããŸãããã®ã¹ã¬ãããèŠã€ãããŸã§ã«ããªãã®æéãããããŸãã
_ç·šé-æ°ã«ããªãã§ãã ãããselectedKeysã¯æ£ããæ©èœããŸãã_
const Nav = withRouter(() => {
const auth = store.isAuthenticated;
return (
<Menu selectedKeys={[history.location.pathname]} mode="horizontal">
<NavItem id="/">Home</NavItem>
{auth && <NavItem id="/create">Create Post</NavItem>}
{!auth && <NavItem id="/sign-in">Sign In</NavItem>}
{!auth && <NavItem id="/register">Register</NavItem>}
</Menu>
);
});
const NavItem = ({ ...props }) => (
<Menu.Item {...props} key={props.id}>
<NavLink exact to={props.id}>
{props.children}
</NavLink>
</Menu.Item>
);
@moonjoungyoung @adamerose
ã¹ã¬ãããèªã¿ãŸãããïŒ
ãããæ©èœãããã«ã¯ãã¬ã¹ããããããå åŽã®antdã³ã³ããŒãã³ãã«æž¡ãå¿ èŠããããŸãã
äžèšã®ç§ã®äŸãèŠãŠããã ããŸããïŒ ãã®ã¹ã¬ããã§ãã¹ãŠã®åé¿çãé©çšãããšæããŸããããããã§ãæ£ããæ©èœããŸããã å°éå
·ãæž¡ããŠMenu.Item
åºããŠããŸãããã¢ã¯ãã£ããªãšãã¯ãŸã 匷調衚瀺ããããã³ã³ããŒãã³ãããªãŒã¯æ¬¡ã®ããã«ãªããŸãã
ç§ã¯ãã®åé¡ã«ãã°ããæéãè²»ãããŸãã...
ãããŠããã¯å®è¡å¯èœã§ããããªãã¯ãã æ®ãã®å°éå ·ãieã«æž¡ãå¿ èŠããããŸãã Collapse.PanelïŒrc-panelã®ãœãŒã¹ã³ãŒãã確èªããŠç解ããŠãã ããïŒ
ç§ã®å Žåãã{... props}ãã®åŸãã«ãheader = {calculated_header}ããé 眮ããå¿ èŠããããŸãã ãããè¡ããªããšãããã«ã®ããââããŒã衚瀺ãããŸããã ã·ãŒã±ã³ã¹ã®åŸåã«è¡šç€ºãããã{... props}ãã¯ãããããŒãæ å ±ãäžæžããããšæããŸãã æåã«ã{... props}ããä»ãããšåäœããŸãã ãã®å ŽåãåŸã§è¡šç€ºããããããããŒããå°éå ·ã®ãããããŒãæ å ±ãäžæžããããšæããŸãã
@ marcin-pielaå¿çãžã®ç§ã®é©å¿ã¯æ¬¡ã®ãšããã§ãã
export const CustomPanel: React.FC = ({ headerinfo, children, ...props }) => {
// do whatever you like
const calculated_header = {() => headerinfo.someinformation }
return <Collapse.Panel {...props} header={calculated_header} >
{children}
</Collapse.Panel>
};
æãåèã«ãªãã³ã¡ã³ã
ãã®åé¡ã¯å®éã«ããã¥ã¡ã³ãã§èšåãããŠããã¯ãã§ãããã®ã©ã€ãã©ãªãç§ã«ã¯äœ¿çšã§ããªãããšãç解ããããã ãã«ããã®ãã°ã調æ»ããããã«äžžäžæ¥ç¡é§ã«ãªããŸããã ä»ã®éçºè ãã¢ã³ããã¿ãŒã³ã䜿çšããŠReactããŒãäžç¶ããŠããããšãç解ããã®ã«ããã»ã©å€ãã®æéãç¡é§ã«ããå¿ èŠããªãããã«ãèŠåãåºããŠãã ãããã³ãã¥ããã£ã§å©çšã§ããéåžžã«å€ãã®HOCããã³ã¬ãŒã¿ã«å¯ŸããŠéåžžã«è匱ã§ãã
ããã¯æ¬åœã«æ®å¿µã§ãã 次ã®ã¡ãžã£ãŒããŒãžã§ã³ã§ä¿®æ£ããŠããã ããã°å¹žãã§ãã