├── .gitignore ├── deploy.sh ├── gulpfile.js ├── package-lock.json ├── package.json └── source ├── _layout.ejs ├── advApi ├── _adv-component-v-model.ejs ├── _adv-extend.ejs ├── _adv-mixins.ejs ├── _adv-provide.ejs ├── _adv-refs.ejs ├── _adv-teleport.ejs ├── _adv-use-plugin.ejs ├── _adv-vee-validation.ejs ├── adv-component-v-model.ejs ├── adv-directive.ejs ├── adv-extend.ejs ├── adv-mixins.ejs ├── adv-provide.ejs ├── adv-refs.ejs ├── adv-teleport.ejs ├── adv-use-plugin.ejs ├── adv-vee-validation.ejs ├── zh_TW.js └── zh_TW.json ├── components ├── _component_emits.ejs ├── _component_emits_api.ejs ├── _component_mitt.ejs ├── _component_props.ejs ├── _component_props_type.ejs ├── _component_register.ejs ├── _component_slot.ejs ├── _component_slot_props.ejs ├── _component_template.ejs ├── alert-component.js ├── component_emits.ejs ├── component_emits_api.ejs ├── component_final.ejs ├── component_mitt.ejs ├── component_props.ejs ├── component_props_type.ejs ├── component_register.ejs ├── component_slot.ejs ├── component_slot_props.ejs └── component_template.ejs ├── es6 ├── _esModule.ejs ├── _esModule_2.ejs ├── _object_reference.ejs ├── _promise.ejs ├── _separation_of_concerns.ejs ├── _separation_of_concerns_work.ejs ├── _shorthand.ejs ├── arrow_function.ejs ├── defaultExport.js ├── esModule.ejs ├── esModule_2.ejs ├── namedExport.js ├── object_reference.ejs ├── promise.ejs ├── separation_of_concerns.ejs ├── separation_of_concerns_work.ejs ├── shorthand.ejs ├── sideEffect.js └── this.ejs ├── index.ejs ├── intro ├── _final.ejs ├── _final_d.ejs ├── _intro_add_data.ejs ├── _intro_edit_data.ejs ├── _intro_render_vfor.ejs ├── _two_way_binding.ejs ├── basic_structure.ejs ├── createApp.ejs ├── final.ejs ├── intro_add_data.ejs ├── intro_edit_data.ejs ├── intro_render_vfor.ejs └── two_way_binding.ejs ├── optionsApi ├── _options-computed.ejs ├── _options-methods.ejs ├── _options-watch.ejs ├── options-api.ejs ├── options-computed.ejs ├── options-final.ejs ├── options-final_answer.ejs ├── options-life-cycle.ejs ├── options-methods.ejs └── options-watch.ejs ├── partials ├── footer.ejs ├── menu.ejs └── navbar.ejs ├── router ├── _vue_router.ejs └── vue_router.ejs ├── stylesheets ├── all.scss ├── components │ ├── _demo.scss │ ├── _footer.scss │ └── _utilities.scss └── helpers │ └── _variables.scss └── template ├── _directive-final.ejs ├── _form.ejs ├── _v-bind.ejs ├── _v-for.ejs ├── _v-if.ejs ├── _v-model-modifiers.ejs ├── _v-on-dom-event.ejs ├── _v-on-modifiers.ejs ├── _v-on.ejs ├── _v-style.ejs ├── _v-text.ejs ├── directive-final-answer.ejs ├── directive-final.ejs ├── form.ejs ├── v-bind.ejs ├── v-for.ejs ├── v-if.ejs ├── v-model-modifiers.ejs ├── v-on-dom-event.ejs ├── v-on-modifiers.ejs ├── v-on.ejs ├── v-style.ejs └── v-text.ejs /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | public 4 | .publish -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 錯誤終止腳本 4 | set -e 5 | 6 | # 運行 gulp build 7 | gulp build 8 | 9 | cd public 10 | 11 | git init 12 | git add -A 13 | git commit -m 'deploy' 14 | 15 | git push -f git@github.com:hexschool/vue3-starter-files.git master:gh-pages 16 | 17 | cd - -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 2 | const gulp = require('gulp'); 3 | const $ = require('gulp-load-plugins')(), 4 | browserSync = require('browser-sync'), 5 | autoprefixer = require('autoprefixer'); 6 | 7 | const minimist = require('minimist'); // 用來讀取指令轉成變數 8 | 9 | // production || development 10 | // # gulp --env production 11 | var envOptions = { 12 | string: 'env', 13 | default: { env: 'development' } 14 | }; 15 | var options = minimist(process.argv.slice(2), envOptions); 16 | console.log(options); 17 | 18 | gulp.task('clean', function () { 19 | return gulp.src(['./public', './.tmp'], { read: false, allowEmpty: true }) // 選項讀取:false阻止gulp讀取文件的內容,使此任務更快。 20 | .pipe($.clean()); 21 | }); 22 | 23 | gulp.task('layout', function () { 24 | console.log('layout'); 25 | return gulp.src(['./source/**/*.ejs', './source/**/*.html']) 26 | .pipe($.plumber()) 27 | // .pipe($.changed('./public', { extension: '.html' })) 28 | .pipe($.frontMatter()) 29 | .pipe($.layout(function (file) { 30 | return file.frontMatter 31 | })) 32 | .pipe(gulp.dest('./public')) 33 | .pipe(browserSync.reload({ 34 | stream: true 35 | })) 36 | }); 37 | gulp.task('cleanExtra', function () { 38 | return gulp.src(['./public/**/*.ejs', './public/**/_*.html']) 39 | .pipe($.clean()); 40 | }) 41 | 42 | gulp.task('copy', function () { 43 | return gulp.src(['./source/**/*.js', './source/**/*.json']) 44 | .pipe($.plumber()) 45 | .pipe(gulp.dest('./public')) 46 | .pipe(browserSync.reload({ 47 | stream: true 48 | })) 49 | }); 50 | 51 | gulp.task('sass', function () { 52 | // PostCSS AutoPrefixer 53 | var processors = [ 54 | autoprefixer({ 55 | browsers: ['last 5 version'], 56 | }) 57 | ]; 58 | 59 | return gulp.src(['./source/stylesheets/**/*.sass', './source/stylesheets/**/*.scss']) 60 | .pipe($.plumber()) 61 | .pipe($.sourcemaps.init()) 62 | .pipe($.sass({ 63 | outputStyle: 'nested', 64 | includePaths: ['./node_modules/bootstrap/scss/'] 65 | }) 66 | .on('error', $.sass.logError)) 67 | .pipe($.postcss(processors)) 68 | .pipe($.if(options.env === 'production', $.minifyCss())) // 假設開發環境則壓縮 CSS 69 | .pipe($.sourcemaps.write('.')) 70 | .pipe(gulp.dest('./public/stylesheets')) 71 | .pipe(browserSync.reload({ 72 | stream: true 73 | }));; 74 | }); 75 | 76 | gulp.task('imageMin', function () { 77 | return gulp.src('./source/images/*') 78 | .pipe($.if(options.env === 'production', $.imagemin())) 79 | .pipe(gulp.dest('./public/images')); 80 | }); 81 | 82 | gulp.task('vendorJs', function () { 83 | return gulp.src([ 84 | './node_modules/bootstrap/dist/js/bootstrap.bundle.js' 85 | ]) 86 | .pipe($.order([ 87 | 'bootstrap.js' 88 | ])) 89 | .pipe($.concat('vendor.js')) 90 | // .pipe($.if(options.env === 'production', $.uglify())) 91 | .pipe(gulp.dest('./public/javascripts')) 92 | }) 93 | 94 | gulp.task('browserSync', function () { 95 | return browserSync.init({ 96 | server: { baseDir: './public' }, 97 | reloadDebounce: 2000 98 | }) 99 | }); 100 | 101 | gulp.task('deploy', function () { 102 | return gulp.src('./public/**/*').pipe( 103 | $.ghPages({ 104 | remoteUrl: 'git@github.com:hexschool/vue3-starter-files.git', 105 | }) 106 | ); 107 | }) 108 | 109 | gulp.task('watch', function (done) { 110 | gulp.watch(['./source/**/*.ejs'], gulp.parallel('layout')); 111 | gulp.watch(['./source/stylesheets/**/*.sass', './source/stylesheets/**/*.scss'], gulp.parallel('sass')); 112 | // gulp.watch(['./source/**/*.jade'], ['jade']); 113 | gulp.watch(['./source/**/*.js'], gulp.parallel('copy')); 114 | done(); 115 | }); 116 | 117 | gulp.task( 118 | 'default', 119 | gulp.series( 120 | 'layout', 121 | 'sass', 122 | 'copy', 123 | 'vendorJs', 124 | // 'browserSync', 125 | 'imageMin', 126 | // 'cleanExtra', 127 | gulp.parallel('watch'), 128 | function(done) { 129 | browserSync.init({ 130 | server: { baseDir: './public' }, 131 | reloadDebounce: 2000, 132 | }); 133 | 134 | gulp.watch(['./source/**/*.ejs'], gulp.series('layout')); 135 | gulp.watch(['./source/**/*.js'], gulp.parallel('copy')); 136 | 137 | 138 | } 139 | ) 140 | ); 141 | gulp.task( 142 | 'build', 143 | gulp.series('clean', 'layout', 'sass', 'copy', 'vendorJs', 'imageMin', 'cleanExtra') 144 | ); 145 | 146 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp-demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "autoprefixer": "^6.7.7", 13 | "babel-preset-es2015": "^6.24.1", 14 | "browser-sync": "^2.18.8", 15 | "gulp-babel": "^6.1.2", 16 | "gulp-clean": "^0.3.2", 17 | "gulp-concat": "^2.6.1", 18 | "gulp-if": "^2.0.2", 19 | "gulp-imagemin": "^3.2.0", 20 | "gulp-jade": "^1.1.0", 21 | "gulp-load-plugins": "^1.5.0", 22 | "gulp-minify-css": "^1.2.4", 23 | "gulp-plumber": "^1.1.0", 24 | "gulp-postcss": "^6.4.0", 25 | "gulp-sass": "^3.1.0", 26 | "gulp-sequence": "^0.4.6", 27 | "gulp-sourcemaps": "^2.6.0", 28 | "gulp-uglify": "^2.1.2", 29 | "main-bower-files": "^2.13.1", 30 | "minimist": "^1.2.0" 31 | }, 32 | "dependencies": { 33 | "bootstrap": "^5.0.0-beta1", 34 | "ejs": "^2.5.7", 35 | "gulp": "^4.0.2", 36 | "gulp-changed": "^3.2.0", 37 | "gulp-clean": "^0.3.2", 38 | "gulp-data": "^1.2.1", 39 | "gulp-front-matter": "^1.3.0", 40 | "gulp-gh-pages": "^0.5.4", 41 | "gulp-layout": "0.0.4", 42 | "gulp-order": "^1.1.1", 43 | "gulp-watch": "^4.3.11", 44 | "jquery": "^3.3.1", 45 | "lodash": "^4.17.4", 46 | "vue": "^3.0.2" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /source/advApi/_adv-component-v-model.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 製作包含 v-model 的元件 3 | layout: ./source/_layout.ejs 4 | current: adv-component-v-model 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

自訂義 input 元件(update:modelValue)

11 |

參考說明:https://vue3js.cn/docs/zh/guide/component-custom-events.html#v-model-%E5%8F%82%E6%95%B0

12 | {{ name }} 13 | 14 | 15 |
16 |

多個 v-model

17 | {{ text }} {{ text2 }} 18 | 19 |
20 | 21 | 59 | -------------------------------------------------------------------------------- /source/advApi/_adv-extend.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Extend 擴展 3 | layout: ./source/_layout.ejs 4 | current: adv-extend 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

單一擴展

11 | 12 | 13 |

權重

14 |

元件屬性 > mixins > extend

15 | 16 | 17 | 18 |

重點:

19 | 24 |
25 | 26 | 74 | -------------------------------------------------------------------------------- /source/advApi/_adv-mixins.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Mixins 混合 3 | layout: ./source/_layout.ejs 4 | current: adv-mixins 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

單一混合、多個混合

11 | 12 | 13 |

重點:

14 | 19 |
20 | 21 | 58 | -------------------------------------------------------------------------------- /source/advApi/_adv-provide.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 跨元件資訊傳遞 Provide 3 | layout: ./source/_layout.ejs 4 | current: adv-provide 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

多層級資訊傳遞

11 | 12 | 13 |

注意事項:響應式

14 | 15 |
16 | 17 | 82 | -------------------------------------------------------------------------------- /source/advApi/_adv-refs.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Refs 3 | layout: ./source/_layout.ejs 4 | current: adv-refs 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

使用 ref 定義元素

11 | 12 | 13 |

使用 ref 取得元件內的資訊

14 | 15 | 16 | 17 |

進階,使用 ref 搭配 Bootstrap

18 | 19 | 36 | 37 |
38 | 39 | 40 | 85 | -------------------------------------------------------------------------------- /source/advApi/_adv-teleport.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Teleport 3 | layout: ./source/_layout.ejs 4 | current: adv-teleport 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |
11 | 12 |

Teleport 自訂義元件位置

13 | 14 | 15 |

使用限制(錯誤情境)

16 | 17 | 18 |

實用技巧(取代標題、多個)

19 | 20 |
21 | 22 | 63 | -------------------------------------------------------------------------------- /source/advApi/_adv-use-plugin.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 製作包含 v-model 的元件 3 | layout: ./source/_layout.ejs 4 | current: adv-use-plugin 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

運用外部套件

11 | 12 |

外部套件匯入方式

13 | 19 | 20 |

使用外部套件注意事項:

21 | 26 | 27 |

範例:載入 VeeValidate 驗證套件

28 | 29 | {{ errors }} 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |

比對與 ESM 版本上的差異

38 | 39 |
40 | 41 | 68 | 69 | 90 | -------------------------------------------------------------------------------- /source/advApi/_adv-vee-validation.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 表單驗證套件 3 | layout: ./source/_layout.ejs 4 | current: adv-vee-validation 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

套用一個現成的流程

11 |

參考文件:https://hackmd.io/FFv0a5cBToOATP7uI5COMQ

12 | 13 |

範例:載入 VeeValidate 驗證套件

14 | 15 | {{ errors }} {{ values }} 16 | 17 |
18 | 19 | 21 | 22 |
23 | 24 |
25 | 26 | 28 | 29 |
30 | 31 |
32 | 33 | 35 | 36 |
37 | 38 |
39 | 40 | 42 | 43 | 44 | 45 | 46 | 47 |
48 | 49 |
50 | 51 | 53 | 54 |
55 | 56 | 57 | 58 |
59 | 60 |
61 | 62 | 63 | 64 | 115 | -------------------------------------------------------------------------------- /source/advApi/adv-component-v-model.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 製作包含 v-model 的元件 3 | layout: ./source/_layout.ejs 4 | current: adv-component-v-model 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

將元件內的值傳回 v-model(update:modelValue)

11 |

參考說明:https://vue3js.cn/docs/zh/guide/component-custom-events.html#v-model-%E5%8F%82%E6%95%B0

12 | {{ name }} 13 | 14 | 15 |
16 |

多個 v-model

17 | {{ text }} {{ text2 }} 18 | 19 |
20 | 21 | 53 | -------------------------------------------------------------------------------- /source/advApi/adv-directive.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 自訂義指令 3 | layout: ./source/_layout.ejs 4 | current: adv-directive 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

自訂義指令

11 |

用途

12 | 17 | 18 |

結構

19 | 24 | 25 | 26 |
27 | 72 | 73 | 94 | -------------------------------------------------------------------------------- /source/advApi/adv-extend.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Extend 擴展 3 | layout: ./source/_layout.ejs 4 | current: adv-extend 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

單一擴展

11 | 12 | 13 |

權重

14 | 15 | 16 | 17 |

重點:

18 | 24 |
25 | 26 | 78 | -------------------------------------------------------------------------------- /source/advApi/adv-mixins.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Mixins 混合 3 | layout: ./source/_layout.ejs 4 | current: adv-mixins 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

單一混合、多個混合

11 | 12 | 13 |

重點:

14 | 19 |
20 | 21 | 57 | -------------------------------------------------------------------------------- /source/advApi/adv-provide.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 跨元件資訊傳遞 Provide 3 | layout: ./source/_layout.ejs 4 | current: adv-provide 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

多層級資訊傳遞

11 | 15 | 16 | 17 |

注意事項:響應式

18 | 19 |
20 | 21 | 70 | -------------------------------------------------------------------------------- /source/advApi/adv-refs.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Refs 3 | layout: ./source/_layout.ejs 4 | current: adv-refs 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

使用 ref 定義元素

11 | 12 | 13 |

使用 ref 取得元件內的資訊

14 | 15 | 16 | 17 |

進階,使用 ref 搭配 Bootstrap

18 | Bootstrap Modal: https://getbootstrap.com/docs/5.0/components/modal/ 19 | 20 | 37 | 38 |
39 | 40 | 41 | 79 | -------------------------------------------------------------------------------- /source/advApi/adv-teleport.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Teleport 3 | layout: ./source/_layout.ejs 4 | current: adv-teleport 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |
11 | 12 |

Teleport 自訂義元件位置

13 | 結構:<teleport to="{ target }"> 14 | 15 | 16 |

使用限制(錯誤情境)

17 | 18 | 19 |

實用技巧(取代標題、多個)

20 | 21 |
22 | 23 | 62 | -------------------------------------------------------------------------------- /source/advApi/adv-use-plugin.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 外部套件引用 3 | layout: ./source/_layout.ejs 4 | current: adv-use-plugin 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 | 11 |

外部套件匯入方式

12 | 17 | 18 |

使用外部套件注意事項:

19 | 24 | 25 |

範例:載入 VeeValidate 驗證套件

26 |
27 | 28 | 29 | 30 | 請填寫此欄位 31 | 32 | 33 |
34 | 35 |

比對與 ESM 版本上的差異

36 | 37 |
38 | 39 | 58 | 59 | 80 | -------------------------------------------------------------------------------- /source/advApi/adv-vee-validation.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 表單驗證套件 3 | layout: ./source/_layout.ejs 4 | current: adv-vee-validation 5 | menu: advApi 6 | engine: ejs 7 | --- 8 | 9 |
10 |

套用一個現成的流程

11 |

參考文件:https://hackmd.io/FFv0a5cBToOATP7uI5COMQ

12 | 13 |

範例:載入 VeeValidate 驗證套件

14 |
15 |
16 | 17 | 19 | 20 |
21 | 22 |
23 | 24 | 26 | 27 |
28 | 29 |
30 | 31 | 33 | 34 |
35 | 36 |
37 | 38 | 43 | 44 |
45 | 46 |
47 | 48 | 50 | 51 |
52 | 53 | 54 |
55 | 56 |
57 | 58 | 59 | 60 | 89 | -------------------------------------------------------------------------------- /source/advApi/zh_TW.js: -------------------------------------------------------------------------------- 1 | export default { 2 | code: "zh_TW", 3 | messages: { 4 | alpha: "{field} 須以英文組成", 5 | alpha_dash: "{field} 須以英數、斜線及底線組成", 6 | alpha_num: "{field} 須以英數組成", 7 | alpha_spaces: "{field} 須以英文及空格組成", 8 | between: "{field} 須介於 0:{min} 至 1:{max}之間", 9 | confirmed: " {field} 不一致", 10 | digits: "{field} 須為 0:{length} 位數字", 11 | dimensions: "{field} 圖片尺寸不正確。須為 0:{width} x 1:{height} 像素", 12 | email: "{field} 須為有效的電子信箱", 13 | excluded: "{field} 的選項無效", 14 | ext: "{field} 須為有效的檔案", 15 | image: "{field} 須為圖片", 16 | one_of: "{field} 的選項無效", 17 | integer: "{field} 須為整數", 18 | length: "{field} 的長度須為 0:{length}", 19 | max: "{field} 不能大於 0:{length} 個字元", 20 | max_value: "{field} 不得大於 0:{max}", 21 | mimes: "{field} 須為有效的檔案類型", 22 | min: "{field} 不能小於 0:{length} 個字元", 23 | min_value: "{field} 不得小於 0:{min}", 24 | numeric: "{field} 須為數字", 25 | regex: "{field} 的格式錯誤", 26 | required: "{field} 為必填", 27 | required_if: "{field} 為必填", 28 | size: "{field} 的檔案須小於 0:{size}KB" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /source/advApi/zh_TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": "zh_TW", 3 | "messages": { 4 | "alpha": "{field} 須以英文組成", 5 | "alpha_dash": "{field} 須以英數、斜線及底線組成", 6 | "alpha_num": "{field} 須以英數組成", 7 | "alpha_spaces": "{field} 須以英文及空格組成", 8 | "between": "{field} 須介於 0:{min} 至 1:{max}之間", 9 | "confirmed": " {field} 不一致", 10 | "digits": "{field} 須為 0:{length} 位數字", 11 | "dimensions": "{field} 圖片尺寸不正確。須為 0:{width} x 1:{height} 像素", 12 | "email": "{field} 須為有效的電子信箱", 13 | "excluded": "{field} 的選項無效", 14 | "ext": "{field} 須為有效的檔案", 15 | "image": "{field} 須為圖片", 16 | "one_of": "{field} 的選項無效", 17 | "integer": "{field} 須為整數", 18 | "length": "{field} 的長度須為 0:{length}", 19 | "max": "{field} 不能大於 0:{length} 個字元", 20 | "max_value": "{field} 不得大於 0:{max}", 21 | "mimes": "{field} 須為有效的檔案類型", 22 | "min": "{field} 不能小於 0:{length} 個字元", 23 | "min_value": "{field} 不得小於 0:{min}", 24 | "numeric": "{field} 須為數字", 25 | "regex": "{field} 的格式錯誤", 26 | "required": "{field} 為必填", 27 | "required_if": "{field} 為必填", 28 | "size": "{field} 的檔案須小於 0:{size}KB" 29 | } 30 | } -------------------------------------------------------------------------------- /source/components/_component_emits.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Emit 傳遞事件 3 | layout: ./source/_layout.ejs 4 | current: component_emits 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Emit 處發外部事件

11 | 16 | {{ num }} 17 | 20 | 21 |

傳遞資料狀態

22 | 內部傳來的文字:{{ text }}
23 | 26 | 27 |

命名注意

28 |

駝峰的大寫文字,可以改為 `-` 進行串接

29 | 內部傳來的文字:{{ text }}
30 | 33 |
34 | 35 | 92 | -------------------------------------------------------------------------------- /source/components/_component_emits_api.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Emits API 3 | layout: ./source/_layout.ejs 4 | current: component_emits_api 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Emits API

11 | {{ num }} 12 | 13 | 14 |

驗證資料內容

15 | 16 | 17 |
18 | 19 | 68 | -------------------------------------------------------------------------------- /source/components/_component_mitt.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件插巢 3 | layout: ./source/_layout.ejs 4 | current: component_mitt 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

跨元件溝通

11 |

套件路徑:https://github.com/developit/mitt

12 | 13 | 14 | 15 |
16 | 17 | 67 | -------------------------------------------------------------------------------- /source/components/_component_props.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Props 3 | layout: ./source/_layout.ejs 4 | current: component_props 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Props 靜態資料

11 |

由外部傳入資料至內部

12 | 13 | 14 | 15 | 16 |

動態資源

17 |

技巧:前內、後外

18 | 19 | 20 |

單向數據流

21 | 22 | 23 |

命名限制

24 | 25 |
26 | 27 | 54 | -------------------------------------------------------------------------------- /source/components/_component_props_type.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Props 型別與驗證 3 | layout: ./source/_layout.ejs 4 | current: component_props_type 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Props 型別技巧

11 | 12 | 13 | 14 | 15 | 16 | 17 |

定義 Props 型別驗證

18 |

實戰中不太會用到全部技巧,常用的有:

19 | 24 | 29 | 30 |
31 | 32 | 95 | -------------------------------------------------------------------------------- /source/components/_component_register.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件註冊 3 | layout: ./source/_layout.ejs 4 | current: component_register 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

元件基本範例及結構

11 |

元件使用的基本要點

12 | 18 | 19 | 20 |

不同元件的註冊方式

21 | 22 |

23 | 全域註冊 24 |

25 |

此 createApp 下,任何子元件都可運用,在中小型專案、一般頁面開發很方便

26 | 27 | 28 |

區域註冊

29 |

限制在特定元件下才可使用,在 Vue Cli 中很常使用此方法(便於管理)

30 | 31 | 32 |

模組化

33 |

同屬於區域註冊,Vue Cli 中的實戰運用技巧

34 | 35 |
36 | 37 | 91 | -------------------------------------------------------------------------------- /source/components/_component_slot.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件插巢 3 | layout: ./source/_layout.ejs 4 | current: component_slot 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Slot 插巢與插巢預設值

11 | 12 |

這是外部撰寫的文字

13 |
14 |
15 | 16 | 17 |

具名插巢

18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |

具名插巢縮寫

27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
35 | 36 | 69 | -------------------------------------------------------------------------------- /source/components/_component_slot_props.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件插巢 3 | layout: ./source/_layout.ejs 4 | current: component_slot_props 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

插巢 Prop

11 |

將元件內的變數取出使用,稱為 slot prop

12 | 13 | 16 | 17 |
18 |

傳入、傳出

19 | 20 | 25 | 26 | 27 |
28 |

多個(解構)

29 | 30 | 33 | 39 | 40 |
41 | 42 | 122 | -------------------------------------------------------------------------------- /source/components/_component_template.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件樣板及綁定方式 3 | layout: ./source/_layout.ejs 4 | current: component_template 5 | menu: components 6 | engine: ejs 7 | --- 8 |
9 |

常見的模板建立方式

10 | 11 |

template

12 | 13 | 14 |

x-template

15 | 16 | 17 |

單文件元件

18 |

本章節不介紹,在 Vue Cli 課程中將會實作(較為簡單,使用與 x-template 接近)

19 | 20 |
21 |

元件綁定方式

22 |

直接使用 標籤名稱

23 | 24 | 25 |

搭配 v-for 也是沒問題的

26 | 27 | 28 |

使用 is 綁定

29 |
30 | 31 |

動態屬性

32 | 33 | 34 |

任何標籤均可搭配 v-is 進行動態切換

35 |
36 | 37 |

component 標籤中,可以使用 is 縮寫(由 v2 版轉移過來的功能)

38 | 39 | 40 |

動態標籤實戰技巧

41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
標題內文
52 |
53 | 58 | 59 | 89 | -------------------------------------------------------------------------------- /source/components/alert-component.js: -------------------------------------------------------------------------------- 1 | export default { 2 | data() { 3 | return { 4 | text: '這是模組化元件' 5 | }; 6 | }, 7 | template: `` 10 | } 11 | -------------------------------------------------------------------------------- /source/components/component_emits.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Emit 傳遞事件 3 | layout: ./source/_layout.ejs 4 | current: component_emits 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Emit 處發外部事件

11 | 16 | {{ num }} 17 | 20 | 21 |

傳遞資料狀態

22 | 內部傳來的文字:{{ text }}
23 | 26 | 27 |

命名注意

28 |

駝峰的大寫文字,可以改為 `-` 進行串接

29 | 內部傳來的文字:{{ text }}
30 | 33 |
34 | 35 | 87 | -------------------------------------------------------------------------------- /source/components/component_emits_api.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Emits 驗證 3 | layout: ./source/_layout.ejs 4 | current: component_emits_api 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Emits API

11 | {{ num }} 12 | 13 | 14 |

驗證資料內容

15 | 16 | 17 |
18 | 19 | 55 | -------------------------------------------------------------------------------- /source/components/component_mitt.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 跨元件溝通 3 | layout: ./source/_layout.ejs 4 | current: component_mitt 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

將元件內的變數取出使用,稱為 slot prop

11 |

套件路徑:https://github.com/developit/mitt

12 | 13 | 14 | 15 |
16 | 17 | 63 | -------------------------------------------------------------------------------- /source/components/component_props.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Props 3 | layout: ./source/_layout.ejs 4 | current: component_props 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Props 靜態資料

11 |

由外部傳入資料至內部

12 | 外部資源:https://images.unsplash.com/photo-1605784401368-5af1d9d6c4dc?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=600&q=80 13 | 14 | 15 |

動態資源

16 |

技巧:前內、後外

17 | 18 | 19 |

單向數據流

20 | 21 | 22 |

命名限制

23 | 24 |
25 | 26 | 52 | -------------------------------------------------------------------------------- /source/components/component_props_type.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Props 型別與驗證 3 | layout: ./source/_layout.ejs 4 | current: component_props_type 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Props 型別技巧

11 | 12 | 13 | 14 | 15 | 16 | 17 |

定義 Props 型別驗證

18 |

實戰中不太會用到全部技巧,常用的有:

19 | 23 | 28 | 29 |
30 | 31 | 92 | -------------------------------------------------------------------------------- /source/components/component_register.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件註冊 3 | layout: ./source/_layout.ejs 4 | current: component_register 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

元件基本範例及結構

11 |

元件使用的基本要點

12 | 18 | 19 |

不同元件的註冊方式

20 | 21 |

22 | 全域註冊 23 |

24 |

此 createApp 下,任何子元件都可運用,在中小型專案、一般頁面開發很方便

25 | 26 | 27 |

區域註冊

28 |

限制在特定元件下才可使用,在 Vue Cli 中很常使用此方法(便於管理)

29 | 30 | 31 |

模組化

32 |

同屬於區域註冊,Vue Cli 中的實戰運用技巧

33 | 34 |
35 | 36 | 58 | -------------------------------------------------------------------------------- /source/components/component_slot.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件插巢 3 | layout: ./source/_layout.ejs 4 | current: component_slot 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

Slot 插巢與插巢預設值

11 | 12 | 13 |
14 | 15 | 16 |

具名插巢

17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |

具名插巢縮寫

26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
34 | 35 | 68 | -------------------------------------------------------------------------------- /source/components/component_slot_props.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件插巢 Props 3 | layout: ./source/_layout.ejs 4 | current: component_slot_props 5 | menu: components 6 | engine: ejs 7 | --- 8 | 9 |
10 |

插巢 Prop

11 |

將元件內的變數取出使用,稱為 slot prop

12 | 13 | 16 | 17 |
18 |

多個(解構)

19 | {{ product }} 20 | 21 | 24 | 26 | 27 |
28 | 29 | 79 | -------------------------------------------------------------------------------- /source/components/component_template.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 元件樣板及綁定方式 3 | layout: ./source/_layout.ejs 4 | current: component_template 5 | menu: components 6 | engine: ejs 7 | --- 8 |
9 |

樣板建立方式

10 | 11 |

template

12 | 13 |

x-template

14 | 15 |

單文件元件(單一檔案包含 HTML, JS, CSS)

16 |

本章節不介紹,在 Vue Cli 課程中將會實作(較為簡單,使用與 x-template 接近)

17 | 18 |
19 |

元件運用

20 |

直接使用 標籤 名稱

21 | 22 | 23 |

搭配 v-for 也是沒問題的

24 | 25 | 26 |

使用 v-is 綁定

27 | 28 | 29 |

動態屬性

30 | 31 | 32 |

任何標籤均可搭配 v-is 進行動態切換

33 | 34 | 35 |

component 標籤中,可以使用 is 縮寫(由 v2 版轉移過來的功能)

36 | 37 | 38 |

動態標籤實戰技巧

39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
標題內文
51 |
52 | 53 | 80 | -------------------------------------------------------------------------------- /source/es6/_esModule.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES 模組 3 | layout: ./source/_layout.ejs 4 | current: esModule 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 |
10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /source/es6/_esModule_2.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES 模組 3 | layout: ./source/_layout.ejs 4 | current: esModule_2 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 | 15 | 19 |
{{ counter }}
20 | -------------------------------------------------------------------------------- /source/es6/_object_reference.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 物件參考特性 3 | layout: ./source/_layout.ejs 4 | current: object_reference 5 | menu: es6 6 | engine: ejs 7 | description: 因為關注點分離,畫面由框架來處理,開發者將專注於資料處理,因此資料處理的知識顯得格外重要。 8 | --- 9 | -------------------------------------------------------------------------------- /source/es6/_promise.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Promise 3 | layout: ./source/_layout.ejs 4 | current: promise 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /source/es6/_separation_of_concerns.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 關注點分離 3 | layout: ./source/_layout.ejs 4 | current: separation_of_concerns 5 | menu: es6 6 | engine: ejs 7 | --- 8 | 9 |
10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /source/es6/_separation_of_concerns_work.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 關注點分離 3 | layout: ./source/_layout.ejs 4 | current: separation_of_concerns 5 | menu: es6 6 | engine: ejs 7 | --- 8 | 9 |
10 | 11 | 12 | 13 |
14 | 15 | -------------------------------------------------------------------------------- /source/es6/_shorthand.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES6 縮寫 3 | layout: ./source/_layout.ejs 4 | current: shorthand 5 | menu: es6 6 | engine: ejs 7 | description: 本課程的程式碼會盡可能利用 ES6 或其縮寫的形式撰寫,本章節會介紹實戰中的常見縮寫語法 8 | --- 9 | 13 | -------------------------------------------------------------------------------- /source/es6/arrow_function.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 箭頭函式的 this 指向差異 3 | layout: ./source/_layout.ejs 4 | current: arrow_function 5 | menu: es6 6 | engine: ejs 7 | --- 8 | -------------------------------------------------------------------------------- /source/es6/defaultExport.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | data: [ 4 | // 資料 5 | '這是第一句話', 6 | '這是第二句話', 7 | '這是第三句話', 8 | ], 9 | 10 | render(dom) { 11 | // 渲染方法 12 | const list = document.querySelector(`${dom} ul`); 13 | let content = ''; 14 | this.data.forEach((item, i) => { 15 | content = `${content}
  • ${item}
  • `; 16 | }); 17 | // 縮寫優化 18 | // const content = component.data.map(item => `
  • ${item}
  • `).join(''); 19 | console.log(this.data) 20 | list.innerHTML = content; 21 | 22 | // 加入監聽 23 | const btns = document.querySelectorAll(`${dom} .btn`); 24 | btns.forEach((btn) => 25 | btn.addEventListener('click', (e) => { 26 | // #2 重點,移除項目是先移除資料,而不是直接移除 DOM 27 | // 如果要進行 AJAX 或更複雜行為,不會因為 DOM 與資料混合而難以運作 28 | const id = e.target.dataset.id; 29 | this.data.splice(id, 1); 30 | this.render(dom); 31 | }) 32 | ); 33 | }, 34 | }; -------------------------------------------------------------------------------- /source/es6/esModule.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES 模組 3 | layout: ./source/_layout.ejs 4 | current: esModule 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 |
    10 | 11 |
    12 | 13 | -------------------------------------------------------------------------------- /source/es6/esModule_2.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES 模組延伸觀念 3 | layout: ./source/_layout.ejs 4 | current: esModule_2 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 | 15 |
    {{ counter }}
    16 | -------------------------------------------------------------------------------- /source/es6/namedExport.js: -------------------------------------------------------------------------------- 1 | export const a = 1; 2 | 3 | export function b() { 4 | console.log('1'); 5 | } 6 | 7 | export function c(a, b) { 8 | return a + b; 9 | } -------------------------------------------------------------------------------- /source/es6/object_reference.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 物件參考特性 3 | layout: ./source/_layout.ejs 4 | current: object_reference 5 | menu: es6 6 | engine: ejs 7 | description: 因為關注點分離,畫面由框架來處理,開發者將專注於資料處理,因此資料處理的知識顯得格外重要。 8 | --- 9 | -------------------------------------------------------------------------------- /source/es6/promise.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Promise 3 | layout: ./source/_layout.ejs 4 | current: promise 5 | menu: es6 6 | engine: ejs 7 | description: 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /source/es6/separation_of_concerns.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 關注點分離 3 | layout: ./source/_layout.ejs 4 | current: separation_of_concerns 5 | menu: es6 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |
    12 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /source/es6/separation_of_concerns_work.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 關注點分離 3 | layout: ./source/_layout.ejs 4 | current: separation_of_concerns_work 5 | menu: es6 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 |
    14 | 15 | -------------------------------------------------------------------------------- /source/es6/shorthand.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: ES6 縮寫 3 | layout: ./source/_layout.ejs 4 | current: shorthand 5 | menu: es6 6 | engine: ejs 7 | description: 本課程的程式碼會盡可能利用 ES6 或其縮寫的形式撰寫,本章節會介紹實戰中的常見縮寫語法 8 | --- 9 | 13 | -------------------------------------------------------------------------------- /source/es6/sideEffect.js: -------------------------------------------------------------------------------- 1 | (function (global) { 2 | global.$ = '我是 jQuery'; 3 | })(window); -------------------------------------------------------------------------------- /source/es6/this.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: this 指向觀念 3 | layout: ./source/_layout.ejs 4 | current: this 5 | menu: es6 6 | engine: ejs 7 | --- 8 | -------------------------------------------------------------------------------- /source/index.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 首頁 3 | layout: ./source/_layout.ejs 4 | engine: ejs 5 | menu: null 6 | current: index 7 | description:

    Vue 練習手冊,請同學搭配課程完成本練習,
    練習開始

    8 | --- -------------------------------------------------------------------------------- /source/intro/_final.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vue 體驗,製作一個商品後台 3 | layout: ./source/_layout.ejs 4 | current: final 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 | 13 |
    14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 26 | 27 | 30 | 33 | 37 | 38 | 39 |
    標題圖片銷售狀態編輯
    {{ item.name }} 28 | 29 | 31 | 32 | 34 | 36 |
    40 |
    41 |
    42 | 43 | 47 |
    48 |
    49 | 51 | 55 |
    56 | 59 |
    60 |
    61 | 62 | -------------------------------------------------------------------------------- /source/intro/_final_d.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Vue 體驗,製作一個簡易購物車 3 | layout: ./source/_layout.ejs 4 | current: final 5 | menu: intro 6 | engine: ejs 7 | --- 8 |
    9 |
    10 |
    11 | 12 |
    13 |
    14 |

    {{ product.name }}

    15 |

    {{ product.subTitle }}

    16 |

    {{ product.description }}

    17 |

    18 | {{ product.price }} 19 |

    20 |
    21 | 27 |
    28 |
    29 |
    30 |
    {{ selectedItem.name }} 已售完
    31 |
    32 | {{ selectedItem.name }} 尚有存貨 33 | 加入購物車 35 |
    36 |
    37 |
    38 |
    39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
    {{ item.name }}{{ item.spec.name }}{{ item.price }}
    合計 {{ sum }}
    52 |
    53 |
    54 | 55 | 58 |
    59 |
    60 | 61 | 64 |
    65 |
    66 |
    67 |
    68 | {{ cart }} {{ customer }} 69 |
    70 | -------------------------------------------------------------------------------- /source/intro/_intro_add_data.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 資料操作 3 | layout: ./source/_layout.ejs 4 | current: intro_add_data 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 |
    12 | 13 | 17 |
    18 |
    19 | 20 | 22 | 26 |
    27 | 30 |
    31 |
    32 | 33 | -------------------------------------------------------------------------------- /source/intro/_intro_edit_data.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 資料編輯 3 | layout: ./source/_layout.ejs 4 | current: intro_edit_data 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 26 | 29 | 33 | 34 | 35 |
    標題圖片銷售狀態編輯
    {{ item.name }} 24 | 25 | 27 | 28 | 30 | 32 |
    36 |
    37 |
    38 | 39 | 43 |
    44 |
    45 | 46 | 48 | 52 |
    53 | 56 |
    57 |
    58 | 59 | -------------------------------------------------------------------------------- /source/intro/_intro_render_vfor.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 多筆資料渲染 3 | layout: ./source/_layout.ejs 4 | current: intro_render_vfor 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 26 | 29 | 32 | 33 | 34 |
    標題圖片銷售狀態編輯
    {{ item.name }} 24 | 25 | 27 | 28 | 30 | 31 |
    35 |
    36 |
    37 | 38 | 42 |
    43 |
    44 | 45 | 47 | 51 |
    52 | 55 |
    56 |
    57 | 58 | -------------------------------------------------------------------------------- /source/intro/_two_way_binding.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 雙向綁定 3 | layout: ./source/_layout.ejs 4 | current: two_way_binding 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 | {{ temp }} 12 |
    13 | 14 | 18 |
    19 |
    20 | 21 | 23 | 27 |
    28 | 30 |
    31 |
    32 | 33 | -------------------------------------------------------------------------------- /source/intro/basic_structure.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 基礎範例結構 3 | layout: ./source/_layout.ejs 4 | current: basic_structure 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 | -------------------------------------------------------------------------------- /source/intro/createApp.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 環境安裝 3 | layout: ./source/_layout.ejs 4 | current: createApp 5 | menu: intro 6 | engine: ejs 7 | --- 8 | -------------------------------------------------------------------------------- /source/intro/final.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 最終成品細節調整 3 | layout: ./source/_layout.ejs 4 | current: final 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 23 | 24 | 27 | 30 | 34 | 35 | 36 |
    標題圖片銷售狀態編輯
    {{ item.name }} 25 | 26 | 28 | 29 | 31 | 33 |
    37 |
    38 |
    39 | 40 | 44 |
    45 |
    46 | 48 | 52 |
    53 | 56 |
    57 |
    58 | 59 | -------------------------------------------------------------------------------- /source/intro/intro_add_data.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 資料操作 3 | layout: ./source/_layout.ejs 4 | current: intro_add_data 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 |
    12 | 13 | 17 |
    18 |
    19 | 20 | 22 | 26 |
    27 | 30 |
    31 |
    32 | 33 | -------------------------------------------------------------------------------- /source/intro/intro_edit_data.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 資料編輯 3 | layout: ./source/_layout.ejs 4 | current: intro_edit_data 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 22 | 23 | 26 | 29 | 33 | 34 | 35 |
    標題圖片銷售狀態編輯
    {{ item.name }} 24 | 25 | 27 | 28 | 30 | 32 |
    36 |
    37 |
    38 | 39 | 43 |
    44 |
    45 | 46 | 48 | 52 |
    53 | 56 |
    57 |
    58 | 59 | -------------------------------------------------------------------------------- /source/intro/intro_render_vfor.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 多筆資料渲染 3 | layout: ./source/_layout.ejs 4 | current: intro_render_vfor 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
    標題圖片銷售狀態編輯
    23 |
    24 |
    25 | 26 | 30 |
    31 |
    32 | 33 | 35 | 39 |
    40 | 43 |
    44 |
    45 | 46 | -------------------------------------------------------------------------------- /source/intro/two_way_binding.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 雙向綁定 3 | layout: ./source/_layout.ejs 4 | current: two_way_binding 5 | menu: intro 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 |
    12 | 13 | 16 |
    17 |
    18 | 19 | 21 | 24 |
    25 | 27 |
    28 |
    29 | 30 | -------------------------------------------------------------------------------- /source/optionsApi/_options-computed.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Computed 3 | layout: ./source/_layout.ejs 4 | current: options-computed 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    Computed 將目前的數值運算呈現至畫面上

    12 | 18 | ... 19 |
    購物車項目
    20 | 23 | total 的值:{{ total }}
    24 | 25 | 26 |

    Computed 常見技巧 - 搜尋

    27 | 28 | 33 | 34 |

    Computed Getter, Setter

    35 | 36 | 37 | total 的值:{{ total }}
    38 | sum 的值:{{ sum }} 39 |
    40 | 41 | 103 | -------------------------------------------------------------------------------- /source/optionsApi/_options-methods.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Methods 3 | layout: ./source/_layout.ejs 4 | current: options-methods 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    methods 的結構

    12 | 16 | 17 |

    methods 的觸發方法(點擊、其它 options api、生命週期...)

    18 | 19 | 20 | 21 | 22 |

    參數傳入

    23 | 24 | 25 |

    使用 methods 處理複雜資料

    26 | 32 | ... 33 |
    購物車項目
    34 | 37 | 總金額 {{ sum }} 38 |

    作為 $filter 使用

    39 | 40 | {{ convertToAmount(sum) }} 41 |
    42 | 43 | 109 | -------------------------------------------------------------------------------- /source/optionsApi/_options-watch.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Watch 3 | layout: ./source/_layout.ejs 4 | current: options-watch 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    watch 監聽單一變數

    12 | 13 | 14 |

    result: {{ result }}

    15 |

    name: {{ name }}

    16 | 17 |

    watch vs computed

    18 |
    Watch
    19 | 23 | 24 |
    Computed
    25 | 29 | 30 |
    31 |
    32 | 33 |

    result2: {{ result2 }}

    34 |

    result3: {{ result3 }}

    35 | 36 |

    watch 深層監聽

    37 |
    38 |
    39 | 40 |

    result4: {{ result4 }}

    41 | 42 |
    43 | 44 | 146 | 147 | -------------------------------------------------------------------------------- /source/optionsApi/options-api.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Option API 3 | layout: ./source/_layout.ejs 4 | current: options-api 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    什麼是 options API 與 composition API

    11 |
    Option API Sample
    12 | 13 | 14 |

    常見的 Option API

    15 |

    官網:https://vue3js.cn/docs/zh/api/options-api.html

    16 | 21 | 22 |

    提醒:option API 與 this

    23 | 24 |
    25 |
    26 |
    27 |
    Composition API Sample
    28 | 29 |
    30 | 31 | 32 | 52 | 53 | 54 | 79 | 80 | -------------------------------------------------------------------------------- /source/optionsApi/options-computed.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Computed 3 | layout: ./source/_layout.ejs 4 | current: options-computed 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    Computed 將目前的數值運算呈現至畫面上

    12 | 18 | ... 19 |
    購物車項目
    20 | 23 | total 的值:
    24 | 25 |

    Computed 常見技巧 - 搜尋

    26 | 27 | 32 | 33 |

    Computed Getter, Setter

    34 | sum 的值: 35 | 36 | 37 | total 的值:{{ total }}
    38 | sum 的值:{{ sum }} 39 |
    40 | 41 | 84 | -------------------------------------------------------------------------------- /source/optionsApi/options-final.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 章節挑戰 3 | layout: ./source/_layout.ejs 4 | current: options-final 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 |
    12 |
    13 | 14 | 15 |
    16 |
    17 | 21 |
    22 |
    23 |
    24 |
    25 | 28 | 29 |
    30 |
    31 | 32 | 34 |
    35 |
    {{ datastore.Name }}
    36 |

    {{ datastore.Description }}

    37 |
    38 |
    39 |
    40 |
    41 |
    42 | 43 | 88 | 89 | 98 | -------------------------------------------------------------------------------- /source/optionsApi/options-final_answer.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 章節挑戰 3 | layout: ./source/_layout.ejs 4 | current: options-final 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 |
    11 |
    12 |
    13 | 14 | 15 |
    16 |
    17 | 22 |
    23 |
    24 |
    25 |
    26 | 30 | 31 |
    32 |
    33 |
    34 | 35 | 37 |
    38 |
    {{ cacheArea.Name }}
    39 |

    {{ cacheArea.Description }}

    40 |
    41 |
    42 |
    43 | 請選擇場域 44 |
    45 |
    46 |
    47 |
    48 |
    49 | 50 | 94 | 95 | 104 | -------------------------------------------------------------------------------- /source/optionsApi/options-life-cycle.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 生命週期 3 | layout: ./source/_layout.ejs 4 | current: options-life-cycle 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 |
    9 | 10 |

    Vue 元件生命週期展示

    11 |

    生命週期介紹:生命週期

    12 | 16 |
    17 | 18 | 19 |

    講解事項:

    20 | 26 | 27 |
    28 | 29 | 35 | 36 | 83 | 84 | -------------------------------------------------------------------------------- /source/optionsApi/options-methods.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Methods 3 | layout: ./source/_layout.ejs 4 | current: options-methods 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    methods 的結構

    12 | 16 | 17 |

    methods 的觸發方法(點擊、其它 options api、生命週期...)

    18 | 19 | 20 | 21 | 22 |

    參數傳入

    23 | 24 | 25 |

    使用 methods 處理複雜資料

    26 | 32 | ... 33 |
    購物車項目
    34 | 37 | 總金額 {{ sum }} 38 | 39 | 40 |

    作為 $filter 使用(取代複雜表達式)

    41 | 42 |
    43 | 44 | 105 | -------------------------------------------------------------------------------- /source/optionsApi/options-watch.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: Watch 3 | layout: ./source/_layout.ejs 4 | current: options-watch 5 | menu: optionsApi 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 |

    watch 監聽單一變數

    12 | 13 | 14 |

    result: {{ result }}

    15 |

    name: {{ name }}

    16 | 17 |

    watch vs computed

    18 |
    Watch
    19 | 23 | 24 |
    Computed
    25 | 29 | 30 |
    31 |
    32 | 33 |

    Computed result2: {{ result2 }}

    34 |

    Watch result3: {{ result3 }}

    35 | 36 |

    watch 深層監聽

    37 |
    38 |
    39 | 40 |

    result4: {{ result4 }}

    41 | 42 |
    43 | 44 | 102 | 103 | -------------------------------------------------------------------------------- /source/partials/footer.ejs: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /source/partials/menu.ejs: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | <% menus.forEach(function(menu){ %> 4 | 8 | <%- menu.name %> 9 | 10 | <% }); %> 11 |
    12 |
    13 | 文件版本:2021/4/09 14 |
    15 |
    16 | 17 | -------------------------------------------------------------------------------- /source/partials/navbar.ejs: -------------------------------------------------------------------------------- 1 | 2 | 32 | -------------------------------------------------------------------------------- /source/router/_vue_router.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 路由 3 | layout: ./source/_layout.ejs 4 | current: vue-router 5 | menu: router 6 | engine: ejs 7 | --- 8 | 9 |
    10 | A | 11 | B 12 |
    13 | 14 |
    15 | -------------------------------------------------------------------------------- /source/router/vue_router.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 路由 3 | layout: ./source/_layout.ejs 4 | current: vue-router 5 | menu: router 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    路由示範

    11 | {{ text }} 12 |
    13 | -------------------------------------------------------------------------------- /source/stylesheets/all.scss: -------------------------------------------------------------------------------- 1 | @import "functions"; 2 | @import "helpers/variables"; 3 | @import "bootstrap"; 4 | 5 | @import "components/demo"; 6 | @import "components/footer"; 7 | @import "components/utilities"; 8 | 9 | body { 10 | padding-top: 56px; 11 | } 12 | 13 | h3, h4, h5, h6 { 14 | margin-top: .75em; 15 | } 16 | -------------------------------------------------------------------------------- /source/stylesheets/components/_demo.scss: -------------------------------------------------------------------------------- 1 | .demo { 2 | padding: .5rem; 3 | margin-bottom: 1rem; 4 | background-color: lighten($orange , 45%); 5 | border: 1px dashed lighten($orange , 35%); 6 | } -------------------------------------------------------------------------------- /source/stylesheets/components/_footer.scss: -------------------------------------------------------------------------------- 1 | .main { 2 | min-height: calc(100vh - 6rem - 56px - 40px); 3 | } -------------------------------------------------------------------------------- /source/stylesheets/components/_utilities.scss: -------------------------------------------------------------------------------- 1 | 2 | // .box { 3 | // display: inline-block; 4 | // width: 5rem; 5 | // height: 5rem; 6 | // margin: .25rem; 7 | // background-color: #f5f5f5; 8 | // border: 1px solid; 9 | // } 10 | 11 | // .bg-lighter { 12 | // background-color: theme-color('light'); 13 | // // background-color: $gray-200; 14 | // } 15 | 16 | // .over-flow-x { 17 | // overflow-x: hidden; 18 | // } 19 | 20 | // // position 21 | // .relative { 22 | // position: relative 23 | // } 24 | 25 | // .bg-primary-gradient { 26 | // background: linear-gradient(90deg, theme-color('primary') 15%,#B97EE4 75%,#BA8AFF 94%); 27 | // } 28 | 29 | // .skew-section { 30 | // transform: skewY($rotate-degree); 31 | // & > * { 32 | // transform: skewY(-$rotate-degree); 33 | // } 34 | // } 35 | // .skew-bg { 36 | // transform: skewY($rotate-degree); 37 | // } 38 | // .skew-bg { 39 | // position: absolute; 40 | // left: 0; 41 | // right: 0; 42 | // top: 0; 43 | // bottom: 0; 44 | // z-index: -1; 45 | // } -------------------------------------------------------------------------------- /source/template/_form.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-model 與表單 3 | layout: ./source/_layout.ejs 4 | current: form 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    input

    11 | 12 | {{ name }} 13 | 14 |
    15 |

    textarea

    16 | 17 | {{ text }} 18 | 19 |
    20 |

    checkbox 單選框

    21 |

    小明,你是吃飽沒?

    22 |

    {{ checkAnswer ? '吃飽了' : '還沒'}}

    23 |
    24 | 25 | 26 |
    27 | 28 |
    29 |

    checkbox 單選延伸

    30 |

    小明,你是吃飽沒?

    31 |

    {{ checkAnswer2 }}

    32 |
    33 | 35 | 36 |
    37 | 38 |
    39 |

    checkbox 複選框

    40 |

    你還要吃什麼?

    41 |

    {{ checkAnswer3.join(' ') }}

    42 |
    43 | 44 | 45 |
    46 |
    47 | 48 | 49 |
    50 |
    51 | 52 | 53 |
    54 | 55 |
    56 |

    radio 單選框

    57 |

    你還要吃什麼?

    58 |

    {{ radioAnswer }}

    59 |
    60 | 61 | 62 |
    63 |
    64 | 65 | 66 |
    67 |
    68 | 69 | 70 |
    71 | 72 |
    73 |

    select 單選

    74 |

    你還要吃什麼?

    75 |

    {{ selectAnswer }}

    76 | 81 | 82 |
    83 |

    select 多選

    84 |

    你還要吃什麼?

    85 |

    {{ selectAnswer2 }}

    86 | 91 |
    92 | 93 | -------------------------------------------------------------------------------- /source/template/_v-bind.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 屬性綁定 3 | layout: ./source/_layout.ejs 4 | current: v-bind 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    綁定屬性 v-bind

    11 |

    {{ breakfastShop.name }}

    12 | 13 | 14 |

    縮寫形式 :

    15 | 16 | 17 |
    18 |

    更多屬性綁定

    19 | 小明還想點餐: 20 |
    21 | 22 | 23 |
    24 | 25 | 26 | 27 |
    28 |

    搭配 v-for

    29 | 30 | 31 | 32 | 35 | 38 | 41 | 49 | 50 | 51 |
    33 | 34 | 36 | {{ item.name }} 37 | 39 | {{ item.price }}元 40 | 42 |
    43 | 44 | 47 |
    48 |
    52 | 53 |
    54 |

    表達式運用(串接)

    55 |

    {{ imageSize }}

    56 | 57 |
    58 | 60 | 61 |
    62 |

    動態屬性綁定(注意大小寫)

    63 | 65 |
    66 | 67 | 68 |
    69 |

    預告:元件的資料傳遞亦是使用 v-bind

    70 | 73 |
    74 | 75 | 150 | 151 | -------------------------------------------------------------------------------- /source/template/_v-for.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 呈現多筆資料 3 | layout: ./source/_layout.ejs 4 | current: v-for 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    呈現多筆資料於畫面上 v-for

    11 |

    菜單

    12 | 17 | 18 |

    物件回圈

    19 | 24 | 25 |

    純數值回圈

    26 | 29 | 30 |

    v-for 與 key

    31 |

    菜單

    32 | 38 |

    說明:有相同父元素的子元素必須有獨特的 key。重複的 key 會造成渲染錯誤。

    39 | 40 | 41 |
    42 |

    進階技巧:在 template 標籤使用 v-for

    43 | 44 | 45 | 61 | 62 |
    63 |

    參考介紹

    64 | 65 |

    補充說明:v-for 與元件

    66 | 69 |
    70 | 71 | -------------------------------------------------------------------------------- /source/template/_v-if.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 渲染判斷 3 | layout: ./source/_layout.ejs 4 | current: v-if 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    v-if

    11 |

    小明 飽了

    12 |

    小明 還沒吃飽

    13 | 14 | 15 |
    16 |

    v-else-if

    17 | 25 |
    26 |
    小明吃早餐
    27 |
    小美去百貨公司
    28 |
    杰倫去幫助人
    29 |
    30 | 31 |
    32 |

    注意事項:v-for 與 v-if 混用

    33 | 40 |

    參考說明:https://vue3js.cn/docs/zh/guide/conditional.html#v-if-%E4%B8%8E-v-for-%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8

    41 | 42 |
    43 |

    v-if 與 v-show

    44 |

    小明 飽了

    45 | 46 |
    47 | 48 | -------------------------------------------------------------------------------- /source/template/_v-model-modifiers.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-model 修飾符 3 | layout: ./source/_layout.ejs 4 | current: v-model-modifiers 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    修飾符

    11 |

    延遲 Lazy

    12 | {{ lazyMsg }} 13 | 14 |

    純數值 Number

    15 | {{ numberMsg }}{{ typeof numberMsg }} 16 | 17 |

    修剪 Trim

    18 | 這是一段{{ trimMsg }}緊黏的文字 19 | 20 | 21 |

    自定義修飾符

    22 |

    介紹:透過元件自定義修飾符

    23 |
    24 | 25 | -------------------------------------------------------------------------------- /source/template/_v-on-dom-event.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 補充:v-on DOM 事件 3 | layout: ./source/_layout.ejs 4 | current: v-on-dom-event 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    原生 DOM 事件

    11 | 參考:DOM 事件 12 |
    13 |
    14 | 15 | 16 | 17 | 18 | 19 |
    20 |
    21 |

    取得原生 input 數值

    22 | 23 |

    24 |

    監聽按鍵事件

    25 | 26 | 27 |
    28 | 29 | 62 | 63 | 78 | -------------------------------------------------------------------------------- /source/template/_v-on-modifiers.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-on 事件觸發 3 | layout: ./source/_layout.ejs 4 | current: v-on-modifiers 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 |

    修飾符

    13 |

    按鍵修飾符*

    14 | 19 | 20 |
    別名修飾
    21 | 22 | 23 |
    相應按鍵時才觸發的監聽器
    24 | 25 | 26 |
    特定鍵
    27 | 28 |
    29 |

    滑鼠修飾符

    30 | 35 |
    滑鼠修飾符
    36 |
    37 | 38 | 39 |
    40 | 41 |
    42 |

    事件修飾符

    43 | 50 | 加入 Prevent 51 | 52 |
    53 |
    預設情境
    54 |
    55 | 56 | 57 | 58 |
    59 | 60 |
    將此範例加上 stopPropagation (防止向外尋找)
    61 |
    62 | 63 | 64 | 65 |
    66 | 67 |
    事件偵聽器時使用 capture 模式 (事件改為由外而內)
    68 |
    69 | 70 | 71 | 72 |
    73 | 74 |
    事件偵聽器時使用 self 模式 (只會觸發自己範圍內的)
    75 |
    76 | 77 | 78 | 79 |
    80 | 81 |
    82 |

    事件偵聽器只觸發一次 once

    83 |
    84 | 85 | 86 | 87 |
    88 |
    89 | 90 | 91 |
    92 | 93 | 133 | 134 | 149 | -------------------------------------------------------------------------------- /source/template/_v-on.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-on 事件觸發 3 | layout: ./source/_layout.ejs 4 | current: v-on 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    觸發事件 與 縮寫*

    11 |
    12 |
    13 | 14 |
    15 |

    帶入參數*

    16 |
    17 |
    18 | 19 | 20 |
    21 |

    原生 DOM 事件*

    22 |

    input change 事件

    23 | 24 |

    25 |

    form submit 事件

    26 |
    27 | 28 | 29 |
    30 |
    31 |

    動態事件 []

    32 | 33 | 34 | 35 |
    36 |

    動態物件方法 {}

    37 | 38 | 42 |
    43 |

    作為運算*

    44 | {{ double(num) }} 45 | 46 |
    47 | 48 | 88 | 89 | -------------------------------------------------------------------------------- /source/template/_v-style.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 樣式切換 3 | layout: ./source/_layout.ejs 4 | current: v-style 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    切換 Class

    11 |

    物件寫法

    12 |
    13 |
    14 | 15 | 16 | 17 |
    18 |

    物件寫法 2

    19 |
    20 | 21 |
    22 |

    陣列寫法

    23 | 24 | 27 | 28 |
    29 |

    行內樣式

    30 |

    綁定行內樣式

    31 |
    32 |
    33 |
    34 |
    35 | 36 | 76 | 77 | -------------------------------------------------------------------------------- /source/template/_v-text.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 渲染資料於畫面上 3 | layout: ./source/_layout.ejs 4 | current: v-text 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    字串 v-text 與 {{}} (Mustache)

    11 |

    {{ name }}在{{ position }}吃早餐

    12 |

    吃早餐

    13 | 14 | 15 |
    16 |

    原始字串 v-html

    17 | {{ rawHtml }} 18 |

    注意事項

    19 | 20 |
    21 |

    單次綁定 v-once

    22 |

    {{ name }}在{{ position }}吃早餐

    23 | 24 | 25 |
    26 |

    進階技巧:表達式

    27 |

    {{ `${name}在${position}吃早餐` }}

    28 |

    {{ text.split('').reverse().join('') }}

    29 |

    {{ say(name) }}

    30 |

    {{ 1 + 1}}

    31 | 32 |
    33 |

    進階技巧:顯示資料狀態

    34 |

    {{ products }}

    35 | 36 |
    37 |

    顯示 {{ }}

    38 |

    這段文字不會被轉譯:{{ name }}在{{ position }}吃早餐

    39 |
    40 | 41 | -------------------------------------------------------------------------------- /source/template/form.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-model 與表單 3 | layout: ./source/_layout.ejs 4 | current: form 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    input

    11 | 12 | {{ name }} 13 | 14 |
    15 |

    textarea

    16 | 17 | {{ text }} 18 | 19 |
    20 |

    checkbox 單選框

    21 |

    小明,你是吃飽沒?

    22 |

    {{ checkAnswer ? '吃飽了' : '還沒'}}

    23 |
    24 | 25 | 26 |
    27 | 28 |
    29 |

    checkbox 單選延伸

    30 |

    小明,你是吃飽沒?

    31 |

    {{ checkAnswer2 }}

    32 |
    33 | 34 | 35 |
    36 | 37 |
    38 |

    checkbox 複選框

    39 |

    你還要吃什麼?

    40 |

    {{ checkAnswer3.join(' ') }}

    41 |
    42 | 43 | 44 |
    45 |
    46 | 47 | 48 |
    49 |
    50 | 51 | 52 |
    53 | 54 |
    55 |

    radio 單選框

    56 |

    你還要吃什麼?

    57 |

    {{ radioAnswer }}

    58 |
    59 | 60 | 61 |
    62 |
    63 | 64 | 65 |
    66 |
    67 | 68 | 69 |
    70 | 71 |
    72 |

    select 單選

    73 |

    你還要吃什麼?

    74 |

    {{ selectAnswer }}

    75 | 78 | 79 |
    80 |

    select 多選

    81 |

    你還要吃什麼?

    82 |

    {{ selectAnswer2 }}

    83 | 88 |
    89 | 90 | -------------------------------------------------------------------------------- /source/template/v-bind.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 屬性綁定 3 | layout: ./source/_layout.ejs 4 | current: v-bind 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    綁定屬性 v-bind

    11 |

    {{ breakfastShop.name }}

    12 | 13 | 14 |

    縮寫形式 :

    15 | 16 | 17 |
    18 |

    更多屬性綁定

    19 | 小明還想點餐: 20 |
    21 | 22 | 23 |
    24 | 25 | 26 | 27 |
    28 |

    搭配 v-for

    29 | 30 | 31 | 32 | 35 | 38 | 41 | 49 | 50 | 51 |
    33 | 34 | 36 | {{ item.name }} 37 | 39 | {{ item.price }}元 40 | 42 |
    43 | 44 | 47 |
    48 |
    52 | 53 |
    54 |

    表達式運用(串接)

    55 |

    {{ imageSize }}

    56 | 57 |
    58 | 60 | {{ `${breakfastShop.resizeImg}&w=${imageSize}` }} 61 | 62 |
    63 |

    動態屬性綁定(注意大小寫)

    64 | 66 |
    67 | 68 | 69 |
    70 |

    預告:元件的資料傳遞亦是使用 v-bind

    71 | 74 |
    75 | 76 | 151 | 152 | -------------------------------------------------------------------------------- /source/template/v-for.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 呈現多筆資料 3 | layout: ./source/_layout.ejs 4 | current: v-for 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    呈現多筆資料於畫面上 v-for

    11 |

    菜單

    12 | 15 | 16 |

    物件回圈

    17 | 20 | 21 |

    純數值回圈

    22 | 25 | 26 |

    v-for 與 key

    27 |

    菜單

    28 | 34 |

    說明:有相同父元素的子元素必須有獨特的 key。重複的 key 會造成渲染錯誤。

    35 | 36 | 37 |
    38 |

    進階技巧:在 template 標籤使用 v-for

    39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 51 | 54 | 55 | 56 |
    1 44 | 飯糰 45 |
    49 | 30元 50 | 52 | 不可素食 53 |
    57 |

    參考介紹

    58 | 59 |

    補充說明:v-for 與元件

    60 | 63 |
    64 | 65 | -------------------------------------------------------------------------------- /source/template/v-if.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 渲染判斷 3 | layout: ./source/_layout.ejs 4 | current: v-if 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    v-if

    11 |

    小明 飽了

    12 | 13 | 14 | 15 |
    16 |

    v-else-if

    17 | 25 |
    26 |
    小明吃早餐
    27 |
    小美去百貨公司
    28 |
    杰倫去幫助人
    29 |
    30 | 31 |
    32 |

    注意事項:v-for 與 v-if 混用

    33 | 38 |

    參考說明:https://vue3js.cn/docs/zh/guide/conditional.html#v-if-%E4%B8%8E-v-for-%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8

    39 | 40 |
    41 |

    v-if 與 v-show

    42 |

    小明 飽了

    43 | 44 |
    45 | 46 | -------------------------------------------------------------------------------- /source/template/v-model-modifiers.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-model 修飾符 3 | layout: ./source/_layout.ejs 4 | current: v-model-modifiers 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    修飾符

    11 |

    延遲 Lazy

    12 | {{ lazyMsg }} 13 | 14 |

    純數值 Number

    15 | {{ numberMsg }}{{ typeof numberMsg }} 16 | 17 |

    修剪 Trim

    18 | 這是一段{{ trimMsg }}緊黏的文字 19 | 20 | 21 |
    22 | 23 | -------------------------------------------------------------------------------- /source/template/v-on-dom-event.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 補充:v-on DOM 事件 3 | layout: ./source/_layout.ejs 4 | current: v-on-dom-event 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    原生 DOM 事件

    11 | 參考:DOM 事件 12 |
    13 |
    14 | 15 | 16 | 17 | 18 | 19 |
    20 |
    21 |

    取得原生 input 數值

    22 | 23 |

    24 |

    監聽按鍵事件

    25 | 26 | 27 |
    28 | 29 | 61 | 62 | 77 | -------------------------------------------------------------------------------- /source/template/v-on-modifiers.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-on 修飾符 3 | layout: ./source/_layout.ejs 4 | current: v-on-modifiers 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 | 11 | 12 |

    修飾符

    13 |

    按鍵修飾符*

    14 | 19 | 20 |
    別名修飾
    21 | 22 | 23 |
    相應按鍵時才觸發的監聽器
    24 | 25 | 26 |
    特定鍵
    27 | 28 |
    29 |

    滑鼠修飾符

    30 | 35 |
    滑鼠修飾符
    36 |
    37 | 38 | 39 |
    40 | 41 |
    42 |

    事件修飾符

    43 | 50 | 加入 Prevent 51 | 52 |
    53 |
    預設情境
    54 | 冒泡事件參考文章 55 |
    56 | 57 | 58 | 59 |
    60 | 61 |
    stopPropagation (防止向外尋找)
    62 |
    63 | 64 | 65 | 66 |
    67 | 68 |
    事件偵聽器時使用 capture 模式 (事件改為由外而內)
    69 |
    70 | 71 | 72 | 73 |
    74 | 75 |
    事件偵聽器時使用 self 模式 (只會觸發自己範圍內的)
    76 |
    77 | 78 | 79 | 80 |
    81 |
    82 |

    事件偵聽器只觸發一次 once

    83 |
    84 | 85 | 86 | 87 |
    88 |
    89 | 90 | 91 |
    92 | 93 | 111 | 112 | 127 | -------------------------------------------------------------------------------- /source/template/v-on.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: v-on 事件觸發 3 | layout: ./source/_layout.ejs 4 | current: v-on 5 | menu: template 6 | engine: ejs 7 | --- 8 |
    9 |

    觸發事件 與 縮寫*

    10 |
    11 |
    12 | 13 |
    14 |

    帶入參數*

    15 |
    16 |
    17 | 18 | 19 |
    20 |

    原生 DOM 事件*

    21 | 22 |

    input change 事件

    23 | 24 |

    25 |

    form submit 事件

    26 |
    27 | 28 | 29 |
    30 |
    31 |

    動態事件 []

    32 | 33 | 34 | 35 |
    36 |

    動態物件方法 {}

    37 | 38 | 40 |
    41 |

    作為運算*

    42 | {{ double }} 43 | 44 |
    45 | 46 | 86 | 87 | -------------------------------------------------------------------------------- /source/template/v-style.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 樣式切換 3 | layout: ./source/_layout.ejs 4 | current: v-style 5 | menu: template 6 | engine: ejs 7 | --- 8 | 9 |
    10 |

    切換 Class

    11 |

    物件寫法

    12 |
    13 |
    14 | 15 | 16 | 17 |
    18 |

    物件寫法 2

    19 |
    20 | 21 |
    22 |

    陣列寫法

    23 | 24 | 27 | 28 |
    29 |

    行內樣式

    30 |

    綁定行內樣式

    31 |
    32 |
    33 |
    34 |
    35 | 36 | 72 | 73 | -------------------------------------------------------------------------------- /source/template/v-text.ejs: -------------------------------------------------------------------------------- 1 | --- 2 | title: 渲染資料於畫面上 3 | layout: ./source/_layout.ejs 4 | current: v-text 5 | menu: template 6 | engine: ejs 7 | --- 8 |
    9 |

    字串 v-text 與 {{}} (Mustache)

    10 |

    在 吃早餐

    11 |

    吃早餐

    12 | 13 | 14 |
    15 |

    原始字串 v-html

    16 | {{ rawHtml }} 17 |

    注意事項

    18 | 19 |
    20 |

    單次綁定 v-once

    21 |

    {{ name }}在{{ position }}吃早餐

    22 | 23 | 24 |
    25 |

    進階技巧:表達式

    26 |

    {{ }}

    27 |

    {{ }}

    28 |

    {{ }}

    29 |

    {{ }}

    30 | 31 |
    32 |

    進階技巧:顯示資料狀態

    33 |

    34 | 35 |
    36 |

    顯示 {{ }}

    37 |

    這段文字不會被轉譯:{{ name }}在{{ position }}吃早餐

    38 |
    39 | 40 | 106 | --------------------------------------------------------------------------------