【问题标题】:React-Bootstrap-TypeAhead giving error when trying to change already selected optionReact-Bootstrap-TypeAhead 在尝试更改已选择的选项时给出错误
【发布时间】:2021-06-28 14:05:49
【问题描述】:

所以我使用 react-bootstrap-typeahead 并且当我在搜索框中输入内容时它工作得很好。当我在搜索框中输入如下内容时,它会为我提供相关选项:

但是,当我选择其中一个选项然后尝试重新更改文本时,它会引发错误。这是我选择 1 个选项时的样子。

这是它抛出的错误:TypeError: 'Cannot read property 'match' of undefined'

这里是具有 Typeahead 的 Search 组件的状态:

 class Search extends Component {
state = {
    hcpName: [],
    hcps: [],
    searchName: '',
    isLoading: false,
    hcp_id: 101,
    searchSelectedOption: ''
}

这是我正在使用的 Typeahead:

   <div className='col-md-3'>
                    <div class="form-group">
                        <Typeahead
                            id="basic-example"
                            options={this.state.hcpName}
                            placeholder="Search by Name..."
                            emptyLabel={this.state.isLoading ?
                                <>
                                    <span>Searching...
                                        <Loader
                                            style={{ paddingLeft: '5px', display: 'inline' }}
                                            type="Circles"
                                            color="#0caf8d"
                                            height={15}
                                            width={20}
                                            radius={30}
                                        />
                                    </span>
                                </>
                                : ''}
                            isLoading={this.state.isLoading}
                            onInputChange={(searchName) => this.setState({ searchName }, () => {
                                {
                                    let nameValue = this.state.searchName;
                                    this.setState({ isLoading: true })
                                    axios.post('/get-hcp-data', {
                                        nameValue: nameValue
                                    })
                                        .then((res) => {
                                            const hcps = res.data;
                                            this.setState({ hcps: hcps, hcpName: Object.values(hcps.hcp_details_concat) })
                                            this.setState({ isLoading: false })
                                        }, (error) => {
                                            console.log(error);
                                        });
                                }
                            })}
                            onChange={(selectedOption) => {
                                console.log('selected option: ', selectedOption[0]);
                                console.log('npi id selected', selectedOption[0].replace(/(^.*\[|\].*$)/g, ''));
                                console.log('parsed npi id selected', parseInt(selectedOption[0].replace(/(^.*\[|\].*$)/g, '')[0]));
                                this.setState({hcp_id: parseInt(selectedOption[0].match(/[^[\]]+(?=])/g)[0])});
                            }}
                        />
                    </div>
                </div>

在 Typeahead 内的“onInputChange”内,我基本上是在用户每次输入按键后进行 api 调用。所以这就是为什么你可以在那里看到一个 axios 请求。在“onChange”中,我提取用户选择的方括号内的数字。

正如我所提到的,当我尝试更改已选择选项的文本时遇到错误。例如,假设我点击了 [101]Anna,我会在搜索栏中看到该文本。当我再次尝试修改它时,我立即看到一个错误。这可能是什么原因?

这是 onInput 更改的控制台日志:

【问题讨论】:

  • 如果有人对代码有任何疑问,请告诉我。
  • 在抛出错误的行中 selectedOption 包含什么?你能console.log吗?一般来说,一个 onChange 方法会给你一个事件对象,而不是一个数组。
  • selectedOption 包含 [101]Anna,我选择的选项。我认为问题在于使用匹配。当我删除匹配代码时,我发现没有问题。我基本上使用匹配和正则表达式从 [101] Anna 中提取数字“101”。你知道不使用匹配来提取该数字的方法吗?
  • 您的错误是说selectedOption[0] 未定义。您确定 selectedOption 是一个以字符串 [101]Anna 为第一个元素的数组吗?
  • 编辑了我的问题,我在其中添加了控制台日志代码和相应的屏幕截图。

标签: javascript reactjs axios typeahead.js react-bootstrap-typeahead


【解决方案1】:

我通过识别无法在 Typeahead 的 onChange 中使用 match/replace 函数来解决问题,因此我在获取 api 数据时直接使用它。为此,我首先根据用户选择的内容设置状态,如下所示:

  onChange={(selectedOption) => this.setState({ searchName: selectedOption }, () => {
                                console.log('selected option: ', selectedOption);
                            })}

然后在获取数据时,我利用 searchName 状态来运行替换功能。

  dataFetch = () => {
    this.setState({ receivedData: [], loading: true });
    let page_id = this.state.page_id;
    let hcp_id = parseInt(this.state.searchName[0].replace(/(^.*\[|\].*$)/g, ''));
    axios.post('/test-json', {
        page_id: page_id,
        hcp_id: hcp_id
    })
        .then((res) => {
            this.setState({ receivedData: res.data, loading: false });
            console.log('State after loading data: ', this.state);
        }, (error) => {
            this.setState({ error: true });
            console.log(error);
        });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多