Я все еще не так хорошо владею ReactJS, Ant Design, Sagas и Reducers, как я думал: <сильный > Я пытаюсь поддерживать / отлаживать одностраничное приложение, и я не уверен, какие файлы мне нужно настроить и как.
Цель состоит в том, чтобы добавить следующие <select>
в их render()
функцию в component.tsx
:
<Select showSearch
style={{ width: 150 }}
placeholder="Select entity"
// onChange={(e) => { this.handleSelectorChange("Entity", e) }} // to tackle later
// value={this.props.selectedEntity.toString()} // ------ " ------
>
<Option value="0">Option 0</Option>
{this.props.availableEntities.map((myEntity) =>
(<Option key={myEntity.Id.toString()}
value={myEntity.Id.toString()}>{myEntity.Name}</Option>))}
</Select>
В соответствующем container.tsx
я добавил:
const mapStateToProps = (state ) => ({
availableEntities: GeneralSelectors.getAvailableEntities(state),
});
Я получаю следующее: только Option 0
вместо всех сущностей (и даже не в том месте), см. Снимок экрана.
Как мне получить параметры выбора, динамически сгенерированные с использованием данных из API? Поскольку я не вижу вызываемого бэкенда (с помощью вкладки Сеть в моем отладчике Chrome), я предполагаю что-то не так с сагами, но это всего лишь гипотеза.
Справочная информация
Для другого одностраничного приложения (SPA) того же проекта, в котором уже есть <select>
внутри, я нашел urls.ts
, который выглядит следующим образом
import UrlMap from "../UrlMap"
import * as Actions from "./actions"
import * as GeneralActions from "../general/actions"
export const urls = [
new UrlMap("myWorkingSPA",
() => [
Actions.load(),
GeneralActions.loadEntities(),
Actions.loadDifferencePositions()
])
];
Я не знаю, где на самом деле вызывается этот файл и что мне нужно изменить, чтобы включить его.
В соответствующем actions.ts
работающем SPA я нахожу
export function loadEntities() : Action {
return {
type: LOAD_ENTITIES
}
}
Я не уверен, принимает ли мой СПА это actions.ts
или нет.
sagas.ts
одинаков для работающего SPA и для моего компонента:
function* loadEntities() {
const url = config.apiBaseUrl + "/api/Entities";
try {
const response: Response = yield fetch(url);
const json: Interfaces.Entity[] = yield response.json();
yield put(Actions.setEntities(json));
} catch (e) {
notification.error({ message: "Error", description: "Error loading Entities" });
}
}
function* watchLoadEntities() {
yield takeEvery(Actions.LOAD_ENTITIES, loadEntities);
}
Надеюсь, это не слишком много информации, но я предполагаю, что все это связано с проблемой.
GeneralSelectors.getAvailableEntities(state)
должен создать фрагмент магазина, который вам нужен для заполнения вашего<Select />
. Если вы отследите его, вы можете найти правильные действия, которые нужно отправить, чтобы получить вашу информацию. Что касается другого<Select />
компонента, выполняется ли вызов во время запуска приложения? Когда монтируется конкретный компонент? Вы можете узнать, когда на самом деле вызов. - person Clafou   schedule 20.02.2020