Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Vue.jsから始めるDOMにデータを持たせないアプリケーション開発への第1歩
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
45
AWS を使ったシステムのテスト方針 #jawsug #jawsug_niigataken #nds60
nemuzuka
2
3.1k
フリーランスで割と長くリモートでやってる僕が気をつけていること
nemuzuka
1
13k
わたしがみんなにオススメするBetter JavaとしてのScala
nemuzuka
1
880
ScalaでもDBのテストをしよう
nemuzuka
0
380
Other Decks in Technology
See All in Technology
人を動かすのは時間ではなく、納得感 〜新任EMが入社3ヶ月、組織を2回変えた話〜
kakehashi
PRO
3
220
CIで使うClaude
iwatatomoya
0
260
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
8
3.7k
最適な自走を最小限の支援で — M&Aで拡大する組織で少人数SREが挑んだ1年 / SRE NEXT 2026
genda
0
1.2k
Empower GenAI with Agile - あなたのアジャイルが生成AIのバフになる仕組み
hageyahhoo
1
180
しくみを学んで使いこなそう GitHub Copilot app
torumakabe
2
250
LLMやAIエージェントをソフトウェアに組み込むプラクティス
shibuiwilliam
1
370
しぶいSRE: サーバから見えない障害にどう向き合うか。ラストワンマイルのデバッグ実践 / Shibui SRE
kanny
13
6.2k
AICoEでAIネイティブ組織への進化
yukiogawa
0
170
ヘルスケア領域における AI 活用と その安全性担保のための取り組み (Leveraging AI in Healthcare and Our Efforts to Ensure Its Safety) - Google I/O Extended Tokyo 2026, July 11, 2026
zettaittenani
0
370
ポストモーテム! DDoSからサイトは守れた。 でもビジネスは守れなかった。
bengo4com
1
3k
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
230
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
340
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
Discover your Explorer Soul
emna__ayadi
2
1.2k
Prompt Engineering for Job Search
mfonobong
0
370
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
330
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
BBQ
matthewcrist
89
10k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
890
Navigating Team Friction
lara
192
16k
Facilitating Awesome Meetings
lara
57
7k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
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