---
# System prepended metadata

title: 7/6 線上 Slack 助教
tags: [Vue 直播班 - 2021 夏季班]

---

---
tags: Vue 直播班 - 2021 夏季班
---

# 7/6 線上 Slack 助教


## 今日助教輪班時間

Ryder：7/6 (二) 
回覆時間：早上 9:00 -下午 1:00

## 發問規範

老師助教同學們好，**這是我的 Codepen**，我**原本預期**「JS 第 8 行會出現數字 8」，**但卻出現**「預期外的結果是 0」，想問下問題出在哪裡？

## 注意

1. 請各位先到 Slack 上將問題放在助教服務內的 thread，如圖
 ![](https://i.imgur.com/nHE3sOx.png)
2. 遵循以上的發問規範以便助教查看問題，不可直接貼上網址而沒有說明文字或者只提供截圖
3. 助教會依照 Slack 上的順序回覆問題
4. 以下問題區塊只能由助教自行增加
5. 助教會將回覆寫在下方問題區塊

## 問題

1.Iven ：
助教好：
這是[我的程式碼](https://github.com/Iven10252158/final_project)，我原本的路由規劃是，只有index跟about在前台的Home.vue之下，其他的頁面拉出來做，但是其實其他頁面的版型都差不多，一樣是上面有navbar，下面有footer，所以我想說那也把其他頁面都放在Home.vue之下，但是我的footer在npm run serve一進到畫面的時候會卡在最上面，在about的時候也會往上跑，因為我的NavBar一開始都是白色的，包含文字也是白的，要滑動一下才會變成顯示別的顏色，我希望呈現出來在網頁高度不夠時，我一樣能夠讓footer在最下面，請問助教這部分可以怎麼做，因為我看其他同學的程式碼，他們在front.vue大部分都是一個navbar跟一個footer，我是也想這樣做，但我的footer都會跑，，然後我簽換成手機版型時，會發現好像footer底部還有一點留白，這兩個部份想請助教 教教我，謝謝。


> 助教回覆： 助教這邊一一回覆你的問題
> 1. navbar 、 footer 跑版問題： 接下來都以 **關於我頁面** 為例。
    > - This is an about page 這段文字之所以會往上跑，是因為同學 navbar 有使用 `position: fixed `，使用這段 CSS 後，該區塊會失去原本高度，已浮動方式呈現在畫面上。
> - 同學可以在 .about 新增 padding-top 的 css 這樣可以補上 navbar 原始高度


```
<style lang="scss" scoped>
.about{
  padding-top: 74px;
}
</style>
```
> - footer 之所以會往上跑，這個問題在 [7/2 線上助教](https://hackmd.io/m4auldAPSZCXIVXKhzBXJA) 回覆過你囉，是因為 .about 本身沒有夠多內容，因此 footer 不會是至底狀態，會需要在 .about 去設定 min-height 語法，他才會完全至底哩。
> - 由於 navbar 、 footer 的問題，都是可以透過各個 .vue 檔去新增對應的 SCSS ，因此同學這邊確實能把其他頁面放在 Home.vue 下喔。
>
>2. footer 會有留白： 這個問題是因為 bootstrap 有對 h1 、 h2 等等，h 系列標籤，添加 margin-bottom ， 而同學 footer 也有使用到 h5 哩，因此可以在 footer.vue 中使用針對 h5 標籤去做調整。
```
<style scoped>
h5{
  margin-bottom: 0;
}
</style>
```
>- 另外這邊提醒一下，同學下次提問時，可以多使用 Markdown 或是 多分段，助教這邊才會比較快速理解同學問題哩。

---

2.Tommy
助教好：
這是[我的程式碼](https://github.com/apple19890708/hexschool-homework/tree/main/hexschool-homework-week-5)，我預期在productPage.html做表單驗證，但是加上v-form 、 v-field 、 error-message後卻出現下面錯誤訊息，可以幫我看一下是為甚麼嗎？謝謝。
resolveComponent can only be used in render() or setup().

> 助教回覆：
> 這邊看同學 Vue 是使用 ESM 方式引入，使用這種方式引入， Vue 會在 VeeValidate 套件引入後才被引入，不過 VeeValidate 會是需要透過 Vue  本身來做一些設定，因此有使用 VeeValidate 的話 Vue 是無法用 ESM 方式引入，同學可以把 Vue 改成以 CDN 方法引入，詳細流程如下：
>- productPage.html 281 行 createApp 這段註解
>- productPage.html 286 行  使用 Vue.createApp  
>`const app = Vue.createApp({`
>- 按照上面流程改成 CDN 引入 Vue 後，就不會跳出警告，驗證功能也能正確使用囉。
---

3.Ming  
助教您好:
[github](https://github.com/ankazu/spirit)
我做了相關產品的元件(ProductAlike)，用在首頁、產品詳細頁、購物車。我弄了點圖轉址，但我發現頁面是有轉跳了。
1. 但畫面會停在元件的位置，而不是網站的最上方。
2. 還有在產品詳細頁點擊相關產品，網址路由不會更新。
謝謝助教

> 助教回覆：
> 1. Vue cli 的 Vue Router 在切換時， scroll 確實不會根據頁面切換而至頂，如果要達成這個功能可以在 router/index.js 設定
> 
```
const router = createRouter({
  history: createWebHashHistory(),
  routes,
});
```
>這段新增 scrollBehavior() 方法
```
const router = createRouter({
  history: createWebHashHistory(),
  routes,
  scrollBehavior() {
    return { top: 0 };
  },
});
```
>上面這個功能是 Vue Router 內建的，詳細可參考[官方文件](https://router.vuejs.org/zh/guide/advanced/scroll-behavior.html)

> 2. 這邊看同學是在 ProductAlike.vue 使用 emit 將，將被點擊到的，相關產品 id 丟到父層，父層再透過 id 執行 ajax 因此更換畫面上的產品。
> 但這之間並沒有使用到任何 router 切換語法，因此網址路由在然不會更新，若要達成這個需求可以按照以下步驟：
> - ProductAlike.vue 14 行 click 不直接執行 $emit 事件，改為執行 methods 方法
> - 新增的 methods 方法中，先執行 `this.$router.push()` 再執行 emit 方法。

```
//ProductAlike.vue 第 14 行
<div @click="test(item.id)" class="alike_list_img">

//methods 新增 test方法
    test(id) {
      this.$router.push(`/product/${id}`);
      this.$emit('go-page', id);
    },
```
> - 有按照上面步驟調整後，點擊相關商品，scroll 會自動至頂，並且路由也能正確切換囉。

---

4.Erica 
助教好，這是我的 [Repo](https://github.com/ericacadu/panya)
1.在前台 front > About.vue 頁面有取出文章，編輯器裡面有加入連結，但是在第 41 行取不到 a 連結的 dom，請問如果想要加上 target 屬性該怎麼修改呢？
2.目前分別在前台 Home.vue(首頁) / Products.vue(商品列表) / Product.vue(商品頁) 三個頁面有加上 scroll 監聽，想做出進入標準線後會 fade-in 的效果，嘗試過後覺得邏輯不太順寫起來怪怪的，特別是商品頁會失控，另外雖然有在 unmounted 取消監聽，但還是會跳出 Cannot read property 'offsetTop' of null 的錯誤

以上再麻煩助教幫我看看，謝謝
> 助教回覆：
> 1.這邊看同學指定的 a 標籤也是藉由 v-html 渲染出來，當我使用 v-html 將資料渲染成畫面時，並非瞬間也會需要一點時間哩。
> 因此同學可以使用 setTimeout 將 About.vue 42 、 43 行包裝起來，這樣就能抓到 a 標籤的 DOM 元素

```
setTimeout(() => {
  const links = document.querySelectorAll('article a');
  links.forEach((item) => item.setAttribute('target', '_blank'));
}, 100);
```
> - 然後也在補充一下 v-hmlt 這個語法渲染速度，會根據不同瀏覽器有不同情況，因此同學 setTimeout 的延遲時間可以自己抓一下喔。

> 2. 會發生錯誤主要是因為同學 Home.vue 、 Product.vue 的寫法，會讓 onScroll 方法變成閉包狀態，導致清除監聽時無法正確清除該方法，這邊建議將 onScroll 獨立成一個 methods 方法，就不會有問題囉。
---

5.Shino 
助教好，這邊附上 [codepen](https://codepen.io/shiiinnooo/pen/bGWEMgL) 程式碼。
我使用老師第五週上課用的檔案在練習 vueLoading 套件，使用的檔案是 vue_loading-01.html，使用 cdn 載入 vueLoading，
但卻一直出現以下錯誤 ，再麻煩協助查看問題，謝謝。 
> 助教回覆：
> 同學狀況跟今天第二問狀況一樣喔，主要是 Vue 使用 ESM 引入問題
> 使用 ESM 這種方式引入， Vue 會在 vueLoading 套件引入後才被引入，不過 vueLoading 會是需要透過 Vue  本身來做一些設定，因此有使用 vueLoading 的話 Vue 是無法用 ESM 方式引入，同學可以把 Vue 改成以 CDN 方法引入。
> 助教有將你的[專案調整成 CDN 方法引入的](https://codepen.io/rider159159/pen/RwVrBLb?editors=1010)，你可以參考看看。

---
6.Yiren  
助教您好, 這是我的 [repo](https://github.com/Yiren-Liou/Aboriginal_Shop/tree/master/src)
在後台 admin > AdminProducts 使用 emitter.emit (206 - 208 行 )把指定參數傳出，在 EditProduct (333 - 337 行)使用 emitter.on 接收參數，預期在 EditProduct 可以成功接收到參數。
但發生以下兩個情況:
1. 第一次觸發 emitter 事件，emitter.emit 有成功觸發但 emitter.on 沒有成功觸發。
    第二次觸發 emitter 事件，emitter.emit 和 emitter.on 才有成功觸發，想請問為甚麼第一次 emitter.on 沒有成功觸發?
2. emitter.on 成功觸發後，this.readonly 有成功賦予新的值 ( 335 行 )，但在 337 行的 console.log 印出來卻是未修改前的值，是表示其實 this.readonly 並沒有成功賦予新的值嗎?
再麻煩助教查看，謝謝助教~
> 助教回覆：
> 這邊 1、2 問因為原因是相同的所以一起回覆
> - 同學 emitter 設定是正確的，不過 AdminProducts.vue 的 emitter.emit 發送到 EditProduct.vue 的 emitter.on ，這之間網頁會需要經切換路由才會被啟用。
> - 如果是這種需要切換路由，才啟用 emitter 來接收的狀況，emitter 在處理資料上就會相對不穩定，這是 emitter 本身的限制哩。
> - 要達成同學的需求，會比較建議在 AdminProducts.vue 、 EditProduct.vue 的父層 Layout.vue 新增一個變數，並透過 props 、emit 的方法來去處理狀態切換。
> - 同學可以把 <router-view> 看成一個元件， 在上面使用 emit 事件來讓子層去切換 Layout.vue 的資料哩。
>
> - 另外補充一下 Layout.vue 中  `from '@/methods/emitter'` 應該是大寫的  `from '@/methods/Emitter'` 才對喔

---
7.Jordan_Tseng：
助教好，想請問關於文字，因為我的網頁有一些像是職位介紹、申請內容，這些如果想要他斷行斷的好看，是不是就是要使用文字編輯器？像文章一樣？請問六角建議是使用哪個套件？這個嗎？課程中好像沒有在針對這個做介紹？

> 助教回覆：
> - 是使用文字編輯器沒錯，不過文字編輯器的原理就是在要換行部分，插入 `<br>` 標籤。
> - 並且要呈現的畫面，要需要使用 v-html 來做渲染。
> - 群組中也有同學提出[這個問題哩](https://hexschool-share.slack.com/archives/G01GTT66PS6/p1624808651318700?thread_ts=1624807462.318300&cid=G01GTT66PS6)，另外下面同學也有正確回覆哩。
> - 文字編輯器部分可參考，第七週的[官方範例](https://github.com/hexschool/live-vue3-dashboard/blob/main/src/components/ArticleModal.vue) ArticleModal.vue 就有使用到哩。

---

8.圈圈 
助教您好，想詢問製作前台單筆文章頁時，是否需要再把 api 取得的 content （帶有 HTML 標籤）重新整理成純資料，再放到畫面上？還是直接用 v-html 就可以了XD （順便說一下我使用的文字編輯器是 ckeditor）

> 助教回覆：
> 可以直接使用 v-html 來做渲染哩，因為同學使用文字編輯器，將文章儲存到後台 API 時，他就是以純資料形式被儲存，因此後面 API 回傳資料時，可以直接用 v-html 就做渲染動作哩。

---
9.moitw 
助教好～
在後台 coupon 調整產品的 is_enabled，API 回來出現 is_enabled 型別錯誤   使用 typeof 觀察是 number , 而從表單取得的是 string ，但是在元件裡的 Data 裡 預設值是 is_enabled = 0 (number) ，想知道是怎麼轉型別？
確定的是 進 API 需要 Number 型別，但 input 得到的字串在哪裡該轉型別 Number ?
先謝謝～
[程式碼](https://github.com/tsuifei/vue-galerie/tree/main/src)
[頁面](https://tsuifei.github.io/vue-galerie/dist/#/login)

> 助教回覆：
> 這個問題可以參考，第七週[官方範例](https://github.com/hexschool/live-vue3-dashboard/blob/main/src/components/CouponModal.vue#L38)，就是在綁定 is_enabled 的 input 上，添加
```
:true-value="1"
:false-value="0"
```
>這樣這個 input 原本綁定的布林值，就會被轉為數字哩。
>老師在 [資料雙向綁定 v-model](https://courses.hexschool.com/courses/vue-2021/lectures/31156059)影片後半部其實也有使用到類似功能，同學可以參考看看哩。

---
10.Stacey Huang
Ryder助教你好,
[在上周直播](https://courses.hexschool.com/courses/vue-2021/lectures/33344694),老師示範了lazy loading, 在22:48 提到了換頁時,也會觸發滾動事件,所以離開元件時,在unmounted取消掉滾動監聽。
這段不懂,滾動事件是寫在ProductsLazy.vue上,為什麼在換頁到/porducts中也會觸發滾動事件?
謝謝助教!

> 助教回覆：
> - 這邊主要是因為 scroll 這個滾動事件是監聽在 window 之下的
> - 而 window 這個元素算是 JS 最底層的元素，即使在 Vue Cli 中進行畫面切換 winodw 這元素也不會被重置
> - 因此要換頁時若要取消以 winodw 為主的監聽事件，就會需要在 unmounted 取消喔
> 

---
11.Lina Chen
老師助教同學您們好，
在我的頁面中，若在「首頁」跟「關於我們」兩頁間相互切換數次，在互相切換的過程時，會報出紅字錯誤(如附圖)，不確定報出錯誤的原因。
附上我的[頁面](https://lina-shu.github.io/brunch_project/dist/#/)及[程式碼](https://github.com/Lina-SHU/brunch_project/tree/master/src)
謝謝！~
![](https://i.imgur.com/06XKaaQ.png)


> 助教回覆：
> - 這邊有將 About.vue HTML 部分， `<template>` 的下一層有在使用一個 `<dvi>` 將所有 HTML 進行包裝，這樣在切換關於我頁面就不會再報錯囉。
> - 這邊也建議同學其他 .vue 檔 HTML 也都使用上面規則進行包裝，以避免 Vue Cli 在渲染時，會因為 HTML 沒包裝好因此發生一些不知名的錯誤哩。
> 
```
<template>
  <div>
    內容....
  </div>
</template>
```


---
12.Iven 
助教好：
這是[我的程式碼](https://github.com/Iven10252158/final_project)，
Q1 : 關於footer至底的問題，我有做修改了，想請助教幫我檢查一下，我是加calc的部分在關於我的頁面上，想問一下助教，主要的前台路由，只拿來放navbar跟footer的Home.vue檔是不是可以不用下calc語法讓footer至底？因為如果下了這樣其他頁面也會吃到這個設定，就算我用了scoped其他頁面也還是會吃到相關設定。（github上的scoped拼錯了，但我自己有實測過，在Home.vue上下calc讓footer至底，其他頁面也還是會吃到）

Q2 : 想問一下關於 "我的最愛“的問題，目前我的最愛是有存進localStorage裡面，但是我希望我的最愛的內容可以在NavBar上的書籤查看。我的想法是，書籤裡的品項應該是跟著localStorage的內容走的。
目前的狀況：因為push到myFavorite的是item.id，所以導致我在生命週期處，直接emitter.emit到Favorite.vue時，會只收到id，如果把push到myFavorite的是item的話，這樣點選產品時，愛心又不會產生高亮。
希望做出來的是，我的最愛裡可以保留原本加入的品項，從localStorage增加或移除商品，也能渲染在書籤上。

> 助教回覆：
>1. Home.vue 確實不用加 min-height + calc 來達成至底，在有需要的頁面在做這個 CSS 設定就行哩。 如果在 Home.vue 做這個設定，他子層的元件也都會吃到這個設定哩，所以比較建議在單 .vue 使用這個方法。

>2. 如果同學需要將我的最愛呈現在 navbar 這種 layout 上，會比較建議儲存完整的 商品資料，而非商品 id 。 而在商品列表中，愛心顯示的問題則可以使用 ，我的最愛資料 和 全部商品資料 的 id 進行對比，在根據對比狀況顯示不同愛心樣式，詳細可參考[這個學長、姐的專案](https://ashley-yu.github.io/OwnSpace/#/product_list)，因為是 vue2 部分結構稍有不同，不過 localStorage 判斷不會差太多喔，另外也附上他的[ GitHub repo](https://github.com/Ashley-yu/OwnSpace)

---
13.Fred Chang 
助教您好, 這是我的[程式碼](https://github.com/fred8196/Vue-Week7)及[頁面](https://fred8196.github.io/Vue-Week7/dist/#/Login)，想請教兩個問題:
1. 在Login.vue 的90~98行，原本是想說在已經登入過的情況下，可以直接轉跳到Dashboard.vue頁面，但是會出現附件影片那樣，驗證不成功且無法轉跳回login頁面，想詢問該如何避免此問題。
2. 在打開modal的時候，console log時不時會出現如附圖的錯誤，但不是每一次都會，不曉得是哪邊出錯。
還請助教協助，謝謝~
https://hexschool-share.slack.com/files/U01HKMW1GHH/F02761JDDMK/login_error.mp4
![](https://i.imgur.com/XsVQglx.png)

> 助教回覆：
> 1. 這邊會發生錯誤原因是， 有名稱是 hexToken 的 cookie 但這個 cookie 中的值是不正確的，因此會發生以下狀況：
> - Dashboard.vue （admin 頁面）執行 this.checkLogin() 接者 因為 res.data.success 回傳是 false 所以執行 49 行的 else 判斷
> - els 中程式碼，會先執行跳出訊息的 swal 功能，接者在跳轉至 login 頁面
> - 到了 login 頁會執行 checkLogin() ， checkLogin() 會判斷式否有名稱是 hexToken 的 cookie ，如果有就跳回 Dashboard.vue （admin 頁面）
> - 接著 Dashboard.vue （admin 頁面） 就會因為 res.data.success 回傳是 false 所以執行 49 行的 else 判斷，就這樣上面的狀況不斷重複下去哩。
> - 要解決這個問題，就是不要在 login.vue 使用 checkLogin 的方法哩，只要導到 login.vue 都會需要重新登入，這樣就整解決同學發生的問題。
> 

> 2. 這個問題助教這邊無法重現哩，從同學附圖來看發生錯誤的是 vue-loading 套件，而同學目前 modal 相關設定都沒有使用到 loading 效果，因此理論上不會發生錯誤才對，這邊麻煩同學記錄一下發生錯誤時詳細狀況哩
> - 如：是使用 編輯 or 新增開啟而跳出錯誤、跳出錯誤時的 loading 狀況等等
> - 有詳細紀錄後助教這邊會在幫你檢查這個問題喔
---

(這邊只能由助教編輯，問題請到 thread 上詢問)