React性能优化 渲染20000多条checkbox组件,点击选择checkbox组件的时候特别卡,解决办法

import * as React from 'react';
interface IData {
  id: number,
  title: string
}
interface IState {
  checkedValues: Set<IData>;
  data: IData[];
}

interface IProps {
  value: IData,
  checked: boolean,
  onChange: (v: IData) => void
}
class ItemComp extends React.Component<IProps> {
  shouldComponentUpdate(nextProps: IProps) {
    const props = this.props;
    return props.value !== nextProps.value || props.checked !== nextProps.checked
  }
  render() {
    const { value, checked } = this.props;
    return (
      <label>
        <input
          type="checkbox"
          checked={checked}
          onChange={this.onChange} />
        {value.title}
      </label>
    )
  }
  onChange = () => {
    this.props.onChange(this.props.value);
  }
}

// tslint:disable-next-line:max-classes-per-file
export default class App extends React.Component<{}, IState> {
  constructor(props: {}) {
    super(props)
    const initValue: IState = {
      checkedValues: new Set(),
      data: []
    }
    for (let i = 0; i < 20000; i++) {
      let temp = { id: Math.random(), title: i }
      initValue.data.push(temp)
      initValue.checkedValues.add(temp)
    }
    this.state = initValue;
  }
  render() {
    const onChange = this.onChange;
    const { checkedValues, data } = this.state;
    return (
      <div className="App">
        {data.map((value) =>
          <ItemComp
            key={value.id}
            value={value}
            checked={checkedValues.has(value)}
            onChange={onChange} />
        )}
      </div>
    );
  }
  onChange = (active: IData) => {
    const checkedValues = new Set(this.state.checkedValues);
    if (checkedValues.has(active)) {
      checkedValues.delete(active);
    } else {
      checkedValues.add(active);
    }
    this.setState({ checkedValues })
    console.log(checkedValues)
  }
}

比较慢的代码案例:

import React, { Component } from 'react';
import { Checkbox } from 'antd'

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      checked: []
    }      
  }
  render() {
    let list = this.list()
    return (
      <div>
        {list}
      </div>
    );
  }
}

Object.assign(App.prototype, {
  componentDidMount() {
    let arr = []
    for (let i = 0; i < 20000; i++) {
      arr.push(i)
    }   
    this.setState({
     checked: arr
    }) 
  },
  list() {
    let { checked } = this.state
    let arr = []
    for (let i = 0; i < 20000; i++) {
      arr.push(<Checkbox key={i} checked={checked.indexOf(i) >= 0}  onChange={this.handleChange.bind(this, i)}>{i}</Checkbox>)
    }
    return arr
  },
  handleChange(index, e) {
    let { checked } = this.state
    let tempIndex = checked.indexOf(index)
    if (e.target.checked) {
     if (tempIndex < 0) {
       checked.push(index)
     }     
    } else {
     if (tempIndex >= 0) {
       checked.splice(tempIndex, 1)
     }         
    }

    this.setState({
     checked: checked
    })
    console.log(checked)
  }
})


export default App

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
下面是一个简单的示例,展示了如何使用`react-drag-and-select`组件来实现选择多个项目的功能: ```javascript import React, { useState } from "react"; import DragAndSelect from "react-drag-and-select"; function App() { const [selectedItems, setSelectedItems] = useState([]); const handleSelection = (selectedItems) => { setSelectedItems(selectedItems); }; const items = [ { id: 1, name: "Item 1" }, { id: 2, name: "Item 2" }, { id: 3, name: "Item 3" }, { id: 4, name: "Item 4" }, { id: 5, name: "Item 5" }, ]; return ( <div> <DragAndSelect items={items} onSelection={handleSelection} render={(item, index) => ( <div key={item.id} style={{ marginBottom: 10 }}> <input type="checkbox" checked={selectedItems.includes(item.id)} onChange={() => {}} /> <span style={{ marginLeft: 10 }}>{item.name}</span> </div> )} /> </div> ); } export default App; ``` 在上面的代码中,我们首先导入了`react`和`react-drag-and-select`库。然后,我们使用`useState`钩子来定义了一个名为`selectedItems`的状态,以跟踪用户选择的项目。接着,我们定义了一个名为`handleSelection`的回调函数,用于在选择发生变化时更新`selectedItems`状态。在`handleSelection`回调函数中,我们简单地将所选项目传递给`setSelectedItems`函数,以更新状态。 接下来,我们定义了一个名为`items`的数组,其中包含了我们想要供用户选择的项目。在组件的`render`方法中,我们使用`DragAndSelect`组件来包裹我们的项目。我们将`items`数组传递给`DragAndSelect`组件的`items`属性,以告诉它哪些项目可以被选择。我们还将`handleSelection`函数传递给`DragAndSelect`组件的`onSelection`属性,以在选择发生变化时接收通知。 最后,我们定义了一个`render`函数,用于渲染每个项目。在这个函数中,我们使用一个`<div>`元素来包裹每个项目,并添加了一个复选框和项目名称。我们使用`selectedItems.includes(item.id)`来确定当前项目是否被选择。如果是,我们将复选框标记为选中状态。否则,我们将复选框标记为未选中状态。 希望这个示例能够帮助您了解如何使用`react-drag-and-select`组件来实现选择多个项目的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐同保

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值