react-dadata icon indicating copy to clipboard operation
react-dadata copied to clipboard

Способ отображения выбранной строки с адресом

Open alexbom opened this issue 5 years ago • 3 comments

Добрый день! Скажите, пожалуйста, есть ли возможность настроить вид выбранного значения в выпадающем списке AddressSuggestions? Сейчас при выборе города из выпадающего списка выбранный элемент отображается так:

Краснодарский край, г Геленджик

или так:

г Москва

Я бы хотел настроить способ отображения, чтобы показывать только название города:

Геленджик

или:

Москва

Можно ли это реализовать с помощью опций компонента?

alexbom avatar Aug 05 '20 08:08 alexbom

Добрый день!

Да, вы можете в пропсах компонента прокинуть коллбек renderOption - функция, которая принимает один аргумент - объект подсказки, и должна вернуть любой JSX, который будет отображаться

import React, { useRef } from 'react';
import { AddressSuggestions } from 'react-dadata';

// Как то так, можно возвращать любую верстку, например с расширенными данными, как угодно
<AddressSuggestions
  renderOption={(suggestion) => (<span>{suggestion.data.city}</span>)}
/>

Единственный момент, что в таком случае не будет доступно выделение совпадений. Вообще можно воспользоваться пакетом react-words-highlight, который внутренне используется для этого, но в настоящий момент в колбеке нет информации какой запрос вообще сейчас введен в поле. Но - можно его хранить в стейте, сохраняя его в inputProps={{ onChange: (event) => { /** Тут сохраняем значение из поля ввода */} }}

vitalybaev avatar Aug 06 '20 12:08 vitalybaev

Я выразился неточно. Опции в выпадающем списке выглядят хорошо. Но необходимо убрать лишнее в выбранном элементе, когда Select уже свёрнут. Когда опция выбрана, хотелось бы видеть только название города.

alexbom avatar Aug 06 '20 12:08 alexbom

Тогда сложнее, просто менять значение в поле вводе не очень хорошая идея поскольку при редактировании значения его текст используется для подгрузки вариантов Как вариант решения - хранить в стейте выбранную подсказку, подписаться на события инпута onBlur и onFocus. При onBlur - используя метод setInputValue ставим туда нужное обрезанное значение. При onFocus - возвращаем полное. Это чисто мысли вслух, но вроде бы может сработать в вашем варианте.

А саму подсказку нужно полную с адресом? Не подойдет ограничение области поиска от самой DaData?

vitalybaev avatar Aug 06 '20 19:08 vitalybaev