我正在使用React和CSSTransitionGroup组件在我的应用状态中的两组members
之间切换。它的状态包含members
,每个都有一个标志,说明它们是否是真正的成员。它还包含一个标志,用于跟踪我们正在查看的成员类型:
this.state = {
viewMembers: true,
members: [
{
id: 1,
name: "Jim",
isMember: true
},
{
id: 2,
name: "John",
isMember: false
}
]
}
在我的render
函数中,我映射此数组,并且仅显示与视图状态对应的成员(即如果viewMembers
是true
,我只显示成员{{1} }是isMember
,反之亦然。对于每个成员,我返回一个表true
。 <tr>
函数包含在map
标记中,以淡入表格行。这一切都很好 - 请在此处查看工作代码:jsfiddle.net/d9cfh4zg/1/。
我的问题是,它在淡出旧状态之前目前在新状态中消失,给它稍微有点质量。如何在淡入新内容之前允许现有行淡出?
答案 0 :(得分:0)
试试这个:
const styles = {
fontFamily: "sans-serif"
};
const CSSTransitionGroup = React.addons.CSSTransitionGroup;
class App extends React.Component {
constructor() {
super();
this.state = {
viewMembers: true,
members: [
{
id: 1,
name: "Jim",
isMember: true
},
{
id: 2,
name: "John",
isMember: false
},
{
id: 3,
name: "Sarah",
isMember: false
},
{
id: 4,
name: "Mary",
isMember: true
}
]
};
this.refreshState = true;
}
changeViewState(state) {
this.refreshState = false;
setTimeout(() => {
if (state === "members") {
this.setState({ viewMembers: true });
if(!this.refreshState)
{
this.changeViewState(state);
this.refreshState = true;
}
} else {
this.setState({ viewMembers: false });
if(!this.refreshState)
{
this.changeViewState(state);
this.refreshState = true;
}
}
}, 500);
}
render() {
return (
<div style={styles}>
<h4>Members</h4>
<ul>
<li onClick={() => this.changeViewState("members")}>View Members</li>
<li onClick={() => this.changeViewState("non-members")}>
View Non-members
</li>
</ul>
<MembersTable
viewMembers={this.state.viewMembers}
members={this.state.members}
refreshState = {this.refreshState}
/>
</div>
);
}
}
const MembersTable = (props) =>
<table>
<thead>
<tr>
<td>
<strong>Id</strong>
</td>
<td>
<strong>Name</strong>
</td>
</tr>
</thead>
<CSSTransitionGroup
component="tbody"
transitionName="fade"
transitionAppear={true}
transitionAppearTimeout={500}
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
>
{props.members.map(member => {
if (
(props.viewMembers && member.isMember && props.refreshState) ||
(!props.viewMembers && !member.isMember && props.refreshState)
) {
return (
<tr key={member.id}>
<td>
{member.id}
</td>
<td>
{member.name}
</td>
</tr>
);
}
})}
</CSSTransitionGroup>
</table>;
ReactDOM.render(<App />, document.getElementById("root"));
我添加了refreshState
变量并在setTimeout
回调函数中对其进行了更新,该函数已添加到changeViewState
函数中。
以下是更新后的fiddle
希望这会有所帮助。