【发布时间】:2019-05-08 12:46:01
【问题描述】:
我有一个包含多张卡片的页面,其中每张卡片都有一个项目列表。我一直在尝试在每张卡片上实施 Show More/Show Less 实施。对于单张卡,我通过向状态对象添加两个属性来正确处理它。但是,如果我对所有卡片实现相同的功能,我最终会为每张卡片添加更多状态对象属性。 寻找一种更好的方法,我可以使用一个通用来处理所有卡片 Show More/Less 实现
只需要一种有效的方法来实现这一点。 帮助将不胜感激
组件代码
只有两张牌的例子
import * as React from 'react';
interface IState{
arr1:[],
arr2: [],
arr1ExpandFlag: boolean, // For updating Button label(More/Less)
arr2ExpandFlag : boolean
arr1temsToShow: number, // Number of items to show
arr2itemsToShow: number
//I will end up adding two variables one for each card
}
export default class App extends React.Component<{},IState> {
constructor(props:any){
super(props);
this.state = {
arr1 :[],
arr2 :[],
arr1ExpandFlag: false,
arr1ExpandFlag: false,
arr1itemsToShow: 3,
arr2itemsToShow: 3,
}
}
showMore = (type: string) => { // end up adding if conditions
if(type === 'arr1')
{
(this.state.arr1itemsToShow === 3) ?
(this.setState({ arr1itemsToShow: this.state.arr1.length, arr1ExpandFlag: true })):
(this.setState({ arr1itemsToShow: 3,arr1ExpandFlag: false}))
}
if(type === 'arr2')
{
(this.state.arr2itemsToShow === 3) ?
(this.setState({ arr2itemsToShow: this.state.arr2.length, arr2ExpandFlag: true })):
(this.setState({ arr2itemsToShow: 3, arr2ExpandFlag: false}))
}
}
render() // This is just for two cards
{
return
(
<div>
<div>
{this.state.arr1.slice(0, this.state.arr1itemsToShow).map((data : any, i) =>
<p key={i}>{data.user}</p>
)}
<a onClick={() => this.showMore('arr1')}>
{ (this.state.arr1ExpandFlag) ?
( <span>Show less</span>) :
( <span>Show more</span>)
}
</a>
</div>
<div>
{this.state.arr2.slice(0, this.state.arr2itemsToShow).map((data : any, i) =>
<p key={i}>{data.user}</p>
)}
<a onClick={() => this.showMore('arr2')}>
{ (this.state.arr2ExpandFlag) ?
(<span>Show less</span>) :
(<span>Show more</span>)
}
</a>
</div>
</div>
)
}
【问题讨论】:
-
将 React 视为一个库,用于创建可以在您的应用程序中多次重用的组件。为什么不创建一个组件来显示带有两个链接
Show less/Show more的项目,该组件将有一个状态变量来了解用户是显示更少还是更多项目 -
@OlivierBoissé 是对的。通过对相同但只是重复的部分使用不同的状态属性,您似乎使事情变得过于复杂。尝试构建可重复使用的组件。就像具有
state.isExpanded的Card组件一样,一种切换此属性的方法,然后根据需要渲染它们。
标签: reactjs typescript setstate