【问题标题】:Can't get rid of this error "Cannot read properties of undefined (reading 'each')" when trying to display API response - ReactJs尝试显示 API 响应时无法摆脱此错误“无法读取未定义的属性(读取'每个')” - ReactJs
【发布时间】:2021-10-02 13:59:39
【问题描述】:

我有以下代码: characterActions.js


    export const getCharacters = () => async(dispatch) => {
      try {
        dispatch({ type: FETCH_CHARACTERS_REQUEST })
    
        const { data } = await axios.get('https://rickandmortyapi.com/api/character')
        dispatch({
          type: FETCH_CHARACTERS_SUCCESS,
          payload: data
        })
      } catch (error) {
        dispatch({
          type: FETCH_CHARACTERS_FAIL,
          payload: 'error'
        })
      }
    }

characterReducers.js


    import {
      FETCH_CHARACTERS_REQUEST,
      FETCH_CHARACTERS_SUCCESS,
      FETCH_CHARACTERS_FAIL,
    } from '../actions/characters/characterConstants'
    
    export const characterListReducer = (state = { characters: {} }, action) => {
      switch(action.type) {
        case FETCH_CHARACTERS_REQUEST:
          return { loading: true, characters: [] }
        case FETCH_CHARACTERS_SUCCESS:
          return { loading: false, characters: action.payload }
        case FETCH_CHARACTERS_FAIL:
          return { loading: false, error: action.payload }
        default:
          return state;
      }
    } 

HomeScreen.js 我想在其中显示提取的字符


    const HomeScreen = () => {
      const dispatch = useDispatch()
      const charactersList = useSelector(state => state.charactersList)
      const { loading, error, characters } = charactersList
    
      console.log(characters.results)
      
      useEffect(() => {
        dispatch(getCharacters())
      }, [dispatch])
    
      return (
        <div>
         {characters.results.map((character) => {
           <h1 key={character.id}>{character.name}</h1>
         })}
        </div>
      )
    }

当进入浏览器时,我不断收到 ** TypeError:无法读取未定义的属性(读取“地图”)**

我正在尝试从 Rick and Morty API 获取数据。

谢谢你们!

【问题讨论】:

  • API 调用是异步的,您正在尝试在返回数据之前进行映射。 if(loading) return &lt;Loader /&gt;.

标签: javascript reactjs api


【解决方案1】:

表示characters.results不是数组。

console.log(characters.results) 时显示什么?

【讨论】:

  • (20) [{...}, {...}, {...}, {...}, {...}, {...}, {...}, {...}, {...}, {... }、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}、{…}] 0: {id: 1, 名称:'Rick Sanchez',状态:'活着',物种:'人类',类型:'',......} 1:{id:2,名称:'Morty Smith',状态:'活着',物种:'人类' , type: '', ...} 2: {id: 3, name: 'Summer Smith', status: 'Alive', species: 'Human', type: '', ...} 3: {id: 4, name: “Beth Smith”,状态:“活着”,物种:“人类”,类型:“”,……}
【解决方案2】:

可能有错误characters 应该是一个空数组。为安全起见,您可以使用||[] 或直接返回一个空白数组。

export const characterListReducer = (state = { characters: {} }, action) => {
      switch(action.type) {
        case FETCH_CHARACTERS_REQUEST:
          return { loading: true, characters: [] }
        case FETCH_CHARACTERS_SUCCESS:
          return { loading: false, characters: action.payload || [] } // here, in case null data.
        case FETCH_CHARACTERS_FAIL:
          return { loading: false, error: action.payload, characters:[] }  // here, on error
        default:
          return state;
      }
    } 

循环前添加检查以防出错

const HomeScreen = () => {
  const dispatch = useDispatch();
  const charactersList = useSelector((state) => state.charactersList);
  const { loading, error, characters } = charactersList;

  useEffect(() => {
    dispatch(getCharacters());
  }, [dispatch]);

  return (
    <div>
      {loading ? (
        <p>Loading please wait...</p>
      ) : error ? (
        <strong>There is error while fetching data, {error}</strong>
      ) : (
        characters.results.map((character) => {
          <h1 key={character.id}>{character.name}</h1>;
        })
      )}
    </div>
  );
};

/// 更新代码:

const { data } = await axios.get('https://rickandmortyapi.com/api/character')
dispatch({
  type: FETCH_CHARACTERS_SUCCESS,
  payload: data.results // use results instead to make it consistent with above assign
})

/// 主屏幕

// remove results now
characters.map((character) => {
  <h1 key={character.id}>{character.name}</h1>;
})

【讨论】:

  • 仍然无法正常工作,同样的错误... :( 我从 API 得到的响应是一个对象数组,.map 是我需要的正确函数吗?
  • 好的,我发现了错误。让我更新解决方案
  • @EduardK:现在检查...更新代码:
  • 不幸的是我之前尝试过这个......仍然无法正常工作。新的错误信息是 × TypeError: characters.map is not a function :(
猜你喜欢
  • 2018-09-10
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2021-12-06
  • 2021-12-06
  • 2022-07-22
相关资源
最近更新 更多