react-native - ReactNative:收到新数据时如何更新 ScrollView 内容
问题描述
这可能是一个菜鸟问题,但相信我,我已经到处搜索了,为了我的一生,我似乎无法解决或找到解决这个问题的资源。
我的问题很简单,我有一个按钮,按下时会从设备打开一个图像选择器。我还有一个 ScrollView,理想情况下,它应该包含我从设备中挑选的所有图像。
所以我想做的是:选择一个图像,然后在 ScrollView 上显示该图像。只要图像在启动时可用, ScrollView 本身就可以显示图像,但我希望能够在从图库中选择图像时添加图像。
我尝试使用状态对象,但无论出于何种原因,滚动视图都没有更新。
这是相关的选择器代码:
const addAsset = () => {
const options = {
title: title,
customButtons: [],
storageOptions: {
skipBackup: true,
path: '../../assets/imgs',
},
};
ImagePicker.showImagePicker(options, (response) => {
// console.log('Response = ', response);
if (response.didCancel) {
console.log('User cancelled image picker');
} else if (response.error) {
console.log('ImagePicker Error: ', response.error);
} else if (response.customButton) {
console.log('User tapped custom button: ', response.customButton);
alert(response.customButton);
} else {
let oldSource = dataSource;
// oldSource.push(response.uri)
dataSource.push({
id: 4,
image: response.uri
})
// setDataSource(oldSource) //update state to update Image
// console.log(dataSource)
}
});
}
最小的 ImageView 对象:
const ImageView = (key, src) => {
return (
// Flat List Item
<View key={src.id} style={{padding: 10}}>
<Image source={src.image}/>
</View>
);
};
在 ScrollView 上,我尝试了:
<ScrollView horizontal style={styles.assetsWrapper}>
{dataSource.map(ItemView)}
</ScrollView>
对于那些想知道的人来说,数据源看起来像这样:
const [dataSource, setDataSource] = useState([]);
解决方案
试试这个..我保持简单,您可以根据需要更改
...
else {
let oldSource = [...dataSource];
dataSource.push(image)
setDataSource(oldSource)
}
//////////
<ScrollView horizontal style={styles.assetsWrapper}>
{dataSource.map((item, index) => (
<ImageView key={index} image={item} />
))}
</ScrollView>
////////
const ImageView = ({image}) => {
return (
// Flat List Item
<View style={{padding: 10}}>
<Image source={image}/>
</View>
);
};
推荐阅读
- javascript - 无法获取函数参数javascript
- c# - 使用 Nominatim API 的反向地理编码不起作用
- php - 使用 laravel 连接查询
- hyperledger-composer - 订阅 Composer v0.19.12 上的事件
- javascript - 在 RxDb 中转储单个文档
- ruby-on-rails - Rspec 测试退出
- excel - 带有 Application.OnTime 的宏仅在打开工作表时有效
- python - 使用一个值在另一个输入字段 Tkinter Python 中使用
- ruby-on-rails - Rails 中公共目录中的文件 - Errno::ENOENT(没有这样的文件或目录 @ rb_sysopen
- .net - 按顺序从一串值中更改多个 ComboBoxes 的 SelectedIndex