[英]React Conditional Rendering with states
我在一個組件中工作,如果我點擊NavItem
我會呈現另一個元素列表
改變狀態的函數
handleClick() {
this.setState({
isActive: !this.state.isActive
});
};
條件渲染
if (isActive) {
SubList = <List hasIcons style="secondary"><ListItem><NavItem href={desktopUrl} title={title}><Icon name={name} />{title}</NavItem></ListItem></List>
}
List NavItem 和{{SubList}}
<ListItem>
<NavItem isActive href={desktopUrl} title={title} onClick={this.handleClick}>
<Icon name={name} />
{title}
</NavItem>
{SubList}
</ListItem>
這里是整個組件
export default class SportNavItem extends React.Component {
constructor() {
super();
this.state = { isActive: false };
// This binding is necessary to make `this` work in the callback
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
this.setState({
isActive: !this.state.isActive
});
}
render() {
const { title, desktopUrl, isActive, name } = this.props.data;
// props.childItems; { title, name, isActive, url }
// const itemId = `nav-${slugEn}`;
const style = isActive ? "primary" : "default";
let SubList = null;
if (isActive) {
SubList = (
<List hasIcons style="secondary">
<ListItem>
<NavItem isActive href={desktopUrl} title={title}>
<Icon name={name} />
{title}
</NavItem>
</ListItem>
</List>
);
}
return (
<List hasIcons style={style}>
<ListItem>
<NavItem isActive href={desktopUrl} title={title} onClick={this.handleClick}>
<Icon name={name} />
{title}
</NavItem>
{SubList}
</ListItem>
</List>
);
}
}
導出的組件
const sampleData = {
title: 'Football',
name: 'football',
isActive: true,
desktopUrl: '#'
}
ReactDOM.render(
<div>
<SportNavItem data = { sampleData }/>
</div>,
document.getElementById('app')
);
如果我手動將狀態isActive
更改為false
我可以呈現SubList
。 我無法處理onClick
狀態,並且在控制台中沒有看到錯誤。 可能有什么問題? 有沒有更好的辦法?
您正在嘗試從this.props.data
讀取isActive
:
const { title, desktopUrl, isActive, name } = this.props.data;
...但isActive
處於this.state
。 改為:
const { title, desktopUrl, name } = this.props.data;
const { isActive } = this.state;
首先,正如@Jacob 所建議的,您的變量isActive
是一個state
而不是prop
。 你應該像這樣使用它
const { title, desktopUrl, name } = this.props.data;
const {isActive} = this.state;
其次,如果NavItem
是您創建的自定義組件,則onClick={this.handleClick}
不會在NavItem
上設置onClick
事件,而是將onClick
作為道具傳遞給NavItem
組件。 在NavItem
組件中,您可以在 div 上有一個 onClick 事件,該事件將依次從 props 調用onClick
函數,從而導致this.handleClick
被調用。 如果您查看ReactBootstrap
中的NavItem
組件。 它有一個onClick
道具,基本上和我上面建議的一樣
因此,從技術上講,您不能對任何組件進行onClick
事件。 您可以將NavItem
包裝在一個 div 中,然后在該 div 上設置一個onClick
事件
<ListItem>
<div onClick={this.handleClick}>
<NavItem isActive href={desktopUrl} title={title} >
<Icon name={name} />
{title}
</NavItem>
{SubList}
</div>
</ListItem>
您不能onClick
自定義組件。 用具有onClick
方法的 div 包裹 NavItem。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.