# 官方 [官方](https://vuejs.org/guide/introduction.html#api-styles) [vue cli](https://cli.vuejs.org/guide/) # [全家筒 005](https://www.youtube.com/watch?v=nt6U7fa3jqY&list=PLmOn9nNkQxJEARHuEpVayY6ppiNlkvrnb&index=4&ab_channel=%E5%B0%9A%E7%A1%85%E8%B0%B7IT%E5%9F%B9%E8%AE%AD%E5%AD%A6%E6%A0%A1) 命令式 jquery 聲明式 vue read-dom 虛擬dom es6模塊化 包管理器 原型,原型鏈 數組常用方法 axios promise 003 awesomevue 官方指南看完後要去看 vue模板 vue實例基本上只會有一個 vue的el如果指的是class 而且有兩個class以上只會有一個被掛載 但沒事不要掛class請掛id 反過來講如果兩個vue去掛同一個id會報錯但沒事不要耍白癡 可以用 js eval 表達式 有return的值 代碼 if else ``` {{1+1}} =>2 {{Data.now()}} {{a}}引用data的a ``` constructor=> new xxx 這是js創造instance的方法她把class稱為constructor 開發版本 會有比較詳細的訊息再console.log裡面 vue.js 產品版本是 vue.min.js 插值語法 vs 指令語法 插值語法 標籤體 指令語法 標籤屬性 不用指令語法就是純粹字串 ``` {{aaa}} v-bind:href="xxx" 這ˋ個xxx是 js 表達式 ``` js引用dict可以如果python引用method一樣 不用寫成 ``` ins['method'] ins.method ``` v-bind單向綁定=>data改前板 v-model雙向綁定=> 前板跟data互改 但是v-model只支援表單類型元素(可以輸入的元素) 他其實綁定是attr value值 v-model可以簡寫 v-model:value=>v-model就好 bind的話是 v-bind:value=>:value 可以用vue開發工具在前版改data 008 ![](https://i.imgur.com/u9mFqPh.png) 上圖是vue的instance $ 符號開頭是給使用者用的方法/變數 vscode有用戶代碼片段可以自訂義 snippets user config snippet 009 尚硅谷Vue技术 el与data的两种写法 ``` new vue el = v.$mount() ``` 函數式的this會指到vue實例 對象式會指到global vue instance兩個都可以(看你有沒有用this) 但是 compionent只能用函數式 ``` 對象式 data :{} 函數式 data : function(){ # data(){ # 兩個寫法都是一樣 return {} } 箭頭含式會沒有自己的this (param1, param2, ...rest) => { statements } data:()=>{ # this 是global return } ``` 不能用箭頭含式為大原則除非你不用this mvvm model,view,viewmodel 所以create vue instance都用vm = Vue()來接 vue ins會做一個特殊處理把data的內容放到vue的ins上 所以才可以直接用 ```{{aaa}}```取到 反過來講vue ins本來的東西也可以取道像是 ````{{$option}}``之類的 可以去print vue ins 去了解它有啥東西 011 Object defineProperty 數據代理 用 Object defineProperty去添加 object的話顏色會不一樣 ![](https://i.imgur.com/JZIbhJE.png) 可以設定能不能被改能不能被列舉能不能被刪除 還可以設定getter/setter ![](https://i.imgur.com/zePYDH9.png) ``` xxx = {a:1} Object.defineProperty(xxx,'age',{value:18}) Object.keys(xxx) for let key in xxx{ console.log(xxx[key]) } ``` 看起來vue就是透過getter/setter去實現數據交換 這個是他底層的實作方式 vm._data就是data ```{{_data.name}}```也可以 數據代理就是setter/getter vm.name=>setter=>data..name js function居然允許不給值 print會變成undefined而已... 甚至允許丟給他額外的值 methods預設會丟event 但你可以不用任何變數去接收 event.target應該是dom可以用event.target.innerText去改值 method裡面不能用箭頭函數定義 會導致this會指到全域 nethod裡面不會有數據代理getter/setter只有data有 但是你把method放data也可以用 只是沒有意義 可以不給值預設是丟$event但是如果給值的話要自己丟.. 好白癡 ![](https://i.imgur.com/uGDnMdn.png) https://www.youtube.com/watch?v=u5hsbvN1fUM&list=PLmOn9nNkQxJEARHuEpVayY6ppiNlkvrnb&index=15&ab_channel=%E5%B0%9A%E7%A1%85%E8%B0%B7IT%E5%9F%B9%E8%AE%AD%E5%AD%A6%E6%A0%A1 15 事件修飾符 ```@click.prevent``` ![](https://i.imgur.com/4KtBbCX.png) 捕獲階段 外往內 冒泡階段 內往外 先捕獲在冒泡 click.capture可以強制在捕獲階段處理 click.passive 有點類似thread方式去執行你綁定的動作(滾動卷軸不會等待) 可以接著用 click.stop.prevent 16 鍵盤事件 @keyup e.keycode!=13 下面兩個寫法都可以綁定 @keyup.enter @keydown.13 連續使用的技巧 @keyup.ctrl.y ![](https://i.imgur.com/Vy5VaHQ.png) e.key,e.keycode可以看名稱跟編號 多個單字寫法比較特殊 e.CapsLock 這個我忘了反正就是隱藏設定 e.caps-lock 不是所有鍵盤事件都可以綁定(像調音量) tab鍵有點特殊要用@keydown.tab 還有ctrl,alt,shift,meta 系統修飾鍵 他有個命名規則 HTML的attribute不區分大小寫 組件可以用駝峰法和短橫線 dom必須用短橫線 可以自訂義但我打死都不會用 ![](https://i.imgur.com/AvTiZ6r.png) 18 計算屬性 computed 綁定事件@click = "show" ,"show()" 都可以 但是寫在裡面如果是method要加大誇胡 vue的特性是只要data裡面數據發生變動 他就會重新render page 所以你用method去寫在大誇湖裡call會重複地計算許多許多次 你敲個1234就會執行四次 在vue裡面 property相當於是data裡面記載的東西 有意思的是computed裡面會認為是property 開發者工具才可以看的出來差異 ![](https://i.imgur.com/zYYdUqd.png) 緩存機制 這邊很有意思computed的屬性值如果有存在 就不會連續的去做計算 只會執行一次 ![](https://i.imgur.com/LaPNlqM.png) 而且更有趣的是他會去看你依賴的數據 其他你不依賴的數據在data做改變computed也不會變更 有個細節如果你在全域設定一個let a = 5 然後去變更a的話他不認為a是他依賴的數據 通常只會寫getter 20 計算屬性簡寫 如果你只要getter可以直接寫 ``` computed: #some_val:function() some_val(){ return xxx } ``` 22 監視屬性 vm對象的$watch() or watch配置 我覺得很多是可以動態配置 因為在template只能用聲明式 不能用if,else 三元表達式 但是你可以用 a? b:c 開發者工具會有bug(不知道改了沒有) 如果前版沒刷新有可能數據不會更新 實際上有更新 method只有簡單判斷式 是可以直接調用的而且在attr裡面是可以用命令式的語法 ![](https://i.imgur.com/ylZspr4.png) 但是太複雜或是要引用其他變數不能用 即使你用window ![](https://i.imgur.com/vegAt5Y.png) windows是全域 你可以用弔詭寫法在data加上window 不知道為什麼他dict可以直接給物件window然後還呼叫的到 alert是個方便的function可以好好用 ``` watch:{ xxx_in_data:{ // xxx變動的時候會調用 // newValue,oldValue 可以不加 白吃的js immedeiate:false,//預設false 初始化時調用handler handler(newValue,oldValue){ } } } ``` watch看起來可以對特定狀態轉換或差值進行動作 watch可以監控data同時 computed的值也可以監控 所以computed其實就跟python property variable感覺差不多 不過不知道dict等有深度的是怎麼做的 動態增加的話用 vm.$watch('xxx_in_data',{}) 23 深度監視 javascript不用寫'key'去query dict是簡寫 你想要深度監視某個變數要用 "number.a":{ 如果要監控全部變數 numbers:{deep=true 24監視簡寫 如果不用immedeiate和deep watch{ ishot(newValue,oldValue){ //ishot是監控的變數 } } vm.$watch('ishot',function(){} ) 25 對比watch/computed c = this.a+this.b這種情況用computed比較好 而且用watch的情況你必須要給 c default值不然沒辦法存 在js沒辦法延遲給予return val 所以用watch可以異步用setTimeout去給予數值 但是computed沒有辦法他只能同步等待在回傳數值 因為watch是用命令式 c =this.a+this.b 但是computed是用聲明式 return this.a+this.b 大原則 正常用computed需要異步用watch 這裡有個地方要注意 setTimeout是程式裡面的模組 **必須**用箭頭含式不然他default會指向windows computed能完成的功能 watch都能完成 watch能完成的功能 computed不一定能完成 vue管理函數=>普通函數 不被vue管理的函數=>箭頭函數(定時器,ajax,Promise的回調) 簡單講你要確保this指到的是vm或組件實例 26 class style 綁定 bind class => :class="a"相當於是data的a class="b" :class ="a"最後會整合在一起 如果你寫 class = b class = a會造成只使用class b 要避免用dom操作元素 正確做法是綁定變數後 在透過this對data操作 ![](https://i.imgur.com/kKQeSyQ.png) 如果你要綁定多個class可以用 物件或是陣列/數組 b = ['classa','classb'] 去綁定 也可以用 b = classa:false,classb:true去綁定 v-for v-if 會受到key影響 在vue的架構裡面會頃向利用已經存在的物件 arr.shift=> python.pop arr.push=> python.append 數組/陣列=>list 物件=>dict 27 樣式綁定 style格式如果不符合會在瀏覽器直接看不到但也不報錯 也可以用兩種綁定方式 物件綁定/對象 :style= fontSize: fsize+'px' 這樣去綁定 陣列綁定/數組 我覺得沒意義他是用下面格式做的 list(dict) # [hexo](https://ithelp.ithome.com.tw/articles/10208376) 部屬部落格的套件 # [部落格第三方服務](https://ithelp.ithome.com.tw/articles/10208619) # [github project](https://ithelp.ithome.com.tw/articles/10205988) # [各種插件](https://ithelp.ithome.com.tw/articles/10204029) # [code pen](https://ithelp.ithome.com.tw/articles/10203414) # [百寶箱](https://ithelp.ithome.com.tw/users/20111449/ironman/1767) # [bootstrap vue](https://ithelp.ithome.com.tw/articles/10306181) # 泡泡 ![](https://i.imgur.com/tTSCNJl.png) # npm npm 的縮寫是「Node Package Manager」 # node.js node js 跟python 一樣有自己的shell可以執行 python是-c node是 -e node -e "console.log('hi')" shell底下離開是.exit 檔案執行也是node xxx.js # [vue cli](https://cli.vuejs.org/) [簡單介紹](https://ithelp.ithome.com.tw/articles/10280361) 打開Home.vue檔案會看到引入資料會使用@的方式,@的意思就是從src目錄來尋找 ## build pkg 正確方式應該把dist資料夾放到vscode以Live Server的方式啟動 ## [vue.config.js](https://ithelp.ithome.com.tw/articles/10281023) > vue ui # [typescript](https://www.zhihu.com/question/334938460) ![](https://i.imgur.com/mQYxgs7.png) # [Webpack](https://ithelp.ithome.com.tw/articles/10280361) Webpack是個整合工具可以運行各種環境,例如:Sass(CSS預處理器)、BABEL(JavaScript編譯器)、ESlint(程式碼檢視工具),開發過程中產生的Sass檔案、JavaScript檔案、Vue檔案,再由Webpack產生出能運行的HTML、CSS、Js檔案。 # [var let const](https://ithelp.ithome.com.tw/articles/10270095) # [Hoisting , undefined,not defined]() undefined不等於not defined undefined``是已經宣告變數了,JavaScript給的預設值。 not defined是創建環境時,沒有宣告加入記憶體,JavaScript找不到這個值。 # [css-loader](https://css-loader.raphaelfabeni.com/) # 基本設定 typescript暫時不要用 ![](https://i.imgur.com/Mqcdf7v.png) ![](https://i.imgur.com/dXwKRi0.png) # [cheat sheet](https://www.vuemastery.com/pdf/Vue-Essentials-Cheat-Sheet.pdf) # [vscode 套件](https://www.youtube.com/watch?v=oGGBvS6MrmE&ab_channel=MakeAppswithDanny) # [動態同步 Fetch vs Axios](gushiciku.cn/pl/pjgD/zh-tw) 都是js的資料庫坦白說都可以 # [CDN vs SFC](https://stackoverflow.com/questions/46214132/how-can-i-combine-vue-js-with-flask) 簡單講就是單獨使用可以但是 如果你要用SFC管理和搭配NPM套件做成WEB package 目前沒有看到python有這個做法 所以要這樣做就只能前後端分離 # code pen ## [範本](https://codepen.io/fly50789/pen/LYjjWYq) 尚且不知道vue pen跟project功能 # ref [範例](https://vuejsexamples.com/) [官網](https://v3.cn.vuejs.org/guide/introduction.html) [chrome extension](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=en) 安裝完後要去設定"Allow access to file URLs"不然會偵測不到 [cheat sheet](https://www.vuemastery.com/pdf/Vue-Essentials-Cheat-Sheet.pdf) # 幫幫忙 ## [實作小範例入門 Vue & Vuex 2.0 ](https://ithelp.ithome.com.tw/users/20103326/ironman/1114) ## [少年學Vue,如隙中窺月](https://ithelp.ithome.com.tw/users/20127466/ironman/3087) ## [ 重構倒數30天,你的網站不Vue白不Vue](https://ithelp.ithome.com.tw/users/20125854/ironman/4112?page=1) ### [所有範例](https://codepen.io/collection/dbkPGQ) ### 基本架構 可以用css seletor去綁定物件 不知道可不可以綁複數物件 因為他可以綁class ``` var app = new Vue({ el:'#app', data:{ text:'Hello World' } }) <div id="app"> </div> 也可以用class=>class="app" =>el:".app" ``` ### MVVM View 代表顯示在畫面的樣子,像是按鈕、文字輸入欄位等等 Model 主要取用資料的部分 ViewModel 將資料和畫面綁定的連結器 ### [資料和畫面綁定常用的方式](https://codepen.io/fly50789/pen/xxLPpBQ) * v-text 只有文字你就算寫<href>這種標籤也無效果應該是自動跳脫 * v-html 會直接改變內建的內容你可以用標籤給值 * v-model 常用在輸入欄位或表單值的綁定,像是上面的 input 輸入欄位就綁定資料 message,當 input 值改變則 message 值也會跟著改變, ### [物件和陣列](https://codepen.io/fly50789/pen/BadmJbz) 自己看 ### [v-for v-if](https://codepen.io/fly50789/pen/NWvwyxg) 跟python相反先item在index ``` <li v-for="(item,index) in test">{{index}}.{{item.name}} 得分:{{item.score}}</li> ``` ### [欄位資料綁定](https://codepen.io/fly50789/pen/oNepNQG) * Text * Checkbox (多選) * Radio (單選) * Select 下拉式選單 (單選) ### [動態屬性指令(v-bind)](https://codepen.io/pen?template=LYjjWYq) 看不懂規則 可能{{}}這種寫法有限定它的範圍? ``` 不能這樣引用 <img src="{{url}}" alt=""> <img v-bind:src="url" alt=""> ``` 感覺v-bind是綁定property 要用v-bind:prperty_name = property_value ``` <p v-bind:class="{'red':isRed,'bold':isBold}"> ``` ### [操作頁面行為(v-on)](https://codepen.io/fly50789/pen/KKvZpwv?editors=1111) v-on:click="reverse" v-on是綁定動作如上方click動作綁定reverse這個function 這個function必須 很愚蠢 js的string本身沒有reverse只有list有 所以只能split('').reverse().join('') 這邊可以看到vue物件的主要成分其實很像class 我覺得很像是property的綁定方式 * el:綁定物件最重要沒綁就沒能力了 * data:內部資料 類似class/instance var * methods:綁定的方法 類似class_method ``` var app = new Vue({ el:'.app', data:{ text:'1234' }, methods: { reverse:function (){ this.text=this.text.split('').reverse().join(''); }, } }); ``` ### [修飾符與簡寫](https://codepen.io/fly50789/pen/abyqqqR?editors=1111) 可以看到事件怎麼處理的 像是event可以加上click.prevent就可以避免 原本click的動作觸發 或是在原本function增加e的變數去設定e.preventDefault() [v-bind,v-on縮寫](http://blog.wingzero.tw/2018/08/vuejs-v-bind-v-on.html) * v-bind: : * v-on: @ ### [資料綁定 v-once](https://codepen.io/fly50789/pen/PoKQejx) 用once資料不會隨著vue的data變動只會被渲染一次 在{{}}類似python f-string可以進行一些運算 ### [動態切換 ClassName]() 幫幫忙 https://ithelp.ithome.com.tw/articles/10244666 ## [勇者鬥Vue龍](https://ithelp.ithome.com.tw/users/20107789/ironman/1710) ## [30天手把手的vue.js教學](https://ithelp.ithome.com.tw/users/20129072/ironman/3052) # 初始 template(含jquery) # 筆記 [document.ready的寫法](https://matthung0807.blogspot.com/2017/11/jquery-document-ready.html) 因為不等物件load完的話 vue先執行會找不到物件需要ready ``` jquery用法 $( document ).ready(function() { // 在這撰寫javascript程式碼 }); 效果同$( document ).ready()。 $(function() { // 在這撰寫javascript程式碼 }); 純Javascript的寫法。(注意,window.onload和$( document ).ready()的觸發順序仍有差異。) window.onload = function() { // 在這撰寫javascript程式碼 }; ``` # 問題 1. 可以綁複數物件嗎? 可以但會怪怪的 不知道要怎麼避免app變數的重複根掛載特性 2. v-bind不懂{{}}呼叫可用範圍 ``` Fail <img src="{{url}}" alt=""> Pass <img v-bind:src="url" alt=""> ``` 3. vue的data呼叫範圍是根據綁定物件的child和自身可以呼叫到嗎?還是有甚麼限制? ``` <div id = 'app' ,{{a}}> {{b}} </div> ``` # [008天](https://book.vue.tw/CH1/1-1-introduction.html) ``` npm run serve ``` package-lock.json:簡單來說就是鎖定安裝模塊的版本號 ![](https://i.imgur.com/qJ6mGDS.png) ![](https://i.imgur.com/tBDaOMM.png) ![](https://i.imgur.com/BsFO2cj.png) 生命週期與 Hooks function ![](https://i.imgur.com/nTNM1Op.png) ![](https://i.imgur.com/zqpImkM.png) ![](https://i.imgur.com/7Di18Zh.png) SFC ![](https://i.imgur.com/T1cuwkF.png) ![](https://i.imgur.com/zMGNm9K.png) ![](https://i.imgur.com/35i9qRY.png) vuex ![](https://i.imgur.com/JOegr3W.png) ![](https://i.imgur.com/n27k6tf.png) ![](https://i.imgur.com/UGn4ADD.png) Vue Event $emit / $on DRY 原則 Do not repeat yourself var 作用域是 function scope,let 作用域是 block # 各種設定微調 # eslintrc.js vscode的jslint會跳紅字 ``` parserOptions: { parser: "@babel/eslint-parser", requireConfigFile: false, }, ``` # 開發工具 ## [vuedevtools](https://ithelp.ithome.com.tw/articles/10186713) # nuxt https://www.youtube.com/watch?v=GBdO5myZNsQ&ab_channel=NetNinja https://nuxt.com/docs/getting-started/introduction # fakestoreapi https://fakestoreapi.com/