react-bootstrap-typeahead

Unable to see results with AsyncTypeahead with multiple option and renderInput


I'm trying to use a custom Input component on a Typeahead with the multiple option set. I see in the docs it says to "handle the refs" correctly, but I see no examples of how this is done. I'm not sure what to pass into referenceElementRef. Everything I've tried so far just doesn't render the options as I type. I see them in the DOM, but the opacity of the .rbt-menu is set to 0, so they're basically hidden.

Here's my code so far:

const divRef = React.useRef(null);
  return (
    <Col>
      <div ref={divRef}>
        <span className="uppercase">
          <FormattedMessage id="d.customer" defaultMessage="Customer" tagName="h4" />
        </span>
        <AsyncTypeahead
          multiple
          id="customer-filter-input"
          inputProps={{
            'aria-label': 'Customer search',
            style: { fontSize: '14px' },
          }}
          key={'customer-input'}
          minLength={4}
          isLoading={props.isLoadingcustomersSuggestions}
          delay={300}
          onSearch={(term: string) => handleFilterInputs(term, 'customers')}
          size={'lg'}
          options={dataSource}
          labelKey={'defaultMessage'}
          placeholder={intl.formatMessage({
            id: 'companyName',
            defaultMessage: 'Company name',
          })}
          onChange={(filterItem: any) => handleAutocompleteUpdate(filterItem, 'customer')}

          renderInput={({ inputRef, referenceElementRef, ...inputProps }: any) => (
            <Input
              {...inputProps}
              style={{ position: 'relative' }}
              ref={(input: any) => {
                inputRef(input);
                referenceElementRef(divRef); // What do I put here?
              }}
            />
          )}
        />
      </div>

    </Col>
  );

And this is what renders in the DOM after I type in the Typeahead and get results: enter image description here

Any ideas or working examples of Typeahead using multiple and renderInput together?

EDIT: Here's a codesandbox of what I'm seeing. I also see that the problem is also happening when multiple is NOT set. It seems to be an issue with using renderInput. Is it required that I also use renderMenu?

https://codesandbox.io/s/react-bootstrap-typeahead-async-pagination-example-forked-3kz3z


Solution

  • If you upgrade the typeahead version in your sandbox to the latest version (v5.1.1) and pass the input element to referenceElementRef, it works (note that you need to type some characters into the input for the menu to appear):

    // v5.0 or later
    renderInput={({ inputRef, referenceElementRef, ...inputProps }) => (
      <Input
        {...inputProps}
        ref={(input) => {
          inputRef(input);
          referenceElementRef(input);
        }}
      />
    )}
    

    The menu is rendered in relation to the referenceElementRef node by react-popper. In most common cases, the reference node will be the input itself. The reason there's both an inputRef and a referenceElementRef is for more complex cases (like multi-selection) where the menu needs to be rendered in relation to a container element around the input.

    If using v4 of the component, the approach is similar, but the ref to use is simply called ref:

    // v4
    renderInput={({ inputRef, ref, ...inputProps }) => (
      <Input
        {...inputProps}
        ref={(input) => {
          inputRef(input);
          ref(input);
        }}
      />
    )}