React - Internet Explorer 11 输入在第一次 onchange 后失去焦点

2024-01-28

我遇到了一个非常奇怪的问题,我无法理解。 我目前正在使用 React 16.3 和 Antd 3.11 框架使用 create-react-app,并且我创建了一个表,该表在其标题列内呈现一个附加了 onChange 事件的组件。

当我第一次关注输入时,问题就出现了。

我失去了对第一个关键事件的焦点,之后当我再次单击该字段时,它会保持焦点,直到我单击其他事件。

这是我一直在使用的示例:https://ant.design/components/table/ https://ant.design/components/table/

以及下面的代码。

import {
  Table, Input, Button, Icon,
} from 'antd';

const data = [{
  key: '1',
  name: 'John Brown',
  age: 32,
  address: 'New York No. 1 Lake Park',
}, {
  key: '2',
  name: 'Joe Black',
  age: 42,
  address: 'London No. 1 Lake Park',
}, {
  key: '3',
  name: 'Jim Green',
  age: 32,
  address: 'Sidney No. 1 Lake Park',
}, {
  key: '4',
  name: 'Jim Red',
  age: 32,
  address: 'London No. 2 Lake Park',
}];

class App extends React.Component {
  state = {
    searchText: '',
  };

  handleSearch = (selectedKeys, confirm) => () => {
    confirm();
    this.setState({ searchText: selectedKeys[0] });
  }

  handleReset = clearFilters => () => {
    clearFilters();
    this.setState({ searchText: '' });
  }

  render() {
    const columns = [{
      title: 'Name',
      dataIndex: 'name',
      key: 'name',
      filterDropdown: ({
        setSelectedKeys, selectedKeys, confirm, clearFilters,
      }) => (
        <div className="custom-filter-dropdown">
          <Input
            ref={ele => this.searchInput = ele}
            placeholder="Search name"
            value={selectedKeys[0]}
            onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
            onPressEnter={this.handleSearch(selectedKeys, confirm)}
          />
          <Button type="primary" onClick={this.handleSearch(selectedKeys, confirm)}>Search</Button>
          <Button onClick={this.handleReset(clearFilters)}>Reset</Button>
        </div>
      ),
      filterIcon: filtered => <Icon type="smile-o" style={{ color: filtered ? '#108ee9' : '#aaa' }} />,
      onFilter: (value, record) => record.name.toLowerCase().includes(value.toLowerCase()),
      onFilterDropdownVisibleChange: (visible) => {
        if (visible) {
          setTimeout(() => {
            this.searchInput.focus();
          });
        }
      },
      render: (text) => {
        const { searchText } = this.state;
        return searchText ? (
          <span>
            {text.split(new RegExp(`(${searchText})`, 'gi')).map((fragment, i) => (
              fragment.toLowerCase() === searchText.toLowerCase()
                ? <span key={i} className="highlight">{fragment}</span> : fragment // eslint-disable-line
            ))}
          </span>
        ) : text;
      },
    }, {
      title: 'Age',
      dataIndex: 'age',
      key: 'age',
    }, {
      title: 'Address',
      dataIndex: 'address',
      key: 'address',
      filters: [{
        text: 'London',
        value: 'London',
      }, {
        text: 'New York',
        value: 'New York',
      }],
      onFilter: (value, record) => record.address.indexOf(value) === 0,
    }];
    return <Table columns={columns} dataSource={data} />;
  }
}

ReactDOM.render(<App />, mountNode);

以及随后的 css:

.custom-filter-dropdown {
  padding: 8px;
  border-radius: 6px;
  background: #fff;
  box-shadow: 0 1px 6px rgba(0, 0, 0, .2);
}

.custom-filter-dropdown input {
  width: 130px;
  margin-right: 8px;
}

.custom-filter-dropdown button {
  margin-right: 8px;
}

.highlight {
  color: #f50;
}

快速总结我所理解的事情。

  • 该表重新渲染每个过滤器上的filterDropDown属性和filterIcon 击键。
  • 表所在的类组件不会重新渲染或 触发器(componentDidUpdate)
  • 这在 Chrome、FireFox、Edge 中完美运行,并且示例在 antds 网站上的 IE11。但不在我的应用程序中。
  • 我自己的组件中渲染的所有 antd 字段和常规字段在任何浏览器中都不存在此问题。
  • 在渲染函数之外渲染输入组件不会 工作,因为不是我的组件重新渲染它是表组件触发它自己的更新事件
  • 我还尝试将 -ms-user-select: 设置更改为不同的属性,以查看天气是否有效。事实上,这只会让事情变得更糟。
  • 我尝试将输入值设置为状态值以使其成为受控组件,但是当 componentDidUpdate 触发并且我以编程方式在输入上设置 .focus 时,它会设置 caretIndex lenght-1 而不是后面的文本。 (我手动尝试覆盖 SelectionStart 和 SelectionEnd 但没有成功

我有点没有想法了,因为我了解到其他一些组件正在窃取我的输入框的焦点,但是即使我使用过,我也无法找到该元素 我能想到的几乎所有方法和生命周期事件中都有 document.activeElement 。所有事件都指向具有焦点的“a”输入字段(不确定这是创建的旧输入字段还是新输入字段,但我认为它是旧输入字段)。

我已尽力解释我的情况,我希望世界上有人遇到过类似的问题。

UPDATE: antd 合理地更改了他们的表格组件,因此网页上的示例有点不同,但问题仍然相同。


我在 IE11 上也有同样的行为。

可以通过输入字段上的附加 onBlur 来修复它,只需将焦点设置到 currentTarget 即可。

onBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {
    e.currentTarget.focus();
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React - Internet Explorer 11 输入在第一次 onchange 后失去焦点 的相关文章

随机推荐

  • Matlab:“分组平均值”

    假设我有向量 y 1 1 01 1 02 1 03 2 2 01 2 02 3 3 01 3 02 3 03 c 0 0 0 0 1 1 1 2 2 2 2 有没有一种矢量化的方法来获得 分组平均值 即平均值y对于每个唯一值c 这是一个简化
  • 为什么 Pip 忽略具有嵌套依赖项的配置存储库?

    Problem 假设我在 Linux 机器上有一个完全空的 Python Pip R pip 19 3 1 环境 并且我想安装该包rpy2与点 由于我位于公司防火墙后面 因此我将 pip 配置为使用私有存储库 global index ur
  • flutter 从文件路径打开图像

    我在用image picker从图库中获取一些图像 我将图像的路径保存在列表中 例如 private var mobile Containers Data Application E633FB78 77D3 4913 B37A 496BFB
  • 如何使用返回http承诺的Angular 2服务

    我在这里遇到了 Angular 2 的问题 我使用返回承诺的服务 但是当我尝试检索响应时出现错误 我读到了这个这个静态问题 https stackoverflow com questions 40009397 angular 2 http
  • Spark on 纱线概念理解

    我试图了解 Spark 如何在 YARN 集群 客户端上运行 我心里有以下问题 是否需要在yarn集群的所有节点上都安装spark 我认为应该是因为集群中的工作节点执行任务并且应该能够解码由驱动程序发送到集群的 Spark 应用程序中的代码
  • C# 将 datagridview 绑定到表单与控件中的数据表

    我有以下代码 DataGridView lGrid new DataGridView BindingSource bind new BindingSource DataTable Table new DataTable this Contr
  • 在C++中将派生类指针分配给基类指针

    我有以下 class base class derived public base public derived void myFunc cout lt lt My derived function lt lt std endl 我现在有
  • 在 Next.js 中设计持久布局

    我正在经历this https adamwathan me 2019 10 17 persistent layout patterns in nextjs 文章 我试图弄清楚在选项 4 中持久性应该如何发生 据我所知 您需要为每个页面重新定
  • System.Diagnostics.Debug 命名空间与其他日志记录解决方案(log4net、MS Enterprise Library 等)

    我目前正在研究 net 项目的各种日志记录可能性 但我无法在 System Diagnostics Debug Trace 功能和第三方库 如 log4net MS Enterprise Library NLog 等 之间做出决定 目前我已
  • 无法在 SQL Server 2008 中插入字符“≤”

    我有一个 SQL Server 2008 数据库和一个nvarchar 256 表的字段 疯狂的问题是当我运行这个查询时 update ruds values short text set value asjdklasd where rud
  • 的解释

    我刚刚偶然发现了一些我以前从未见过的东西 在里面Backbone js 示例 TODO 应用程序的来源 https github com jashkenas backbone blob master examples todos index
  • 将 [0,1] 区间扩展到 [a,b] 的正确方法是什么?

    许多随机数生成器返回 0 到 1 之间的浮点数 最好 正确的获取方式是什么integers之间a and b 将区间 0 1 划分为 B A 1 个 bin 示例 A 2 B 5 0 1 4 1 2 3 4 1 Maps to 2 3 4
  • matplotlib 标题中的 Latex 和文本

    我试图显示一个带有标题的图像 该标题将普通文本与几个 Latex 命令结合起来 plt imshow w1subtracted2 origin lower extent l max l max b max b max cmap color
  • 将 Unity 与 Eclipse 集成 - 通信?

    我通过以下步骤做到了 集成 Unity 和 Eclipse http forum unity3d com threads 71607 Integrating Unity and Eclipse 我可以使用 Android SDK 或 NDK
  • 带重定向的python请求

    正在尝试进行身份验证http 72 ru http 72 ru网站 注意到有一个重定向到https loginka ru auth https loginka ru auth 发现有 302 个带有数据形式的纯凭证的 POST 从 Chro
  • numpy.einsum 与 Fortran 或 C 相比是否高效?

    我写了一个 numpy 程序 非常耗时 经过profiling 我发现大部分时间都花在了numpy einsum 虽然numpy是LAPACK或BLAS的包装 但我不知道是否numpy einsum的性能与 LAPACK 或 BLAS 中的
  • 将 OS X Bash 脚本翻译为 Windows

    I use Hedge https hedge video 转移幻灯 https www magiclantern fm 在我的 Canon 5D Mark III 上拍摄的视频文件 在 OS X 上 我可以使用 Automator 设置
  • Xamarin iOS Javascript 和 C# 之间的通信

    我们正在实现一个应用程序 我们可以在 Javascript 和 C 之间进行通信 我们的 UIWebView 有一个按钮来调用一些本机功能 在 UIWebView 上 我在 ShouldStartLoad 上有一个处理程序 webView
  • Bake工具看不到SQLite3数据库中的表

    我正在尝试使用 CakePHP 2 1 1 使用 SQLite3 作为数据库构建一个简单的应用程序 为了节省时间 我尝试使用烘焙工具为下表创建模型 CREATE TABLE animals id integer primary key au
  • React - Internet Explorer 11 输入在第一次 onchange 后失去焦点

    我遇到了一个非常奇怪的问题 我无法理解 我目前正在使用 React 16 3 和 Antd 3 11 框架使用 create react app 并且我创建了一个表 该表在其标题列内呈现一个附加了 onChange 事件的组件 当我第一次关