开发者问题收集

无法评估 React Native FlatList 中的 item.id

2020-11-27
144

我正在尝试使用 React Native 的 FlatList 组件渲染练习列表,但目前无法成功编辑练习的名称。初始渲染时一切都运行顺利。但是,当我尝试编辑练习时,后续重新渲染返回错误 undefined is not an object (evaluating 'item.id') 。如果我检查本地数据库,数据已成功编辑,但将其渲染到屏幕上又是另一个问题。但是,如果我关闭错误显示并重新加载应用程序,则对练习进行了预期的更改。

我看过有关此问题的先前帖子/回复,但据我所知,我尝试了建议的解决方案但无济于事。

这是负责呈现 FlatList 的组件:

function Exercises({ fetchExercises }) {

const dispatch = useDispatch()
const exercises = useSelector(state => state.exercises) // **passed to data prop**

useEffect(() => {
  dispatch(fetchExercises())
}, [dispatch])

<FlatList 
  data={exercises}
  keyExtractor={item => item.id.toString()}
  renderItem={({ item }) => {
    return <ExerciseListItem item={item} />
  }}
/>

下面是我在 useEffect 中分派的操作:

export const editExercise = (id, changes) => dispatch => {
  dispatch({ type: EXERCISE_START })
  axios.put(<endpoint>, { name: changes })
    .then(res => {
      dispatch({ type: EDIT_EXERCISE_SUCCESS, payload: res.data })
    .catch(err => {
      dispatch({ type: EDIT_EXERCISE_FAIL, payload: err })
    }
}

...这是我的减速器:

const initialState = {
  exercises: [],
}

const exercisesReducer = (state = initialState, action) => {
  switch (action.type) {
    case EDIT_EXERCISE:
      return {
        ...state,
        isLoading: false,
        exercises: state.exercises.map(exercise=> {
          exercise.id === action.payload.id ? action.payload : exercise
        }
      }  
  }
}

无论如何,我能够成功地将新练习 添加 到列表中。不确定这是否会有所不同,但值得一提。此外, 这里 有一个类似的问题,大约一年前有人问过这个问题,它似乎是我的问题的解决方案,但我仍然没有得到预期的结果。

如能得到任何帮助,我将不胜感激!

1个回答

我认为问题在于您没有在 map 中返回任何内容,这导致了此错误。

exercises: state.exercises.map(exercise=> {
   return exercise.id === action.payload.id ? action.payload : exercise
}
Matt Aft
2020-11-27