React-Internet Explorer 11的输入在首次更改后失去焦点

时间:2018-12-14 13:21:24

标签: javascript reactjs create-react-app antd

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

问题是我第一次关注输入时出现的。

我失去了对第一个关键事件的关注,此后再次单击该字段时,它将一直保持焦点,直到我单击其他内容为止。

这是我一直在使用的示例: 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中完美运行,示例在 ants网站上的IE11。但是不在我的应用程序中。
  • 在我自己的组件中呈现的所有antd字段和常规字段在任何浏览器中都没有此问题。
  • 在渲染功能之外渲染输入组件不会 之所以有效,是因为不是由我的组件来提供它,而是由表组件触发了自己的更新事件
  • 我还尝试将-ms-user-select:设置更改为不同的属性,以查看天气是否有效。事实上,这只会使情况变得更糟。
  • 我试图将输入值设置为状态值以使其成为受控组件,但是当componentDidUpdate触发并且以编程方式在我的输入上设置.focus时,它将设置caretIndex lenght-1而不是后面的文本。 (我手动尝试覆盖selectionStart和SelectionEnd,但是没有成功

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

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

更新: antd合理地更改了其表组件,因此该示例在网页上有所不同,但是问题仍然相同。

1 个答案:

答案 0 :(得分:1)

我在IE11上有相同的行为。

可以通过在Input字段上附加onBlur来解决此问题,只需将焦点设置为currentTarget。

onBlurHandler = (e: React.FocusEvent<HTMLInputElement>) => {
    e.currentTarget.focus();
};