React Native Mobx @带参数的计算函数

koaltpgm  于 2023-05-18  发布在  React
关注(0)|答案(4)|浏览(121)

我是Mobx的新手,但到目前为止,它一直工作得很好,我已经设法走得很远。我有一个带有mobx和mobx-persistent的react-native应用程序。我正在使用axios从一个WordPress站点拉帖子。我试图改进的功能是“添加到收藏夹”功能。
以下是我的PostsStore:

export default class PostsStore {

// Define observables and persisting elements
@observable isLoading = true;
@persist('list') @observable posts = [];
@persist('list') @observable favorites = [];

// Get posts from Wordpress REST API
@action getPosts() {
  this.isLoading = true;
  axios({
    url: 'SITE_URL',
    method: 'get'
  })
    .then((response) => {
      this.posts = response.data
      this.isLoading = false
    })
    .catch(error => console.log(error))
}

// Add post to favorites list, ensuring that it does not previously exist
@action addToFavorites(id) {
  if (this.favorites.indexOf(id) === -1) {
    this.favorites.push(id);
  }
}

// Remove post from favorites list, ensuring that it does indeed exist
@action removeFromFavorites(id) {
  if (this.favorites.indexOf(id) !== -1) {
    this.favorites.remove(id);
  }
}

}

在我的Favorites组件中,它旨在渲染一个按钮以添加或删除收藏夹,我认为使用@ calculated函数将是首选的,以确定当前渲染的帖子是否具有已添加到可观察的'favorites'数组的'id'。然而,似乎@ calculated函数不允许接受参数(如果帖子在最受欢迎的可观察数组中,最小参数将是帖子的'id'来计算。我可以使用@action来完成测试,但这似乎不能立即更新渲染的屏幕,而这正是我的目标。正如下面的代码所演示的,我被迫在组件呈现中使用'if'语句执行测试。

render () {
  if (this.props.postsStore.favorites.includes(this.props.item.id)) {
    return (
      <Button
        onPress={() => this.props.postsStore.removeFromFavorites(this.props.item.id)}
        title="★"
      />
    )
  }

这是否会影响应用程序的性能?有没有一种@computed的方法来做我想做的事情?我是不是应该不担心这个,因为它有点工作?

rbl8hiat

rbl8hiat1#

这样做奏效了:

@computed get isFavorite() {
   return createTransformer(id => this.favorites.includes(id))
}

在我看来是这样叫的:

this.props.postsStore.isFavorite(this.props.item.id)
3zwtqj6y

3zwtqj6y2#

为了完整起见:mobx-utils提供了一种在计算函数中使用参数的方法。你可以使用computedFn并将函数声明如下:

isFavorite = computedFn(function isFavorite(id) {
    return this.favorites.includes(id)
})

看看文档中的文章。

oxf4rvwz

oxf4rvwz3#

我不确定@computed在这里是必要的,因为它会创建一个新的createTransformer时,每次this.favorites改变。
这将产生与仅使用单个createTransformer相同的结果

isFavorite = id => createTransformer(id => this.favorites.includes(id))
cunj1qz1

cunj1qz14#

您可以简单地将其 Package :

@computed
get isFavorite(): (id: string) => boolean {
    return (id: string) => {
        return this.favorites.includes(id);
    };
}

查看官方MobX文档建议的选项:https://mobx.js.org/computeds-with-args.html
PS.我建议再次检查你是否真的需要这里的computed。在你的情况下,常规方法可能已经足够好了。

相关问题