首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从javascript中的数百个类似于'getElementById()‘的类中选择本机元素?

如何从javascript中的数百个类似于'getElementById()‘的类中选择本机元素?
EN

Stack Overflow用户
提问于 2020-06-13 12:52:54
回答 1查看 594关注 0票数 0

我有一个屏幕如下所示:

如您所见,这是显示来自用户的帖子。有数以百计的帖子。目前,我正在与类似的/不像系统。我有一个API来发送数据,并在数据库中执行类似/不一样的操作。问题是我如何在这里更新类似/不一样的状态?

假设一个帖子里有两个爱。有人把爱压在上面。API请求被发送到数据库,他/她成功地爱上了它。但是当屏幕显示“不喜欢”的情况时(例如,它的颜色是灰色的),我如何才能将特定的图标更新为“喜欢的”情况(例如,它现在应该是红色的)。

因此,我想知道是否有任何方法从其中的许多元素中选择一个特定的元素。我使用javascript编写了web版本,其中为每个图标设置了唯一的id,并使用'getElementById()‘方法更新了一个特定的图标。

我是新来的反应本地人,所以请原谅我的问题或想法。如果你认为你有更好的想法,你可以告诉我实现我想要的东西的不同方法。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-13 14:17:21

如果我对您的理解是正确的,请尝试使用而不是来获取HTML的id。每个心脏都是一个单独的组件,即一个函数或类,因此是单独的JavaScript对象。

一个很好的资源,可以帮助您理解和思考React官方站点这里上的组件概念。

所以每一张卡都有

代码语言:javascript
运行
复制
<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>

重要然后在呈现“心脏”组件,您可以设置它的状态,然后只是改变状态按下。

代码语言:javascript
运行
复制
//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传递给心脏组件。

**编辑以反映你的零食

MySnack

通过传递isLiked,这意味着父组件上的任何状态更改都将在子组件上刷新。我编写了一个简化版本,向您展示组件是如何单独维护状态的。

App.js

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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>
  );
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62360027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档