У меня есть этот дочерний компонент с именем TodoList
const TodoItem = ({ checked, children }) =>
(<TouchableOpacity
style={{ backgroundColor: checked && 'red'}}>
{children}
</TouchableOpacity>
);
const TodoList = props => {
const {
options = [],
onSelect,
...rest
} = props;
const [selectedOptionIndex, setSelectedOptionIndex] = useState(null);
useEffect(() => {
onSelect(options[selectedOptionIndex]);
}, [onSelect, options, selectedOptionIndex]);
const renderItem = (o, index) => {
return (
<TodoItem
key={o + index}
onPress={() => setSelectedOptionIndex(index)}
checked={index === selectedOptionIndex}>
{index === selectedOptionIndex && <Tick />}
<Text>{o}</Text>
</TodoItem>
);
};
return (
<View {...rest}>{options.map(renderItem)}</View>
);
};
export default TodoList;
И у меня есть родительский компонент с именем Container
export default function() {
const [item, setItem] = setState(null);
return (
<Screen>
<TodoList options={[1,2,3]} onSelect={(i) => setItem(i)} />
</Screen>
)
}
Я хочу получить обратный вызов от дочернего компонента кродительский компонент, использующий onSelect
всякий раз, когда выбран TodoItem
.Однако всякий раз, когда вызывается onSelect
, мой TodoList
перерисовывается, а мой selectedOptionIndex
сбрасывается.Следовательно, мой флаг checked
изменится на true
только кратко до сброса на false
.
Если я уберу обратный вызов onSelect
, он будет работать нормально.Но мне нужно setState
для ребенка и родителя.Как мне это сделать?