【问题标题】:React: delay in input changes反应:输入更改的延迟
【发布时间】:2019-12-24 10:20:03
【问题描述】:

在父组件的状态下,我有一个相当大的对象数组。当我将它们作为道具传递给子组件(没有状态,只有道具)时,当输入发生变化时,我在输入(在子组件中)时会有很大的延迟。

我已经阅读了类似问题的答案ReactJS delay onChange while typing 以及使用 shouldcomponentupdate reactjs : ShouldComponentUpdate for states 的建议。

但是,不幸的是,我仍然不明白如何在我的示例中应用它https://codesandbox.io/s/react-example-8vlc2。父组件是 index.js 。所以:

1) 我应该在子组件(StoryList.tsx 和 StoriesScreenItem/StoriesScreenList)中使用 componentdidupdate 还是 shouldcomponentupdate() ?

2) 我应该在子组件中添加状态以使用 componentdidupdate 还是 shouldcomponentupdate() ?

3) 为什么在我的示例中会出现输入延迟?

4) 或者任何其他想法我该如何解决这个问题?

任何帮助将不胜感激!

【问题讨论】:

  • 我认为first question 不适用于此处,因为您想要延迟的操作似乎是更新状态。这将导致文本字段不反映状态中包含的实际文本。

标签: javascript reactjs


【解决方案1】:

我的建议是为故事创建一个功能组件。

它可能看起来像这样:

export const Story = props => {
   const [story, setStory] = useState(props.story);
   const handleChange = e => {
       const updatedStory = {...story};
       updatedStory.caption = e.target.value;
       setStory(updatedStory);
   };
   return (
       <div>
           <div>
               <div>
                   {story.previewUri ? (
                       <div>
                           <img
                               style={{
                               objectFit: "cover",
                               border: "4px solid #1ec1b6"
                            }}
                            width="110"
                            height="168"
                            src={story.previewUri || null}
                            alt={"Фото сториc"}
                        />
                    </div>
                ) : (
                    <div
                        style={{
                            border: "4px solid #1ec1b6",
                            textAlign: "center",
                            fontSize: "14px"
                        }}
                    >
                        Link image
                    </div>
                )}

                <div>
                    <span>Story</span>

                    <div>
                        <div>
                            <span>Preview title</span>
                        </div>
                        <div>
                            <input
                                style={{ width: "100%" }}
                                maxLength={99}
                                value={story.caption}
                                onChange={e => handleChange(e)}
                            />
                        </div>
                    </div>
                </div>
            </div>

            <StoriesScreenList
                screens={story.stories}
                onChange={screens => props.changeScreen(screens, props.index)}
            />
           </div>
       </div>
    );
};
export default Story;

每个都有自己的状态,因此您不必在每次更改单个故事时都更新整个故事数组。

令人怀疑的是造成延迟的原因。

我希望这会有所帮助。

【讨论】:

  • 谢谢!但是在我的项目中,我们不使用钩子 :( 如果我这样做但使用 state 和 setState,可以吗?
  • 我相信使用 state 和 setState。应该可以正常工作
  • 不幸的是,这对我没有帮助,但无论如何非常感谢您关注我的问题!:)。我决定在 state 中设置“focus: false”,并仅在子组件的输入(或选择)获得焦点时更新子组件。
  • @JANE DOE 很高兴您找到了解决方案。您应该在答案中写下您所做的并接受它,以便其他人可以从您的经验中学习。
猜你喜欢
  • 2019-06-07
  • 2017-09-11
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多