render
至于为什么要把下面的东西记录下来,完全是因为自己平时没有注意到的一些细节原因。
有这么一个场景:
我需要渲染一个列表,这个列表不带翻页,点击之后要在这一项的后面打上对勾,标识点击取消与否。
下面看看一个伪代码:
import React, {memo} from 'react';
const datas = Array.from({length: 1000}, (item, index) => ({
id: ++index,
name: `xiaohesong${index}`,
age: index
}))
// 写法1
const RenderItem1 = props => {
const {onSelect, selectedId, item} = props
return(
<li onClick={() => onSelect(item.id)}>
<span>{item.name}</span>
<span>{item.age}</span>
<span>{item.id === selectedId ? '选择了这个' : ''}</span>
</li>
)
}
// 写法2
const RenderItem2 = memo(props => {
const {onSelect, selectedId, item} = props
return(
<li onClick={() => onSelect(item.id)}>
<span>{item.name}</span>
<span>{item.age}</span>
<span>{item.id === selectedId ? '选择了这个' : ''}</span>
</li>
)
})
// 写法3
const RenderItem3 = memo(props => {
const {onSelect, selected, item} = props
return(
<li onClick={() => onSelect(item.id)}>
<span>{item.name}</span>
<span>{item.age}</span>
<span>{selected ? '选择了这个' : ''}</span>
</li>
)
})
export default class Examle extends React.Component {
state = {
selectedId: null
}
handleSelect = selectedId => this.setState({selectedId})
render1() {
return datas.map(item => <RenderItem1 item={item} onSelect={this.handleSelect} selectedId={this.state.selectedId} />)
}
render2() {
return datas.map(item => <RenderItem2 item={item} onSelect={this.handleSelect} selectedId={this.state.selectedId} />)
}
render3() {
return datas.map(item => <RenderItem3 item={item} onSelect={this.handleSelect} selected={item.id === selectedId} />)
}
}
你觉得这几个有什么区别,哪个更好,之前一直没有注意到这个问题。哈哈,如果有疑问,欢迎在issue里留言。
Last updated