很抱歉标题模棱两可。用一句话很难解释这个问题。
首先,我的代码结构如下(使用JSX)

<Parent>
    <EditableText1 />
    <EditableText2 />
</Parent>

以下是我希望它的工作方式:
在默认状态下,ET2(EditableText2)的“display”为“none”
当'Parent'是'Focus'时,ET2的'display'值变为'flex'
当“Parent”为“Blur”时,ET2的“display”值再次变为“none”
换言之,如果选择了ET1(ET1可见),则ET2可见,并且可以在该状态下编辑ET2。
以下是我的尝试:
(一)
<Parent
onFocus={() => { this.setState({ visible: 'flex' }) }}
onBlur={() => { this.setState({ visible: 'none' }) }>
    <EditableText1 />
    <EditableText2 className={css`
display: ${this.state.visible};
`/>
</Parent>

这里的问题是:
javascript - 我对“焦点”事件和“模糊”事件有疑问-LMLPHP
当ET1变成“焦点”时,ET2出现。但是,如果我尝试选择ET2,ET1将变为“模糊”,因此ET2的“显示”将变为“无”。所以我不能选择ET2!
2个)
所以当ET1模糊时,我试着防止冒泡:
<Parent
onFocus={() => { this.setState({ visible: 'flex' }) }}
onBlur={() => { this.setState({ visible: 'none' }) }>
    <EditableText1
onBlur={(e) => { e.stopPropagation() }}
/>
    <EditableText2 className={css`
display: ${this.state.visible};
`/>
</Parent>

这个案子的问题是:
javascript - 我对“焦点”事件和“模糊”事件有疑问-LMLPHP
现在可以在ET1聚焦后选择ET2。
但是,
如果从ET1模糊到父级之外,则ET2的“display”不会更改为“none”。
javascript - 我对“焦点”事件和“模糊”事件有疑问-LMLPHP
如果从ET2模糊外部父对象,“display”将变为“none”(我希望它的工作方式)。
我不知道该怎么办了。似乎是因为我缺乏知识。有人能给我个建议吗?

最佳答案

这是一个可能的解决办法。这不是最漂亮的,但我工作。主要思想是存储状态中有焦点的元素。当模糊事件发生在ET1元素上时,你需要检查ET2是否有焦点。为此,您需要创建一个延迟,因为模糊事件将在焦点事件之前触发。如果没有这个延迟,说明哪个元素有焦点的状态将不会被更新。

import React from "react";

export default class myClass extends React.Component {
  constructor() {
    super();
    this.beforeBlur = this.beforeBlur.bind(this);
    this.update = this.update.bind(this);
    this.state = {
      whoHasFocus: "none",
      visible: "none"
    };
    this.delay = null;
  }

  beforeBlur(obj) {
    const that = this;
    this.delay = setInterval(() => {
      if (this.state.whoHasFocus !== "ET2") {
        this.update(obj);
      }
      clearInterval(that.delay);
    }, 10);
  }
  update(obj) {
    this.setState(obj);
  }
  render() {
    return (
      <div>
        <input
          type="text"
          onBlur={() => {
            this.beforeBlur({
              visible: "none",
              whoHasFocus: "none"
            });
          }}
          onFocus={() => {
            this.update({
              visible: "flex",
              whoHasFocus: "ET1"
            });
          }}
        />
        <input
          type="text"
          style={{ display: `${this.state.visible}` }}
          onFocus={() => {
            this.update({ whoHasFocus: "ET2" });
          }}
          onBlur={e => {
            this.update({
              visible: "none",
              whoHasFocus: "none"
            })
          }}
        />
      </div>
    )
  }
}

我希望这对你有帮助。

关于javascript - 我对“焦点”事件和“模糊”事件有疑问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52605194/

10-11 12:48