反应原生的增量值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反应原生的增量值相关的知识,希望对你有一定的参考价值。

我从有效载荷中获取数据,每个帖子上都有喜欢的总数。在用户屏幕上,有一个用户喜欢帖子的图标,我想要实现的是当用户点击它时,显示的值会增加到加1对特定帖子

视图:


  posts.map((item, i) => 
    return (
      <View key=i style=styles.user>
        <Card>

          <ListItem
            titleStyle= color: '#36c', fontWeight:'500' 
            titleNumberOfLines=2
            hideChevron=false
            roundAvatar
            title=item.headline
            avatar=uri:'https://s3.amazonaws.com/uifaces/faces/twitter/brynn/128.jpg'
          />

          <Text style=marginBottom: 10, fontSize:16, color:'#4a4a4a', fontFamily:'HelveticaNeue-Light'>
            item.text
          </Text>

          <TouchableOpacity style=styles.likeContainer>
            <Text style=fontSize:14>item.likesCount"\n"</Text>
            <Icon
              onPress=()=>onLikePost(item)
              name='md-thumbs-up'
              type='ionicon'
              iconStyle=[(item.isLiked=== true) ? styles.likedColor : styles.unLikedColor]
            />
          </TouchableOpacity>
        </Card>
      </View>
    );
  )

容器:

state = 
  posts : [],
  id: '',
  user: ''


componentDidMount = () => 
  const  navigation  = this.props;
  this.setState(
    id : navigation.getParam('id'), 
    user: navigation.getParam('user')
  , ()=> this.getData())


getData = () => 
  const api = create(
    baseURL: 'https://url.com/api',
    headers: 'Accept': 'application/json'
  );
  api.get('/groups/'+`$this.state.groupID`+'/posts').then((response) => 
    let data = response.data.data
    this.setState( posts: data );
    console.log(JSON.stringify(this.state.posts))
  )


onLikePost = (item) => 
  item.likeCount = item.likeCount+1

答案

您正在将状态变量存储在状态变量中,因此请使用setState对其进行更新。使用map并检查每个帖子,每当id(每个帖子的唯一属性)与所点击的项目的id匹配时,增加其likesCount否则返回相同的数据。

写这样:

onLikePost = (item) => 
  this.setState(prevState => (
    posts: prevState.posts.map(el => el.id === item.id? ...el, likesCount: el.likesCount+1 : el)
  ))

更新:在更新计数值之前进行检查并更改isLiked bool

onLikePost = (item) => 
  this.setState(prevState => (
    posts: prevState.posts.map(el => 
      if(el.id === item.id) 
        return 
          ...el,
          isLiked: !el.isLiked,
          likesCount: !el.isLiked? el.likesCount+1 : el.likesCount-1,
        
      
      return el;
    )
  ))

注意:我假设每个帖子都有一个密钥id唯一值,如果它不存在则使用每个帖子的任何其他独特属性。

另一答案

如果数组序列不是问题,您可以使用项索引并使用setState来更新它。

<Icon
  onPress=()=>onLikePost(i)
  ...
/>

...

onLikePost = (i) => 
  let posts = this.state.posts;
  posts[i].likesCount = !posts[i].isLiked ? posts[i].likesCount + 1 : posts[i].likesCount - 1;
  posts[i].isLiked = !posts[i].isLiked;
  this.setState( posts: posts) 

以上是关于反应原生的增量值的主要内容,如果未能解决你的问题,请参考以下文章

在拍摄多张照片时反应原生路由器通量和反应原生相机问题

使用故事书中的反应原生矢量图标反应原生 Web 问题

如何在反应原生网格图像查看器中传递动态获取的图像数组数据,并在反应原生中使用标题

反应原生原生模块 RCTBubblingEventBlock 为空

尝试设置反应原生环境mac m1后,纱线开始不适用于反应js

反应原生:'require'未定义