我有一个屏幕如下所示:

如您所见,这是显示来自用户的帖子。有数以百计的帖子。目前,我正在与类似的/不像系统。我有一个API来发送数据,并在数据库中执行类似/不一样的操作。问题是我如何在这里更新类似/不一样的状态?
假设一个帖子里有两个爱。有人把爱压在上面。API请求被发送到数据库,他/她成功地爱上了它。但是当屏幕显示“不喜欢”的情况时(例如,它的颜色是灰色的),我如何才能将特定的图标更新为“喜欢的”情况(例如,它现在应该是红色的)。
因此,我想知道是否有任何方法从其中的许多元素中选择一个特定的元素。我使用javascript编写了web版本,其中为每个图标设置了唯一的id,并使用'getElementById()‘方法更新了一个特定的图标。
我是新来的反应本地人,所以请原谅我的问题或想法。如果你认为你有更好的想法,你可以告诉我实现我想要的东西的不同方法。
提前感谢
发布于 2020-06-13 14:17:21
如果我对您的理解是正确的,请尝试使用而不是来获取HTML的id。每个心脏都是一个单独的组件,即一个函数或类,因此是单独的JavaScript对象。
一个很好的资源,可以帮助您理解和思考React官方站点这里上的组件概念。
所以每一张卡都有
<Card>
<Header>...with User avatar, name, posted time</Header>
<Comment>foo bar....</Comment>
<Heart /> // This render of heart will be a separate object to the next
// Render of heart on another card
</Card>重要然后在呈现“心脏”组件,您可以设置它的状态,然后只是改变状态按下。
//Using hooks
const [isLiked, setIsLiked] = useState(false);
// On mount call api if post is liked setIsLike(true)
function onPressOfHeart() {
// any Api calls
setIsLiked(!isLiked); // Update heart to be true
}
return (
<View>
<Image> source={isLiked ? colorPinkUrl : colorGreyUrl} </Image>
</View>
)如果不使用钩子,则可以从父类将道具true/false传递给心脏组件。
**编辑以反映你的零食
通过传递isLiked,这意味着父组件上的任何状态更改都将在子组件上刷新。我编写了一个简化版本,向您展示组件是如何单独维护状态的。
App.js
class App extends Component {
constructor(props) {
super(props);
this.state = {
data: [
{ isLiked: true, id: 12843 },
{ isLiked: false, id: 1267 },
{ isLiked: true, id: 154523 },
{ isLiked: false, id: 1256453 },
{ isLiked: false, id: 123454 },
],
isPress: false,
};
}
heartOnPress = (id) => {
// This OnPress would trigger your api call to Add/REmove like from user ?
// But for this example will directly manipulate state
this.setState((state) => {
const data = state.data.map((el) => {
if(el.id === id) {
el.isLiked = !el.isLiked;
}
return el;
});
const isPress = !state.isPress
return { data, isPress };
});
};
renderListItem = ({ item }) => {
return (
<View style={styles.card}>
<Text style={{ paddingRight: 10 }}>Press Me =></Text>
<Heart isLiked={item.isLiked} id={item.id} onPress={this.heartOnPress} />
</View>
);
};
render() {
return (
<View style={styles.container}>
<FlatList
style={{ width: '100%' }}
data={this.state.data}
keyExtractor={(item) => item.id}
renderItem={this.renderListItem}
/>
</View>
);
}
}Heart.js
const Heart = ({ isLiked, onPress, id }) => {
return (
<View>
{isLiked ? (
<TouchableOpacity onPress={() => onPress(id)}>
<Icon name="heart" size={30} color="red" />
</TouchableOpacity>
) : (
<TouchableOpacity onPress={() => onPress(id)}>
<Icon name="heart" size={30} color="grey" />
</TouchableOpacity>
)}
</View>
);
};https://stackoverflow.com/questions/62360027
复制相似问题