#javascript #reactjs #typescript #ecmascript-6 #react-router-dom
Вопрос:
В Python вы можете сделать такую вещь:
string_to_format = "Hey {name}"
formatted_string = string_to_format.format(name="John")
print(formatted_string)
Результатом было бы:
Hey John
Я хочу сделать то же самое в React. Я знаю о f-строках в Python и их эквиваленте в ES6, но это не так, потому что для определения f-строк требуется переменная, которая помещается в строку. Мой вариант использования таков:
- передайте строку как
/user/{userName}/details
компоненту - компонент создает таблицу, в которой каждая строка доступна для клика (
<Link to={...} />
), а путь определяется значением в столбце некоторой строки
Так, например, для строки типа:
foo 1234
Путь будет таким: /user/foo/details
. Вы можете видеть закономерность.
Поэтому, как я уже упоминал, я не могу отформатировать строку перед передачей ее компоненту, потому что она должна быть отформатирована глубоко в функции визуализации этого дочернего компонента, как в map
инструкции.
Есть ли способ сделать это в React?
P. S Я использую машинописный текст
@Редактировать:
Это то, что я действительно хочу сделать:
У меня есть общий PaginatedTable
компонент. Он принимает columns
и rows
перечисляет конфигурацию в качестве реквизита.
Конфигурация выглядит следующим образом:
interface RowClickConfig {
rowKey: string;
to: string;
}
Итак, теперь to
вставляется Link
( import { Link } from "react-router-dom";
, так что из react-router-dom
, а не из MUI или что-то в этом роде). И обычно, если бы у меня была одна таблица, мне не пришлось бы этого делать, потому to
что можно было бы указать, где у меня на самом деле есть переменная, которую я хочу в нее поместить /user/${userName}/details
. Но поскольку это общая таблица, эти to
значения будут отличаться, потому что в одной таблице будут пользователи, и каждый щелчок по строке будет переходить на другую страницу с другим пользователем, но если я захочу повторно использовать эту таблицу для, я не знаю, элементов, тогда to
будет /items/${itemId}
или что-то в этом роде.
Поэтому, когда я создаю эту опору конфигурации и передаю ее своему компоненту таблицы, у меня нет определения переменной, которая будет помещена в to
поле. Я хочу, чтобы это был заполнитель, как в Python, чтобы позже я мог заменить его чем-то вроде .format(userName="foo")
.
Комментарии:
1. вы можете использовать литералы шаблона es6 (строки шаблона).
2. Забыл упомянуть, что я использую машинописный текст. Когда я это делаю, я получаю:
Cannot find name 'userName'. ts(2304)
3. Звучит так, как будто
userName
он не определен для использования.4. @Nur OP хочет, чтобы строка была определена в формате, прежде чем динамически заменять переменные позже. ОП, я не думаю, что есть собственный способ сделать это. Возможно, вы захотите изучить такие пакеты, как
string-template
5. @dabljues, вы можете использовать эту библиотеку пути к регулярному выражению для более предварительного использования…
Ответ №1:
Вы можете импортировать generatePath из react-router-dom
и сделать что-то очень близкое.
import { generatePath } from "react-router";
...
const pathTemplate = "/user/:userName/details";
...
const path = generatePath(pathTemplate, { userName: 'Drew' }); // "/user/Drew/details"
Комментарии:
1. Существуют также пакеты
string-template
, такие какsprintf-kit
,string-kit
, и т.д. Это первые, которые я нашел в NPM. Но поскольку OP используетreact-router-dom
(и, соответственно,react-router
), это, вероятно, то решение, которое он хочет.2. Этот. Вот что я имел в виду! Большое вам спасибо, работает великолепно. @j1mbl3s, также спасибо, что указали на них