我的 react native 应用程序中有一个减速器,理想情况下它应该检查状态并返回是否喜欢配方。如果 isFav 是 true 或 false 对于状态中的配方对象,我试图创建一个减速器来返回。如果在该状态下未找到配方,则应返回 false。
我在试图弄清楚如何编写减速器时碰了壁。这就是我到目前为止所拥有的。
这是我的 favids.js 减速器
import { TOGGLE, IS_FAVOURITE } from '../actions'
export const favids = (state = [], action) => {
const { type, recipeid } = action
const newRecipe = {
recipeid,
is_fav: true,
}
switch (type) {
case TOGGLE: {
// console.log(`Toggle State = ${JSON.stringify(state)}`)
// console.log(`Toggle recipe id : ${recipeid}`)
return state.findIndex(recipe => recipe.recipeid === recipeid) === -1 ?
[...state, newRecipe] :
state.map(recipe =>
recipe.recipeid === recipeid ?
{ ...recipe, is_fav: !recipe.is_fav } : recipe
)
}
case IS_FAVOURITE: {
//console.log(`Is Favourite state =${JSON.stringify(state)}`)
return state.map(recipe =>
recipe.recipeid === recipeid ?
recipe.is_fav : state
)
}
default:
return state
}
}
这是我的actions.js
export const TOGGLE = 'TOGGLE'
export const toggleFavId = id => ({
type: 'TOGGLE',
recipeid: id
})
export const IS_FAVOURITE = 'IS_FAVOURITE'
export const isFavourite = id => (
{
type: 'IS_FAVOURITE',
recipeid: id
}
)
我正在尝试修改 is_favourite 减速器以返回 true 或 false,这是保存在状态中的配方对象的 is_fav 属性的值。
我试图在渲染组件时在可见组件的 useEffect 中调用它。
这是 favicon.js 文件
import React, {useState, useEffect} from 'react'
import { FontAwesome } from '@expo/vector-icons'
import { View, TouchableOpacity,StyleSheet, Text, Alert } from 'react-native'
const FavIcon = ({recipeid, onToggle, isFavourite, text}) => {
const [isFavNew, setFavNew] = useState(false)
const toggleFav = (recipeid) =>{
setFavNew(!isFavNew)
onToggle(recipeid)
}
useEffect(() => {
console.log("Entered useEffect")
console.log(`Recipeid = ${recipeid}`)
console.log(`Favicon UseEffect IS Favourtie Recipe id:> ${JSON.stringify(isFavourite(recipeid))}`)
**// if (recipeid > 0)
// setFavNew((isFavourite(recipeid))
// else {
// setFavNew(false)
// }**
},[])
// console.log(`Is Favourite in Favicon is = ${isFavourite(recipeid)}`)
return (
<View>
<TouchableOpacity style={styles.favItem} onPress={() => toggleFav(recipeid)}>
<FontAwesome name={isFavNew === true ? 'heart' : 'heart-o'} size={40} color='red' />
<Text> {text}</Text>
</TouchableOpacity>
</View>
)
}
export default FavIcon