[ Day 29 ] 实作一个 React.js 网站 5/5

https://ithelp.ithome.com.tw/upload/images/20211013/20134153ubmcvq2dgy.png
今天是实作 React.js 网站的最後一篇介绍了,这篇会大量的使用到 React Hooks 的功能所以赶快一起来看该怎麽应用吧!


新增 Meetup 後重新导向

  • 上篇的最後一个示范我们新增了 POST Request 至我们的 NewMeetup.js 页面中,不过画面并没有出现任何提示成功新增的通知又或是页面重新导向的处理。因此我们在这边使用 React Router 内提供的 useHistory 这个 Hooks 来重新导向画面到 AllMeetup.js 中。
    https://ithelp.ithome.com.tw/upload/images/20211013/20134153Ru527IPz8p.png

备注: useHistory 这个 react-router 所提供的 hooks 方法并没有在前面的章节出现过,因此附上一个文章介绍的传送门给大家参考一下唷!


取得 Meetup 资料并使用 useState 操作

  • AllMeetup.js 的页面中使用 fetch 来取得 Firebase 资料库的内容,并将原本预设的 DUMMY_DATA 移除。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153wngfmaibfl.png
  • 引用 useState 的方法後使用该 React Hook 来宣告变数储存 Meetup 资料,并设定初始值。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153KI1fOz6PY7.png
  • setIsLoading 这个修改 State 的方法用在取得资料的 then 当中, setLoadedMeetups 也一样设定在该处,并将前面宣告好的变数 isLoadingloadedMeetups 应用在判定目前是某有新增的资料内容。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153RNzb4uEHOf.png

使用 useEffect 解决无限回圈的问题

  • 上述使用 useState 的 Hooks 之後会造成**无限回圈( Infinite Loop )**的状况发生,为了解决这个问题我们使用了 useEffect 并且在该 Hooks 当中添加了第二个参数:空阵列来做处理。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153VjW9KIm5X3.png
  • 另外将原本的 data 物件整理成新的阵列 meetups 并将资料传入,因为在 MeetupList.js 元件当中有使用到了阵列的处理方法 map ,所以必须将原本的物件改成阵列才不会出现错误讯息。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153zhLrnEfgOs.png

可以看一下目前的页面内容,就能看到目前我们上次新增到 Firebase 中的 Meetup 资料了:
https://ithelp.ithome.com.tw/upload/images/20211014/20134153FfazjiI3tr.png

备注:关於使用 useEffect 造成的无限回圈的原因和解法,可以参考这篇文章内的详细介绍唷。


使用 React Context 处理 My Favorite 功能

  • src 资料夹中新增 store 资料夹,在其中新增一个 favorites-context.js 的档案并引入 createContext 这个 React.js 的功能。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153YtiVVnmnrh.png

  • 宣告一个 FavoritesContext 变数并使用 creactContext 来存放需要的变数,在此 Context 物件中使用 Provider 属性做设定来传递资料到子层的元件中,再搭配 useState 宣告 userFavorites 一个变数来储存我的最爱。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153rPFta98DHU.png

  • 新增 addFavoriteHandler()removeFavoriteHandler()itemIsFavoriteHandler() 等三个 Function 来做我的最爱的新增、删除和判断该 Meetup 是否为我的最爱。
    https://ithelp.ithome.com.tw/upload/images/20211014/201341534W8uswavGt.png

  • 在刚才新增的三个 Function 中分别使用阵列的方法: concat()filter()some() 来处理资料,并将设定好的三个 Function 一起加入 context 以及 FavoritesContext 变数中。最後将此 FavoritesContextProvider 这个 Function export , 以及在此档案中最下方将其汇出 。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153F6CDzTKT3A.png

  • index.js 中引入 FavoritesContextProvider 这个 Function ,并将其加在 ReactDOM 的函式中。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153QbUYmCRcUD.png

  • 来到 MeetupItem.js 元件处理新增或移除 Meetup 资料,在档案中引用 useContext 这个 Hooks 来处理,并在其中绑定点击 To Favorites 按钮的事件,在新增至 Favorites.js 页面中。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153AEHKcVMnNI.png

    https://ithelp.ithome.com.tw/upload/images/20211014/20134153R0LpeEtQ9Q.png

所以现在点击 To Favorites 按钮之後,就会显示为 Remove from Favorites 的字样,代表成功新增了:
https://ithelp.ithome.com.tw/upload/images/20211014/201341533viSSFghHi.png


完成 Favorites 页面

  • 一样在 Favorites.js 页面中使用 useContext 这个 Hooks ,并引入 MeetupList.js 元件至该页面中。最後再使用判断式依据目前 store 内 totalFavorite 的数量来判定页面上方要显示的内容。
    https://ithelp.ithome.com.tw/upload/images/20211014/20134153YYGEqW8J1w.png

最後我们就可以在 Favorites.js 页面看到我们新增的最爱内容,如果没有的话也会显示 You got no favorites yet. Start adding some? 的字串提示:
https://ithelp.ithome.com.tw/upload/images/20211014/20134153GbqzAiPBHh.png

https://ithelp.ithome.com.tw/upload/images/20211014/20134153ElPgRlFvbi.png


那实作 React.js 网站的部分就在这篇结束罗!不过由於今天这篇有大量的使用到前面没有提及过的 React Context 以及 useContex 这个 React Hooks ,所以下面我整理了官方文件一些文章的传送门给大家参考:

另外附上这次实作网站的 DemoGitHub Repository 给大家,有不清楚的地方或是想要看每个步骤的实作的话可以参考 Day 25 提供的 YouTube 网址。

下一篇就是最後的完赛心得了~
会跟大家分享一下从 Vue.js 到学习 React.js 的状况跟心得。
那我们就下篇见ʘ‿ʘ


<<:  Day29-实作(地图) (part1)

>>:  【Day29】Cordic 演算法的实现

用React刻自己的投资Dashboard Day1 - 前言

tags: 2021铁人赛 React 系列文想法来源 因为笔者本身在金融业工作,日常生活中时常关注...

[Golang] Array and Slice

Go has two type of structure to handle list: Array...

Day17:Flow,一个非同步的资料流。 First Look

What is Flow? Flow 是用来处理非同步的资料流的一种方式,它会按照发射 (emit)...

[Day 25] - React + Tailwind CSS + DasyUI

重新整理一下思路 我们使用jsonp的方式来避过CORS,载入资源 一般jsonp会在data外包...

[Day5] Android - Kotlin笔记:ListAdapter + DiffUtil 进阶应用 - 复数itemViewType

Problem 昨天我们提到ListAdapter + DiffUtil在一般RecyclerVi...