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
54
AWS を使ったシステムのテスト方針 #jawsug #jawsug_niigataken #nds60
nemuzuka
2
3.1k
フリーランスで割と長くリモートでやってる僕が気をつけていること
nemuzuka
1
13k
わたしがみんなにオススメするBetter JavaとしてのScala
nemuzuka
1
890
ScalaでもDBのテストをしよう
nemuzuka
0
390
Other Decks in Technology
See All in Technology
関東Kaggler会発表資料
takoi
1
270
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
390
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
120
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
0
330
コーチングの奥義 何もしないテクニック
jinwatanabe
0
140
LanceDB入門
mocobeta
9
640
20分でわかるセキュアAPI
nwiizo
2
320
DDDのエッセンスを取り入れたAIでの開発
ak2ie
0
170
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
220
AIにブラウザを触らせて、E2EテストをPlaywrightで書く
koji_kawamura
0
200
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9.3k
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
620
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Optimizing for Happiness
mojombo
378
71k
The Limits of Empathy - UXLibs8
cassininazir
1
610
What's in a price? How to price your products and services
michaelherold
247
13k
Accessibility Awareness
sabderemane
1
180
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
We Have a Design System, Now What?
morganepeng
55
8.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
950
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
500
The browser strikes back
jonoalderson
0
1.5k
HDC tutorial
michielstock
2
800
sira's awesome portfolio website redesign presentation
elsirapls
0
330
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