【发布时间】: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