【问题标题】:storing value from text input into redux store cause re-rendering react component将文本输入中的值存储到 redux 存储中导致重新渲染反应组件
【发布时间】:2020-09-11 19:57:47
【问题描述】:

我正在尝试将文本输入中的值存储到 redux 存储中,但问题是我的 react 组件仍在重新渲染。

使用 debounce 动作调度动作后,组件自动完成重新呈现,我得到初始状态。所以输入在 300 毫秒后因为去抖动功能变为空。

我尝试使用 useCallback 来避免它,但没有任何结果。

如何将输入值保存到 redux 存储中并防止重新渲染反应组件?

const AutoComplete = () => {
  const [focus, setFocus] = useState(false);
  const [blur, setBlur] = useState(false);
  const radarTrends = useSelector(selectedRadarsTrends);
  const dispatch = useDispatch();
  const filteredValue = useSelector(selectedFilteredValue);


  const debounceFilteredValue = (value) => {
      dispatch(setFilteredValue(value));
   }

  const debounce = useCallback(_.debounce(debounceFilteredValue, 300), []);

  const handleOnChange = (event) => {
    debounce(event.target.value);
  };

  const handleOnFocus = () => {
    setBlur(false);
    setFocus(true);
  };

  const handleOnBlur = () => {
    setFocus(false);
    setBlur(true);
  };
  return (
    <StyledAutoComplete hasFocus={focus} hasBlur={blur}>
      <StyledMagnifier>
        <Magnifier width={20} height={20} />
      </StyledMagnifier>
      <Input
        placeholder="type trend name"
        type="text"
        label=""
        name="autocomplete"
        onFocus={handleOnFocus}
        onChange={handleOnChange}
        onBlur={handleOnBlur}
      />
    </StyledAutoComplete>
  );
};

感谢您的帮助。

【问题讨论】:

    标签: reactjs redux react-redux redux-toolkit


    【解决方案1】:

    我相信re-renderuseSelectordispatch之后引起的。

    When an action is dispatched, useSelector() will do a reference comparison of
    the previous selector result value and the current result value.
    If they are different, the component will be forced to re-render.
    If they are the same, the component will not re-render.
    

    查看文档:https://react-redux.js.org/next/api/hooks#useselector

    【讨论】:

    • 我认为它的重新渲染也没有任何 useSelector()。调度原因也重新渲染。
    • 自行调度不会导致重新渲染。如果组件接收到新的道具,它会重新渲染。
    • 我的组件没有收到任何道具
    • @sonkamatas 你看到我的组件收到任何道具了吗?我没有任何参数。
    • 你是对的选择器:)。他们导致重新渲染我将过滤器放入分离的减速器中。所以我解决了。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-12-27
    • 2018-10-15
    • 2021-08-10
    • 1970-01-01
    • 2017-10-26
    • 2020-11-05
    相关资源
    最近更新 更多