zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    服务器运维
    mysq配置
    PHP-FPM进程数的设定
    vsftpd 安装配置详细教程
    php-fpm性能优化
    如果不知道MySQL当前使用配置文件(my.cnf)的路径的解决方法
    搭建linux+nginx+mysql+php环境
    PHP 页面编码声明方法详解(header或meta)
    Linux内核的一些知识。
    Connector框架笔记
  • 原文地址:https://www.cnblogs.com/xutongbao/p/11915712.html
Copyright © 2011-2022 走看看