Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Vue.jsから始めるDOMにデータを持たせないアプリケーション開発への第1歩
Search
Kazumune Katagiri
March 25, 2017
Technology
4.7k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vue.jsから始めるDOMにデータを持たせないアプリケーション開発への第1歩
第51回 長岡IT技術者勉強会
Kazumune Katagiri
March 25, 2017
More Decks by Kazumune Katagiri
See All by Kazumune Katagiri
50歳目前開発者の AI との付き合い方
nemuzuka
0
58
AWS を使ったシステムのテスト方針 #jawsug #jawsug_niigataken #nds60
nemuzuka
2
3.2k
フリーランスで割と長くリモートでやってる僕が気をつけていること
nemuzuka
1
13k
わたしがみんなにオススメするBetter JavaとしてのScala
nemuzuka
1
890
ScalaでもDBのテストをしよう
nemuzuka
0
390
Other Decks in Technology
See All in Technology
LambdaWebFunctionsを試してみた / exploring-lambda-web-functions
koukihosaka
1
360
データエンジニアの次の戦場は "プロセスエンジニアリング"
sansantech
PRO
1
120
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
1k
⾮構造化データを価値に変える AI エージェント基盤とその組織
ivry_presentationmaterials
0
200
オントロジーって 結局なにもの? AI エージェントに「意味」を渡す知識設計の話
greenmidori
0
240
Tofu-Controller lightning talk @ Containerday 2026
gionn
0
120
Local CI × GitHub Actions
gogutan
3
230
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
200
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
320
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
Running Kotlin + Quarkus with Lambda
nealle
1
4k
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
350
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
37k
Skip the Path - Find Your Career Trail
mkilby
1
260
A Tale of Four Properties
chriscoyier
163
24k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Code Review Best Practice
trishagee
74
20k
Typedesign – Prime Four
hannesfritz
42
3.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
480
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
WCS-LA-2024
lcolladotor
0
890
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
Vue.js͔Β࢝ΊΔ DOMʹσʔλΛ࣋ͨͤͳ͍ ΞϓϦέʔγϣϯ։ൃͷୈ1า 2017/3/25 @nemuzuka ୈ51ճ ԬITٕज़ऀษڧձ
ࣗݾհ • ยۅ Ұफ(͔ͨ͗Γ ͔ͣΉͶ) • id:nemuzuka / @nemuzuka •
Java / JavaScript / Scala • ݸਓࣄۀओ(vss.jp.net)
NDS 50+1 ճ ͓ΊͰͱ͏͍͟͝·͢ʂ
࠷ۙͷWebΞϓϦ։ൃ
αʔό JSONฦͯ͘͠ΕΕ ԿͰ͍͍ɻ Ͱɺը໘ͷϨϯμϦϯά Ͳ͏։ൃ͠Α͏͔ʁ
1. jQueryͰΨϯόΔ jsίʔυ্ʹ ɾDOMཁૉͷ࡞ ɾΠϕϯτͷొ ɾσʔλՃ ͕ͪ͝Όͪ͝ΌʹͳΓɺमਖ਼ͮ͠Β͘ͳΔͷͦ͏ԕ͘ͳ͍ jQueryͰσβΠϯ͢ΔͷπϥΠ... 1ճ͖ͬ͜ΓͳΒؤுΕΔ͚Ͳɺ cssϑϨʔϜϫʔΫͷมߋͱ͔͞ΕΔͱ…Δؾ͕…
2. jsςϯϓϨʔτΤϯδϯಋೖ [html+template] [js]
ex. Hogan.js • htmlͷςϯϓϨʔτͱjs͕Ͱ͖ͯεοΩϦʂ • jQueryଆͰDOMΛߏங͢Δྔݮͬͨ • templateͱσʔλΛඥ͚ͨ݁ՌΛappend͢ Δॲཧඞཁ •
σβΠϯͷมߋͦΜͳʹා͘ͳ͘ͳͬͨ
ෆศͳ͜ͱ͋Γ·͕͢ ·͊·͊͜ͷߏͰ ຬ͍ͯ͠·ͨ͠ (40 உੑ) clickΠϕϯτΛݩʹ֤ཁૉΛදࣔ/ඇදࣔ͢Δͷख͚ؒͩͲ ·͊Կͱ͔ͳΔ͠ɺ ੈͷதReactͱ͔Angular2ͱ͔͕ྲྀߦͬͯΔ͚Ͳɺ ͕ࣗ࡞ΔͷॴḨۀΞϓϦ͔ͩΒผʹྑ͍... ֮͑ͳ͖Ό͍͚ͳ͍͓࡞๏λά͕ଟ͍ΜͰ͠ΐ…
ਖ਼ ৽͍ٕ͠ज़֮͑Δͷ (ಛʹϑϩϯτΤϯυ) ͓ͳ͔͍ͬͺ͍
ͨͩɺγεςϜͷن͕େ͖͘ ͳͬͯ͘Δͱ • DOMͷidཁૉ͕ඃΒͳ͍Α͏ʹɺͩΜͩΜ͘ͳͬͯ͘Δ • ͜ͷclass໊ͬͯม͑ͯྑ͍Μ͚ͩͬʁͦͦstyle༻ʁjQuery༻ʁ • طଘΛյ͞ͳ͍Α͏ʹ৽͍͠class࡞… • selector͕Ϝμʹ͘͠
• DOMʹΞΫηεͯ͠σʔλ(data-* / value)ΛҾͬுͬͯ͘Δͷ໘ • άϩʔόϧมʹΞΫηε͍ͯ͠Δͱಉٛ • Ͳ͔͜ΒΞΫηεͰ͖ΔͷͰɺଞͷॲཧʹલఏ݅ͷσʔλΛফ͞ΕΔ / ্ॻ͖͞ΕΔ͜ͱ͋Δ • ॲཧΛ͏ͷʹDOMͷมԽΛ͏ඞཁ͕͋Δ DOMʹσʔλΛ࣋ͨͤΔ͜ͱʹݶքΛײ࢝͡ΊΔ (2016 ळ)
͋ΔɺVue.js 2.0 ͕ ϦϦʔε͞Εͨͱ͍͏هࣄ͔Β νϡʔτϦΞϧΛݟͯΈΔͱ...
͋Εɺ ࢲʹແཧͳ͘Ͱ͖Δ͔ʁ Vue.js 2.0 σϏϡʔܾҙʂ(2016 ౙ)
ಠश Vue.js 2.0 [جຊػೳ]
1. σʔλΛDOM্ʹඳը [html(template)] [js]
2. ํσʔλόΠϯσΟϯά [html(template)] [js] js෦/ࢀর෦ʹө͞ΕΔ (ํσʔλόΠϯσΟϯά) textʹೖྗ͢Δͱ…
3. Arrayσʔλදࣔ [html(template)] [js] ߦ͕૿͑Δ js্Ͱ ͱ࣮ߦ͢Δͱ…
͜ͷ࣌Ͱɺ͔ͳΓศར • ڥscriptλάͰಡΈࠐΊ͍͍ • npmͱ͔babelͱ͔ෆཁʂ͙࢝͢ΊΒΕΔʂ • templateػೳ • ʮ{{ʯ /
ʮ}}ʯ ͰΛදࣔ͢Δ • jsଆͰDOMཁૉҙࣝ͢Δඞཁͳ͠ • Arrayͷมߋʹैͯ͠DOMมߋͯ͘͠ΕΔ • ํσʔλόΠϯσΟϯά • htmlଆͷมߋˠjsଆʹөɺjsଆͷมߋˠhtmlଆʹөͯ͘͠ΕΔ • αʔόͷϦΫΤετύϥϝʔλjs্ͷVueΠϯελϯεͷdataϓϩύςΟ͚ͩҙ͓͚ࣝͯ͠ྑ͍ • data-*ͱ͔hiddenͱ͔ෆཁ • Ϣʔβ͕ೖྗͨ͠Λidͱ͔selectorΛ༻ͯ͠ɺjsͰरͬͯύϥϝʔλ࡞͢Δ͜ͱෆཁ • σʔλͱDOMͷಉظ͔Βղ์͞ΕɺjsσʔλͱϩδοΫ͚ͩʹूதͰ͖Δ
4. Πϕϯτͱॲཧͷඥ͚ͮ [html(template)] [js] onclick methodsͷؔʹ͓͍ͯɺ 1. thisVueΠϯελϯε ɹˠthis.nameͰΞΫηεՄೳ ɹɹ(dataলུͰ͖Δ)
2. eventωΟςΟϒDOMΠϕϯτ
5. ಈత߲ / ද੍ࣔޚ • ಈతʹclassΛΓସ͍͑ͨ(ex. ݅Λຬͨͨ࣌͠) • v-bind:class •
ಈతʹidཁૉΛઃఆ͍ͨ͠ • v-bind:id • ݅ʹΑ߲ͬͯΛඇදࣔʹ͍ͨ͠ • v-if লུه๏Ͱʮ:classʯʮ:idʯͱॻ͚Δ →ʮ:ʯͰ࢝·͍ͬͯΕಈతͳ߲ →seen͕trueͳΒཁૉදࣔ
͜ΕΒΛΈ߹ΘͤΔ͜ͱͰɺ click࣌ʹද߲ࣔΛΓସ͑Δ࣌ɺ ͦͷΠϕϯτॲཧͰdataΛมߋ͢Δ ͚ͩͰ݁͠·͢ɻ jQueryͰΨϯόΔΑΓ ָʹͳΓͦ͏ͳؾ͕͠·ͤΜ͔ʁ
ಠश Vue.js 2.0 [ίϯϙʔωϯτ]
ίϯϙʔωϯτʁ • ҙຯͷ͋Δ୯ҐͰtemplate/data/ΠϕϯτΛ·ͱΊΔ • SPAΛࢦͯ͠ɺ1ͭͷը໘ʹڊେͳhtml͕͋ΔΑΓҙຯ͋ Δ୯ҐͰ·ͱΊΕอक͘͢͠ͳΔ • ίϯϙʔωϯτͰͷ͕͖ͬΓ͢ΔͷͰՄಡੑ্͕Δ ͖ͬ͞ͷ ͜ͷ෦ΛίϯϙʔωϯτԽ
demo͠·͢
Vue.jsͰ࡞ͬͨToDoΞϓϦͷίϯϙʔωϯτ https://github.com/nemuzuka/nds51 5P%P*UFN 5P%P-JTU 5P%P&EJU%JBMPH "QQ "QQ 5P%P&EJU%JBMPH 5P%P-JTU 5P%P*UFN
ίϯϙʔωϯτͷؔ
ίϯϙʔωϯτͷϧʔϧ • ࣗͷ(্Ґ) / ࢠ(ԼҐ)ίϯϙʔωϯτͷΈҙࣝ͢Δ(1֊͚ͩ) • ࢠίϯϙʔωϯτʹσʔλΛ͍ͨ͠ʂ(ҰཡͷσʔλΛ͍ͨ͠) • ɿࢠίϯϙʔωϯτ্Ͱv-bindͰ͢(:todos=“filteredTodos") •
ࢠɿ͔ΒpropsͰड͚औΔ͜ͱΛఆٛ͢Δ(props: [“todos"]) • ίϯϙʔωϯτʹΠϕϯτ௨͍ͨ͠(ߦΛclick͞Εͨ࣌ʹμΠΞϩάΛOpen͢ΔΠϕϯτΛʹ͍͛ͨ) • ࢠɿʹ͚ͯ$emitͰΠϕϯτΛૹ৴͢Δ(this.$emit(‘OpenModalDialog', …ύϥϝʔλ)) • ɿࢠίϯϙʔωϯτ্ͰΠϕϯτ͕ૹ৴͞Εͨ࣌ͷॲཧΛఆٛ͢Δ(@OpenModalDialog=“openModalDialog") • ࢠίϯϙʔωϯτͷॲཧΛݺͼ͍ͨ(μΠΞϩάΛOpen͍ͨ͠) • ɿࢠίϯϙʔωϯτʹrefࣝผࢠΛఆٛ͢Δ(ref="modalDialog") • ݺͼग़࣌͢ɺ$refs.”ࣝผࢠ”.ϝιου(this.$refs.modalDialog.openDialog)
ਤʹ͢Δͱ͜Μͳײ͡ ίϯϙʔωϯτ ࢠίϯϙʔωϯτ [σʔλΛ͍ͨ͠] v-bind (:xxx) props [Πϕϯτ௨͍ͨ͠] $emit v-on
(@xxx) ࢠ [ॲཧΛݺͼ͍ͨ] ref
ίϯϙʔωϯτͷԿ͕ྑ͍ͷʁ • ίϯϙʔωϯτͷin/out͕ཧղ͘͢͠ͳΔ • ༻͢Δࢠίϯϙʔωϯτ • components • ίϯϙʔωϯτ͔ΒདྷΔσʔλ •
props • ෦σʔλ / ॲཧ • data / methods / computed • ʹ௨͢ΔΠϕϯτ • $emitͷՕॴ • ࣗίϯϙʔωϯτͷΠϕϯτ(@click) / ࢠίϯϙʔωϯτ͔Β௨͞ΕΔΠϕϯτ • template্ʹهࡌ ίϯϙʔωϯτͷΈʹ͔ͬΔ͜ͱͰ ෦ॲཧͷݟ௨͕͠jQuery + Hogan.jsͷ࣌ʹൺͯ ֨ஈʹྑ͘ͳΔʂʂ
ίϯϙʔωϯτԽɺ࠷ߴ
εάʹ࢝Ί·͠ΐ͏ʂ
ίϯϙʔωϯτͷొ • άϩʔόϧͳొ • Vue.component • ϩʔΧϧͳొ • VueΠϯελϯεͷcomponentsʹొ
vue-cli Λ͍·͠ΐ͏
<template> <tr @click.stop="openModalDialog"> <td>{{index + 1}}</td> <td class="text-left">{{todo.context}}</td> <td>{{todo.lastUpdateDate}}</td> <td>
<button type="button" class="btn btn-danger b <i class="glyphicon glyphicon-remove"></i> </button> </td> </tr> </template> <script> export default { name: 'todo-item', props: ["todo", "index"], methods: { openModalDialog(e) { const self = this; self.$emit('OpenModalDialog', e, self.todo); }, deleteItem(e) { const self = this; self.$emit('DeleteItem', e, self.todo); } } } </script> <style scoped> tr { cursor: pointer; } </style> vue-cliΛ͏ͱͲ͏ͳΔͷʁ • ίϯϙʔωϯτຖʹvueϑΝΠϧΛ1ͭ࡞(࠷ऴతʹjsʹͳΔ) • template(HTML) • Pug͑Δ༷ • script(js) • templateʹ͢dataɺmethodsΛఆٛ • style • cssɻ͜ͷίϯϙʔωϯτʹ͚ͩͯΔɺͱ͍͏ఆٛՄೳ ίϯϙʔωϯτΛ1ͭͷvueϑΝΠϧͰ݁͢ΔΑ͏ʹॻ͚ͯɺόονϦʂ(୯ҰϑΝΠϧίϯϙʔωϯτ) html/js/css ෳϑΝΠϧΛߦͬͨΓདྷͨΓ͠ͳͯ͘ྑ͍ʂൃࢄ͕ͪ͠ͳը໘։ൃʹடংΛʂʂʂ
ͨͩ͠ɺnode.js͍·͢
ͪΐͬͱͰڵຯ͕ग़͖ͯͨਓɺ https://github.com/nemuzuka/nds51
·ͱΊ • Vue.jsΛ͏ͱDOMʹσʔλΛ࣋ͨͤΔඞཁ͕ݮΓ·͢ • ԾDOM / ํσʔλόΠϯσΟϯάͷ͋Γ͕ͨ͞ • ͏ࣗલͰΠϕϯτरͬͯDOMॻ͖͑ͳΜͯͨ͘͠ͳ͍ʂʂ •
DOMૢ࡞༻ͷidclassࢦఆ͕େ෯ʹݮͬͨɻΧελϜσʔλଐੑΘͳ͘ͳͬͨ • ίϯϙʔωϯτԽͰॲཧͷσʔλͷείʔϓ͕ߜΕΔΑ͏ʹͳͬͨ • vue-cliͷߟ͑ํʹܹ͘͠ڞײ • 1ίϯϙʔωϯτ = 1vueϑΝΠϧͷ͕ؔγϯϓϧͰΠΠ • ʮ͜ͷϑΝΠϧݟ͓͚ͯେମ͑Δײ͡ʯ͕࠷ߴʹ͋Γ͕͍ͨɻϑΝΠϧҠಈ͢Δͱ಄ͷΓସ͕͑… • jsͰhtml(template)ॻ͖ͨ͘ͳ͍ΜͰ͢Α… • ͍ͭͰʹϒϥβjsΛES6Ͱॻ͚ΔΑ͏ʹͳΓ·͢ • πϥΠͷڥ࡞Δ(ཧղ͢Δ)·Ͱ • ʮ1ճ࡞ͬͯऴΘΓʯ͡Όͳ͍ΞϓϦͳΒɺVue.jsྑ͍ͱࢥ͍·͢ʂ
ͪͳΈʹɺ2016 ळ࣌ͷࢲͷεϖοΫ • jQueryͬͯΔɺͬͯΔ • Javascriptৄ͘͠Βͳ͍ • ES5/ES6ͷษڧαϘͬͯͨ • node.jsͷଘࡏ͍ͬͯΔ͕Πϯετʔϧͨ͜͠ͱͳ͍
• jsϑΝΠϧscriptλάͰ֎෦͔Β࣋ͬͯ͘Δํ͔ࣜͬͨ͜͠ͱͳ͍ • Reactͱ͔Angularͱ͔ͷଘࡏ͍ͬͯΔ͕νϡʔτϦΞϧͬͯͳ͍
ͦΕ͕3ϲ݄͘Β͍Ͱ… 1. npm / webpack 2. vue-cli 3. ES6Ͱॻ͍ͯBabelͰϏϧυ ͢Δ·ͰʹͳΓ·ͨ͠ʂʋ(˜ʆ)ϊ
※جຊతʹνϡʔτϦΞϧͰԿͱ͔ͳͬͨͷͰ Vue.jsࣗମͷֶशίετ͍ͱࢥ͍·͢ [͓ੈʹͳΓ·ͨ͠] OQNͱXFCQBDLͰϏϧυK2VFSZ͔Βͷ࣍ͷεςοϓ
Ͱɺ1ͭΞϓϦΛ࡞ͬͯΈͨɻ
VSS Kanban • αʔόαΠυ : Scala(Skinny Framework) • ΫϥΠΞϯταΠυ :
Vue.js ScalaVue.jsΛֶͿͨΊͷͱ͔͔ͬΓʹͯ͠Β͑Δͱخ͍͠σε https://github.com/nemuzuka/vss-kanban