Я использую реагирующий редукс с реагирующим родным, у меня есть плоский список фотографий. Когда я нажимаю кнопку «Мне нравится», я хочу обновить только одну фотографию в плоском списке. Следующий код, кажется, работает, и статус фотографии, как, обновляется, но каким-то образом мой канал испортился после обновления. До обновления this.props.feed[index]
- это отдельный объект, после обновления this.props.feed[index]
становится массивом объектов, что я делаю не так? Я получил идею от: https://stackoverflow.com/a/47651395/10906478
Но также кажется неэффективным циклически перебирать все элементы плоского списка, чтобы найти тот, который соответствует переданному в photoId. Есть ли лучший способ?
Экран:
toggleLike = async(photoId, index) => {
console.log("before: ", this.props.feed[index]);
await this.props.toggleLike(photoId);
console.log("after: ", this.props.feed[index]);
}
...
<FlatList
data = {this.props.feed}
keyExtractor = {(_, index) => index.toString()}
renderItem = {({item, index}) => (
<View key={index}>
<TouchableOpacity onPress={()=> this.toggleLike(item.photoId, index)}>
<Text>Button</Text>
</TouchableOpacity>
</View>
)}
/>
Действие
export const toggleLike = (photoId) => async(dispatch) => {
dispatch({type: "UPDATE_ITEM", photoId: photoId})
}
Переходник
export default (state = initialState, action) => {
switch(action.type) {
case "UPDATE_ITEM":
return {...state, feed: [state.feed.map((item,_) => {
if (item.photoId === action.photoId) {
return { ...item, liked: !item.liked };
}
return { ...item };
})]};
// other cases