当前位置: 首页 > 知识库问答 >
问题:

React Redux-当输入具有来自状态的值时,Input onChange在输入时非常慢

卫和洽
2023-03-14

我得到了我的输入,它由我的状态的值填充。

<input id="flashVars" name="flashVars" type="text" value={settings.flashVarsValue} disabled={isDisabled} onChange={handleChange} />

设置是我的Redux状态。当我输入一个值时,我必须指定一个onChange函数。这是我的onChange函数:

handleFlashVarsChange(e) {
  let { dispatch } = this.props;

  dispatch( changeFlashVarsValue(e.target.value) );
}

它更改输入值的状态值。但当我输入我的输入,它滞后。我不明白为什么每次我改变输入值时都要调用调度。

有没有什么办法可以减少滞后?

我的减速机:

import { ACTIONS } from '../utils/consts';

const initialState = {
  ...
  flashVarsValue: '',
  ...
};

export function formSettings(state = initialState, action = '') {
  switch (action.type) {

    ...

    case ACTIONS.CHANGE_FLASHVARS_VALUE:
      return Object.assign({}, state, {
        flashVarsValue: action.data
      });

    default:
      return state;
  }
}

我的行动:

export function changeFlashVarsValue(data) {
  return {
    type: ACTIONS.CHANGE_FLASHVARS_VALUE,
    data: data
  }
}

非常感谢。

共有3个答案

胡云瀚
2023-03-14

我知道这是一个老问题,但如果您想在文本输入上触发onChange,您可能需要取消事件的影响。这个线程在分解它方面做得很好,但我认为这对于op的示例是可行的:

import debounce from 'debounce'                                      

function debounceEventHandler(...args) {
  const debounced = debounce(...args)
  return function (e) {
    e.persist();
    return debounced(e);
  }
}                                                                      
const Container = React.createClass({
  handleFlashVarsChange(e) {
    let { dispatch } = this.props;
    //basic redux stuff
    this.props.changeFlashVarsValue(e.target.value));
  },
  render() {
    const handleChange = debounceEventHandler(this.handleFlashVarsChange, 15);
    return (
      <input id="flashVars" onChange={handleChange} />
    )
  }                                                                         
}
//...prep and return your redux container
宰父远
2023-03-14

对我来说,答案是使用应该组件更新生命周期钩子。Mike Boutin(大约一年前:)的评论中已经给出了这个答案,但是一个例子可能会对下一个游客有所帮助。

我有一个类似的问题,文本输入丢失,速度慢且跳跃。我在onChange事件中使用setState更新formData。

我发现表单在每按一次键时都会进行完整的重新渲染,因为状态已经发生了变化。为了停止这个,我重写了函数:

shouldComponentUpdate(nextProps, nextState) {
   return this.state.formErrors !== nextState.formErrors);
}

我在表单提交时显示一个错误通知面板,其中包含任何新的或更改的验证错误,这是我唯一需要重新呈现的时间。

如果没有子组件,则可以将表单组件的shouldComponentUpdate设置为始终返回false。

欧君之
2023-03-14

我在编辑一个有一百万行的网格时遇到了类似的问题,所以我所做的是更改更新逻辑,在您的例子中,handleChange仅在事件onBlur上调用,而不是onChange。这只会在您失去焦点时触发更新。但我不知道这对你来说是否是一个令人满意的解决方案。

 类似资料:
  • 当元素的值通过JavaScript代码更改时,会发生什么事件?例如: 事件在这里没有帮助,因为更改值的不是用户。 在Chrome上测试时,事件不会被激发。也许是因为元素没有失去焦点(它没有获得焦点,所以不能失去焦点)?

  • 给定一个具有受控输入的React组件,我希望能够: 设置来自父级状态的输入值 允许用户将输入更改为任意值 只有在用户提交并且输入通过验证后才更新父级的状态。 我可以用下面的代码片段完成1和2,但是由于值是通过props进入ChildComponent的,所以我不确定如何在不更改父级上myInput的值的情况下更改输入值。

  • 我正在尝试将预订id从HTML传递到模态。在图片中,当我单击屏幕的“Reservation:preview”旁边的“Cancel”时,会出现一个模式,它应该包含Reservation:preview的id号 弹出Modal,但没有保留id号。拜托,怎么了? 我遵循了这个教程:https://www.geeksforgeeks.org/how-to-pass-data-into-a-bootstra

  • 我正在通过一个教程视频制作一个程序,代码是启动、停止或退出汽车。程序的一部分是这样做,如果汽车已经启动或停止,你在程序中告诉他们。我的程序会告诉用户汽车已经启动或停止,但在我告诉它停止两次之后,而不是一次。希望有人能描述一下while循环和if语句中的布尔值之间的关系?

  • 我们的父工作流代码基本上是这样的(来自组织. 我们发现,在大多数情况下,父工作流工作者无法启动子工作流,并抛出上面的超时异常。它疯狂地重试,但从未成功,并一遍又一遍地打印超时异常。然而,有时我们非常幸运,它的工作。有时在活动工作器上它甚至更早就失败了,它抛出同样的异常。我们认为这是由于数据太大(大约5MB ),无法在超时时间内发送(从日志判断,我们猜测设置为2s)。如果我们用少量虚假数据调用< c

  • 问题内容: 当我尝试在最新的IE中执行测试时,我发现输入速度非常慢:每个字符要花费大约5秒钟才能出现在输入字段中。启用所有安全区域,并使用以下代码初始化驱动程序: 此问题仅出现在IE10上;当我运行Firefox时,一切都很好。 我的操作系统是Windows 8,以防万一。 我错过了什么? UPD 现在,我可以看到IE有时工作得更快,但是发生这种情况时,此代码不起作用: 问题答案: 通过替换IED