---
tags: Vue 直播班 - 2021 夏季班
---
# 7/6 線上 Slack 助教
## 今日助教輪班時間
Ryder:7/6 (二)
回覆時間:早上 9:00 -下午 1:00
## 發問規範
老師助教同學們好,**這是我的 Codepen**,我**原本預期**「JS 第 8 行會出現數字 8」,**但卻出現**「預期外的結果是 0」,想問下問題出在哪裡?
## 注意
1. 請各位先到 Slack 上將問題放在助教服務內的 thread,如圖

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)
謝謝!~

> 助教回覆:
> - 這邊有將 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

> 助教回覆:
> 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 上詢問)