Как вызвать установщик useState внутри функции рабочего листа?
Я пытаюсь вызвать функцию установки React useState из функции рабочего листа. Этот обратный вызов предоставляется пакетом https://github.com/mgcrea/react-native-dnd , который предоставляет событие onDragEnd.
Я нашел другие ответы SO , предлагающие использовать runOnJS из реакции-родной-реанимации для запуска JS-кода из потока пользовательского интерфейса (эта функция ворлета). Но консоль регистрируется внутриrunOnJS
и в самой функции рендеринга не обновляется, когдаhandleDragEnd
излучает.
Что нужно изменить, чтобы вызвать установщик useState внутри функции рабочего листа?
Ниже приведен фрагмент, показывающий рабочий лист и некоторые функции рендеринга:
import {runOnJS} from 'react-native-reanimated';
const handleDragEnd: DndProviderProps['onDragEnd'] = ({active, over}) => {
'worklet';
if (over) {
console.log('onDragEnd', {active, over});
console.log(active);
// Create a new item based on the type of the dragged item
const newItem = {
partName: `${active.id.split('-')[0]}`,
};
runOnJS(() => {
// Add the new item to ductItems
setDuctItems((prevDuctItems) => {
const updatedDuctItems = [...prevDuctItems, newItem];
console.log('Updated ductItems:', updatedDuctItems);
return updatedDuctItems;
});
});
dynamicData.value = {
over: over,
};
}
};
return (
<GestureHandlerRootView>
<View style={styles.container}>
<DndProvider
onDragEnd={handleDragEnd}
>
<Droppable id="drop" style={styles.dropBox}>
<Text>DROP</Text>
</Droppable>
<View style={styles.partsContainer}>
<Text>{JSON.stringify(ductItems)}</Text>
{ductItems.map((item, index) => (
<DraggableCustomComponent
style={styles.partItem}
id={`${item.partName}-${index}-key`}
key={`${item.partName}-${index}-key`}
partType={item.partName}
data={dynamicData}
/>
))}
</View>
</DndProvider>
);
1 ответ
Проблема заключалась в том, что я неправильно вызывал runOnJs в соответствии с реанимированной документацией . Функция использует шаблон «каррирования», который принимает аргументы в качестве последнего параметра:
const replaceDuctPart = (item: {partName: string}) => {
setDuctItems((prevDuctItems) => {
const updatedDuctItems = [...prevDuctItems, item];
console.log('Updated ductItems:', updatedDuctItems);
return updatedDuctItems;
});
};
runOnJS(replaceDuctPart)(newItem);