javascript - 反应原生的多个开关如何
问题描述
我正在尝试进行多个开关,问题是当我启用/禁用 1 时,所有其他开关一起启用/禁用。
我正在使用 useEffect 从我的 API 中获取数据。
const [data, setData] = useState([]);
useEffect(() => {
async function fetchData() {
await api
.get('/synchronization/group/true')
.then(response => setData(response.data.data))
.catch(error => setData(error));
}
fetchData();
}, []);
useEffect(() => {
// Just return data
}, [data]);
const [isEnabled, setIsEnabled] = useState({
enabled: false
});
const toggleSwitch = () => setIsEnabled((toggle) => !toggle);
const Item = ({ id, title }) => {
return (
<View>
<TextList>{title}</TextList>
<Switch
key={id}
onValueChange={toggleSwitch}
value={isEnabled}
/>
</View>
);
};
在这里我的渲染切换循环,它根据数据库中的记录添加组件
const renderItem = ({ item }) => {
const date = new Date(item.synchronization)
const formattedDate = date.toISOString().split('T')[0];
return <Item id={item.id} title={'Sincronização: ' + formattedDate.split('-').reverse().join('/')} />
};
return (
<Container>
<List
data={data}
renderItem={renderItem}
keyExtractor={item => item.id.toString()}
/>
<TouchableButton onPress={() => { navigation.navigate('Loading') }}>
<TextButton>Carregar para offline</TextButton>
</TouchableButton>
</Container>
);
}
我的屏幕:
解决方案
如果我理解正确,您提供的所有代码都在一个组件中。您需要单独存储开关按钮的状态。
试试看:
const Item = ({id, title, value, onValueChange}) => (
<View>
<TextList>{title}</TextList>
<Switch
onValueChange={onValueChange}
value={value}
/>
</View>
);
const Component = ({navigation}) => {
const [data, setData] = useState([]);
useEffect(() => {
const fetchData = async () => {
await api
.get('/synchronization/group/true')
.then(response => setData(response.data.data))
.catch(error => setData(error));
}
fetchData();
}, []);
useEffect(() => {
// Just return data
}, [data]);
const [state, setState] = useState({
switches: {}
});
const toggleSwitch = useCallback((id) => () => setState((state) => ({
...state,
switches: {
...state.switches,
[id]: !state.switches[id]
}
})), []);
const renderItem = useCallback(({item}) => {
const date = new Date(item.synchronization)
const formattedDate = date.toISOString().split('T')[0];
return <Item id={item.id} title={'Sincronização: ' + formattedDate.split('-').reverse().join('/')} value={!!state.switches[item.id]} onValueChange={toggleSwitch(item.id)}/>
}, [state.switches, toggleSwitch]);
return (
<Container>
<List
data={data}
renderItem={renderItem}
keyExtractor={item => item.id.toString()}
/>
<TouchableButton onPress={() => navigation.navigate('Loading')}>
<TextButton>Carregar para offline</TextButton>
</TouchableButton>
</Container>
);
};
推荐阅读
- c++ - 如何将 Qt 中的组合框元素与具有相同索引的静态向量中的预定义元素链接?
- python - 根据 for 循环中的位置将直方图存储在一个大数组中
- jquery - 触发事件时,ajax调用后创建的按钮不起作用
- git - 回到以前的状态,但也将所有下一次提交记录在日志中
- html - 如何将我的列表项放在下一个打开的行上?
- python - 如何在 Flask Python 中渲染模板然后重定向到外部 URL
- c - 如何在C中创建一个指向NULL的指针数组?
- pandas - 将熊猫数据框中的一列列表扩展为单列的快速方法
- flask - Celery + SQS 两次接收相同的任务,同时具有相同的任务 ID
- c# - 无法从索引像素格式创建再现图形对象