Кажется, я не могу понять, как заставить мою функцию обработки событий выполнять свою логику c, чтобы обновить дополнение UI AND storybook - actions()
для записи выходных данных.
Причина, по которой я хочу обновить пользовательский интерфейс, заключается в том, что мы используем cypress.io для тестирования. Мы взломали / заглушили обмен сообщениями о действиях (довольно круто, window.postMessage), чтобы получить доступ к сообщению действия, которое позволяет использовать action("functionName")
вместо подключения функции обработки событий в [file].stories.tsx
. Я хотел бы сделать оба для моего здравомыслия. Чтобы проверить действие сообщения, его несколько кликов. Я бы предпочел просто увидеть, как предмет был удален С этим, для тестирования, я хотел бы ожидать сообщения действия (я могу сделать это). Мы используем alert()
, чтобы проверить, не сработало ли что-то, и я не фанат.
Если это просто кажется ненужным или противоречит интуитивному / продуктивному, продолжайте в деталях.
Если это поможет ... <List />
это просто так, но на каждом элементе есть кнопка action , чтобы удалить элемент из списка.
Использование onRemove={actionHandler}
prop, ниже, в List, делает именно это в пользовательском интерфейсе, удаляет элемент, и Cypress счастлив, но для отслеживания требуется alert()
. Но не могу подключить action()
в любом месте и не войти в GUI.
Если УДАЛИТЬ onRemove={actionHandler}
и раскомментировать // onRemove: action("removeItem")
, я получаю необходимый журнал действий, но Предмет не удаляется.
Я понимаю, что действия должны имитировать c обработчики событий, но я бы хотел, чтобы это делалось И запускало фактическое событие ... если это возможно или разумно.
List.stories.tsx
// storybook addons
import { withKnobs } from "@storybook/addon-knobs";
// deps
import React from "react";
import { action } from "@storybook/addon-actions";
// utils
import { CustomEvent } from "../../hooks";
// components
import { Item } from "./Item"
import { List } from "./ListItems"
import { InputHeader } from "../inputs/InputHeader";
// create test states for target dropdown
export default {
component: List,
title: "Lists|With Action",
decorators: [withKnobs]
};
const listItemsData = {
values: ['Test Value 1', 'Test Value 2', 'Test Value 3', 'Test Value 4', 'Test Value 5'],
name: "test list story",
// onRemove: action("removeItem")
};
export const listWithActionButton = () => {
const [listItemState, setListItemState] = React.useState(listItemsData)
const actionHandler = (event: CustomEvent<string[]>) => {
// action("removeItem")()
setListItemState(prevState => ({
...listItemState,
values: event.target.value,
}))
};
return (
<>
<InputHeader headerText="List with Action Buttons" />
<br/>
<List
{...listItemState}
onRemove={actionHandler}
/>
</>
)
};
List.tsx
export const List = ({name, values, onRemove}) => {
const removeItem = (index: number) => {
// this is what I want to fire AS WELL as the action log.
const top = values.slice(0, index);
const bottom = values.slice(index + 1);
const updatedOptions = [...top, ...bottom]
// Fire a custom event to match what our useForm hook expects
const event: CustomEvent<string[]> = {
target: {
value: updatedOptions,
name
},
};
return onRemove(event);
};
return (
<ListStyle>
{
values.map((item, index) => {
return (
<Item
key={index}
value={item}
removeItem={removeItem}
itemIndex={index}
/>)
})
}
</ListStyle>
)
};