代码之家  ›  专栏  ›  技术社区  ›  Dimitri Kopriwa

如何使用lodash使用一个油门调节多个按钮?

  •  1
  • Dimitri Kopriwa  · 技术社区  · 6 年前

    我希望避免并发并将操作限制为每秒1次。

    onChange

    import React from 'react';
    import { css } from 'styled-components';
    import PropTypes from 'prop-types';
    import omit from 'lodash.omit';
    import throttle from 'lodash.throttle';
    import Img from '@bootstrap-styled/v4/lib/Img';
    
    export default class ServicesAndSolutionImg extends React.PureComponent {
      static propTypes = {
        src: PropTypes.string.isRequired,
        alt: PropTypes.string.isRequired,
        onDigitalSolution: PropTypes.func.isRequired,
        onServices: PropTypes.func.isRequired,
        onHosting: PropTypes.func.isRequired,
        onAddons: PropTypes.func.isRequired,
      };
    
      state = {
        throttleFn: null,
      }
    
      componentWillMount() {
        this.setState({
          throttleFn: (e) => throttle(this.props[e.target.value], 1000, { leading: false, trailing: true })(),
        });
      }
    
      render() {
        const { src, alt } = omit(this.props, [
          'onDigitalSolution',
          'onServices',
          'onHosting',
          'onAddons',
        ]);
    
        return (
          <div css={css`position: relative`}>
            <Img fluid src={src} alt={alt} className="w-100 pt-3 pl-5 pr-5" />
            <div css={css`
              position: absolute;
              top: 0;
              right: 0;
              left: 0;
              right: 0;
              width: 100%;
              height: 100%;
            `}>
              <div css={css`
                position: relative;
                width: inherit;
                height: inherit;
                button {
                  cursor: pointer;
                  position: absolute;
                  top: 23%;
                  height: 51%;
                  opacity: 0;
                }
                button:nth-child(1) {
                  left: 15%;
                  width: 16%;
                }
                button:nth-child(2) {
                  left: 32%;
                  width: 16%;
                }
                button:nth-child(3) {
                  left: 48%;
                  width: 16%;
                }
                button:nth-child(4) {
                  left: 65%;
                  width: 16%;
                }
              `}>
                <button onClick={this.state.throttleFn} value="onDigitalSolution" />
                <button onClick={this.state.throttleFn} value="onServices" />
                <button onClick={this.state.throttleFn} value="onHosting" />
                <button onClick={this.state.throttleFn} value="onAddons" />
              </div>
            </div>
          </div>
        );
      }
    }
    

    预期

    无延迟,每秒单击1次,无并发

    后果

    1秒延迟,最多4个并发操作。

    有人知道为什么会失败吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ori Drori    6 年前

    Throttle 是一个接受函数并返回限制函数的函数。节流函数在一个窗口中只调用原始函数一次 毫秒。

    多次调用throttle将返回多个throttle函数,您可以调用这些函数,并且每个函数都是时间窗口中唯一的调用。

    export default class ServicesAndSolutionImg extends React.PureComponent {
      static propTypes = {
        src: PropTypes.string.isRequired,
        alt: PropTypes.string.isRequired,
        onDigitalSolution: PropTypes.func.isRequired,
        onServices: PropTypes.func.isRequired,
        onHosting: PropTypes.func.isRequired,
        onAddons: PropTypes.func.isRequired,
      };
    
      // create the throttled function
      throttleFn = throttle((e) => this.props[e.target.value], 1000, { leading: false, trailing: true })
    
      render() {
         // no need to omit anything - you know what you want
        const { src, alt } = this.props;
    
        return (
          <div css={css`position: relative`}>
            <Img fluid src={src} alt={alt} className="w-100 pt-3 pl-5 pr-5" />
            <div css={css`
              position: absolute;
              top: 0;
              right: 0;
              left: 0;
              right: 0;
              width: 100%;
              height: 100%;
            `}>
              <div css={css`
                position: relative;
                width: inherit;
                height: inherit;
                button {
                  cursor: pointer;
                  position: absolute;
                  top: 23%;
                  height: 51%;
                  opacity: 0;
                }
                button:nth-child(1) {
                  left: 15%;
                  width: 16%;
                }
                button:nth-child(2) {
                  left: 32%;
                  width: 16%;
                }
                button:nth-child(3) {
                  left: 48%;
                  width: 16%;
                }
                button:nth-child(4) {
                  left: 65%;
                  width: 16%;
                }
              `}>
                <button onClick={this.throttleFn} value="onDigitalSolution" />
                <button onClick={this.throttleFn} value="onServices" />
                <button onClick={this.throttleFn} value="onHosting" />
                <button onClick={this.throttleFn} value="onAddons" />
              </div>
            </div>
          </div>
        );
      }
    }