【问题标题】:How to check item in favorite list - redux?如何检查收藏列表中的项目 - redux?
【发布时间】:2020-02-25 14:40:34
【问题描述】:

我有两个功能,

1- 将歌曲添加到收藏列表: 我向端点发送一个请求,将歌曲添加到用户喜爱的列表中,它根据我在正文请求中传递的 song_id 添加歌曲。

2- 从收藏列表中删除歌曲: 和以前一样,但根据 song_id 从收藏列表中删除歌曲。

所以在播放器组件中,我有一个心形图标,称为函数,当用户点击它时,我调用添加歌曲,否则我调用删除歌曲。

所有这些东西都可以在没有 redux 的情况下工作!

所以我想保存 song_id 并基于它我想添加一个检查器,如果这个 song_id 存在,这意味着这首歌在用户点击它时“心脏图标将被填满”之前在收藏列表中我想删除这首歌来自收藏列表所以我调用第二个函数向服务器发送请求等等。

所以我为这种情况做了一个动作/减速器,但我认为它不太好。

UI“播放器组件”-“没有 redux”

  addToFavorite = async () => {
    const {tunes, token, currentTrackIndex} = this.state;
    this.setState({isFavorite: true});
    let id = tunes[currentTrackIndex].id;
    try {
      let AuthStr = `Bearer ${token}`;
      const headers = {
        'Content-Type': 'application/json',
        Authorization: AuthStr,
      };
      let response = await API.post(
        '/btn_add_favourite',
        {
          id,
        },
        {
          headers: headers,
        },
      );
      if (response.data.status === 'success') {
        alert('added');
      } else {
        alert('already exist');
      }
    } catch (err) {
      this.setState({isFavorite: false});
      console.log(err);
    }
  };

  deleteFromFavorite = async () => {
    const {tunes, token, isFavorite, currentTrackIndex} = this.state;

    let id = tunes[currentTrackIndex].id;
    console.log(tunes[currentTrackIndex]);
    try {
      let AuthStr = `Bearer ${token}`;
      const headers = {
        'Content-Type': 'application/json',
        Authorization: AuthStr,
      };
      if (isFavorite) {
        let response = await API.post(
          '/favourite_delete',
          {
            tracks_id: id,
          },
          {
            headers: headers,
          },
        );
        if (response.status === 200) {
          alert('song deleted from your favorite list');
          this.setState({isFavorite: false});
        }
        console.log(response);
      }
    } catch (err) {
      console.log(err);
    }
  };



   <Button
              onPress={() =>
                this.state.isFavorite // Not using redux yet so by default false
                  ? this.deleteFromFavorite()
                  : this.addToFavorite()
              }
              transparent
              style={styles.btnTransparent}>
              <Icon
                style={styles.iconColor}
                type="MaterialIcons"
                name={this.state.isFavorite ? 'favorite' : 'favorite-border'}
              />
            </Button>

Redux 的东西

Action/isFavoriteAction.js

import {ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE} from './types';

export const addToFavoriteFunction = isFavorite => {
  return {
    type: ADD_TO_FAVORITE,
    payload: isFavorite,
  };
};

export const removeFromFavoriteFunction = isFavorite => {
  return {
    type: REMOVE_FROM_FAVORITE,
    payload: isFavorite,
  };
};

reducer/isFavorite.js

import {ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE} from '../actions/types';

let initial_state = {
  isFavorite: false,
};

const isFavoriteReducer = (state = initial_state, action) => {
  switch (action.type) {
    case ADD_TO_FAVORITE:
      state = {
        ...state,
        isFavorite: true,
      };
      break;
    case REMOVE_FROM_FAVORITE:
      state = {
        ...state,
        isFavorite: false,
      };
      break;
    default:
      return state;
  }
  return state;
};

export default isFavoriteReducer;

【问题讨论】:

    标签: javascript reactjs react-native redux react-redux


    【解决方案1】:

    特别是对于reducer部分,我看到你正在为一首歌曲创建一个状态,我建议你在Redux中有完整的歌曲列表,然后你可以这样处理:

    import { ADD_TO_FAVORITE, REMOVE_FROM_FAVORITE } from "../actions/types";
    
    let initialState = [];
    
    /**
     *
     * @param {Array<Object>} songs A list of songs, this should be your state
     * @param {boolean} flag The boolean value, to fav or unfav a song
     * @return A new list of songs, with the updated isFavorite field for the song
     */
    const updateSongFavoriteFlag = (songs, songId, flag) =>
        songs.map(song => {
            if (song.id === songId) {
                return { ...song, isFavorite: flag };
            }
            return song;
        });
    
    const isFavoriteReducer = (state = initialState, action = {}) => {
        const { payload, type } = action;
        switch (action.type) {
            case ADD_TO_FAVORITE: {
                // Returning a new state instead of just altering the selected item
                // Where payload is the id of the song you want to mark as favorite
                return updateSongFavoriteFlag(state, payload, true);
            }
            case REMOVE_FROM_FAVORITE:
                return updateSongFavoriteFlag(state, payload, false);
            default:
                return state;
        }
        return state;
    };
    
    export default isFavoriteReducer;
    

    【讨论】:

    • 错误:state is not defined at updateSongFavoriteFlag:\
    • 我的错,我已经编辑了答案,是“歌曲”而不是“状态”
    • 我在你之前编辑过它,但我得到了这个songs.map is not a function at updateSongFavoriteFlag
    • 我注意到负载没有定义,我编辑了它还在帮助函数中添加了“songId”,但是“songs.map”应该可以正常工作,因为它使用的是默认的“状态”一个数组
    • 你是否用另一个不是数组的值来初始化你的状态?
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多