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
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
50
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
変更し続けられるシステムをどう保つか — AI時代のSSoTという設計原則
kawauso
1
1.2k
データエンジニアリングとドメイン駆動設計
masuda220
PRO
14
2.6k
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
670
壊して学ぶAWS CDK: そのcdk deployで消えるもの、残るもの
k_adachi_01
1
490
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
0
160
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
220
文字起こし基盤の信頼性
abnoumaru
0
130
”AIを使う” から ”AIに任せる” へ ─ 開発プロセスを再設計してAIを組織標準にするまで
cyberagentdevelopers
PRO
2
140
AI時代におけるテストの基礎の再定義 / Rethinking the Fundamentals of Testing in the AI Era
mineo_matsuya
14
5.3k
なぜ、あなたのエージェントは言うことを聞かないのか
segavvy
1
420
発表と総括 / Presentations and Summary
ks91
PRO
0
200
【公開用】AI_Dev_Ex2026_AI_登壇資料
matsuritechnologies
PRO
2
560
Featured
See All Featured
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Why Our Code Smells
bkeepers
PRO
340
58k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Navigating Weather and Climate Data
rabernat
0
400
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
380
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
360
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
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