Магазин MobX не обновляется в React Native - PullRequest
0 голосов
/ 02 ноября 2018

Я реализовал магазин MobX в своем приложении React-Native, чтобы отслеживать, отслеживается ли пользователь или отписался от него. Подписка / отмена регистрации выполняется, но хранилище MobX не обновляется. Я пытаюсь обновить его напрямую с помощью this.follows.items[index] = { ...user, isFollowing: !user.isFollowing }, но по какой-то причине магазин не запускает обновление.

Вот View Компонент

@observer
class FollowsListView extends Component<Props> {
  follows =
    this.props.followType === 'followers'
      ? followsStore.getFollowersListLoader(this.props.userId)
      : followsStore.getFollowingListLoader(this.props.userId);

  componentDidMount = () => {
    this.follows.lazyLoad();
  };

  render() {
    return (
      <>
        <AppHeader
          title={
            this.props.followType === 'followers' ? 'FOLLOWERS' : 'FOLLOWING'
          }
        />
        <FlatList
          contentContainerStyle={{ padding: 15 }}
          data={this.follows.items}
          keyExtractor={this.getId}
          onEndReached={this.follows.loadMore}
          onEndReachedThreshold={0.2}
          onRefresh={this.follows.loadFromStart}
          refreshing={this.follows.isLoading}
          renderItem={this.renderFollows}
        />
      </>
    );
  }

  private getId = (user: { id: string }) => user.id;

  renderUserActionButton(user: UserContainer) {
    console.log(user);
    return (
      user.id !== _SessionManager.id && (
        <TouchableOpacity
          onPress={() => this.openActionMenu(user.following || user.owner)}
        >
          <Image source={Images.moreDots} />
        </TouchableOpacity>
      )
    );
  }

  openActionMenu(user: User) {
    const name = user.name || user.username;

    const followOption = { name: 'follow', title: `Follow @${name}` };
    const unfollowOption = { name: 'unfollow', title: `Unfollow @${name}` };

    const options = {
      customButtons: [user.isFollowing ? unfollowOption : followOption],
      title: null,
      takePhotoButtonTitle: null,
      chooseFromLibraryButtonTitle: null,
    };

    ImagePicker.showImagePicker(options, ({ customButton }) => {
      if (customButton === 'follow') {
        this.props.changeIsFollowingUser(user.id, false);
      }
      if (customButton === 'unfollow') {
        this.props.changeIsFollowingUser(user.id, true);
      }

      const index = this.follows.items.findIndex((user) => user.id);
      this.follows.items[index] = { ...user, isFollowing: !user.isFollowing };
    });
  }

  private renderFollows: ListRenderItem<UserContainer> = ({ item: user }) => {
    const userId = user.following ? user.following.id : user.id;

    return (
      <UserRow
        actionContent={this.renderUserActionButton(user)}
        onPress={() => this.props.navigateTo('ProfilePublic', { userId })}
        user={user.following || user.owner}
      />
    );
  };
}

const mapDispatchToProps = (dispatch: Function): MappedDispatch =>
  bindActionCreators(
    {
      changeIsFollowingUser,
      navigateTo,
    },
    dispatch
  );

export default connect(
  null,
  mapDispatchToProps
)(FollowsListView);

Вот это Follows Store

import ListLoader from 'Network/ListLoader';
import { Follows } from 'Follows/Types';
import _API from 'Network/API';

class FollowsStore {
  followers = new Map<string, Follows>();
  followersList = new Map<string, ListLoader<Follows>>();
  following = new Map<string, Follows>();
  followingList = new Map<string, ListLoader<Follows>>();

  getFollowersListLoader(userId: string) {
    const list = this.followersList.get(userId);
    if (list) return list;

    const newList = new ListLoader<Follows>({
      fetchData: async (params) => {
        const url = `users/${userId}/followers`;
        const response = await _API.get(url, { params });
        return response.data;
      },
      onLoad: (data) => {
        for (const user of data.items) {
          this.followers.set(user.id, user);
        }
      },
    });

    this.followersList.set(userId, newList);
    return newList;
  }

  getFollowingListLoader(userId: string) {
    const list = this.followingList.get(userId);
    if (list) return list;

    const newList = new ListLoader<Follows>({
      fetchData: async (params) => {
        const url = `users/${userId}/following`;
        const response = await _API.get(url, { params });
        return response.data;
      },
      onLoad: (data) => {
        for (const user of data.items) {
          this.following.set(user.id, user);
        }
      },
    });

    this.followingList.set(userId, newList);

    console.log(newList);
    return newList;
  }
}

const followsStore = new FollowsStore();

export default followsStore;

1 Ответ

0 голосов
/ 02 ноября 2018

В MobX, чтобы изменить состояние, вам нужно использовать действие . Установите / украсьте ваш openActionMenu как действие или извлеките код, изменяющий состояние, в другую функцию, которую вы украсили как действие, чтобы быть чище.

...