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でコンポーネント入門!ハンズオン勉強会
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
naokie
July 05, 2016
Technology
320
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Vue.jsでコンポーネント入門!ハンズオン勉強会
https://itstaffing.connpass.com/event/34159/
Vue.jsでコンポーネント入門!ハンズオン勉強会
naokie
July 05, 2016
More Decks by naokie
See All by naokie
あと3年フロントエンドでやる力
naokie
1
1.2k
Other Decks in Technology
See All in Technology
Coil3を内部実装から読み解く~キャッシュ戦略とAVIF画像の描画〜/nikkei-tech-talk50
nikkei_engineer_recruiting
0
170
Argo CDとAtlantisで実現するインフラ管理のセルフサービス化──小規模SREチームで支えるプラットフォーム
cassius7
0
250
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
480
20260929_AmazonGuardDutyの検出通知メールにAWS DevOpsAgentの調査結果を追加する
yhana
1
380
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
5
1.8k
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
230
spanner-autoscalerに学ぶ CRD設計パターン 〜自動化と緊急時対応を両立する Kubernetesコントローラーの作り方〜
tkuchiki
0
210
Harness Engineering on Rails
joelq
0
760
HolmesGPTで始めるSREエージェント入門!プラットフォームの障害調査はAIにお任せ 〜
leveragestech
PRO
0
120
AIに書かせて、プラットフォームで縛る ― EKSプラットフォームで実践した責任境界と権限設計
elmodev09
1
1.1k
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
240
Lambda MicroVMsは常駐サーバーの代わりに なるか? Kiro Crew を動かして検証してみた / Kiro Crew on Lambda MicroVMs
k_adachi_01
2
340
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
540
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Chasing Engaging Ingredients in Design
codingconduct
0
340
My Coaching Mixtape
mlcsv
0
330
YesSQL, Process and Tooling at Scale
rocio
174
15k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
780
Why Our Code Smells
bkeepers
PRO
340
58k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Transcript
Vue.jsͰίϯϙʔωϯτೖʂϋϯ ζΦϯษڧձ 2016/07/05(Tue) @DeNA
Web Components ͱʁ
Web ͷ࠶ར༻Մೳͳύʔπ࡞ͷ༷
࠶ར༻ՄೳͳύʔπΛߟ͑Δ্ͰͷΈ • HTML, CSS, JavaScript 3ͭͷઐ༻ݴޠͰߏɻ • HTML ͷෳࡶͳೖΕࢠߏ •
CSS ͷҙਤ͠ͳ͍ద༻ൣғ • JavaScript ͷDOMߏͷґଘ
ߏ͢ΔϦιʔε 1. Custom Elements Ϣʔβʔ͕ಠࣗͷΧελϜཁૉΛఆٛ 2. HTML Imports அยԽͨ͠HTMLϑΝΠϧΛϩʔυ 3.
HTML Template ϒϥβωΠςΟϒͳςϯϓϨʔτػೳ 4. Shadow DOM HTMLʹείʔϓΛܗ
ར༻ͷϝϦοτ • ϚʔΫΞοϓ͕εοΩϦ • ελΠϧͷద༻ൣғΛߜΓࠐΉ • ෳࡶͳߏΛ֎෦͔Βݟ͑ͳ͘͢Δ
ϒϥβͷରԠঢ়گ1
ϒϥβͷରԠঢ়گ2 • Google ओಋͰϒϥβϕϯμͷฒΈόϥόϥ • Polyfill Ͱ࣮࣮͕ͱͯগͳ͍ • Polymer, X-Tag
ͳͲͷϥΠϒϥϦͰ… • ։ൃ͔Β4ͰͦΖͦΖʁ • Vue.js ͳΒ…
Vue.js ͱ Web Components
Vue.js ͷ2ͭͷॏཁͳίϯηϓτ • ϦΞΫςΟϒσʔλόΠϯσΟϯά • ίϯϙʔωϯτγεςϜ
Vue.js ͷίϯϙʔωϯτγεςϜ Custom Elements ͷ༷ʹԊͬͨߏจΛ࣮
ྫ͑… • slot ཁૉ h(ps:/ /www.w3.org/TR/shadow-dom/#slots • is ଐੑ h(ps:/
/www.w3.org/TR/custom-elements/#a(r-is
େنΞϓϦέʔγϣϯྫ1
େنΞϓϦέʔγϣϯྫ2 <div id="app"> <app-nav></app-nav> <app-view> <app-sidebar></app-sidebar> <app-content></app-content> </app-view> </div>
ίϯϙʔωϯτͷ࡞ΛͬͯΈΑ͏
Codepen Ͱ࡞͍͖ͯ͠·͢ɻ ҎԼͷ Pen Λ Fork ͯ͠͡Ί͍ͯͩ͘͞ɻ hands-on-vuejs-vol2-0 - h0p:/
/codepen.io/naokie/pen/rLwLyd
్தܦաΛؒҧͬͯফͯ͠͠·Θͳ͍Α͏ʹɺ Fork ͢Δͱ͖ʹ Loginɺ·ͨ Save as Anonymous ͠·͢ɻ
Vol.1 Ռ
Vol.1 ςϯϓϨʔτ <div id="my-app"> <!-- ৽نλεΫͷՃ --> <p> NewTask: <input
type="text" v-model="newTask" /> <button v-on:click="addTodo">Add</button> </p> <hr /> <!-- λεΫͷϦετදࣔ --> <ul> <li v-for="todo in todos"> <input type="checkbox" v-model="todo.isCompleted" /> <span v-bind:class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span> <button v-on:click="deleteTodo(todo)">Delete</button> </li> </ul> <!-- ΓλεΫͷΧϯτදࣔ --> <p>Remaining Tasks: {{ remains }}/{{ todos.length }}</p> </div>
Vol.1 Vue Πϯελϯε var vm = new Vue({ el: '#my-app',
// Ϛϯτ͢Δཁૉ data: { // ϓϩΩγ͢Δͯ͢ͷϓϩύςΟ newTask: '', todos: [ { task: 'ڇೕΛങ͏', isCompleted: false }, { task: 'ϓϩςΠϯΛങ͏', isCompleted: true }, { task: 'εϙʔπυϦϯΫΛങ͏', isCompleted: false } ] }, computed: { // ࢉग़ϓϩύςΟ remains: function() { var inCompleteList = this.todos.filter(function(task) { return !task.isCompleted; }); return inCompleteList.length; } }, methods: { // Πϯελϯεϝιου addTodo: function() { if (this.newTask == '') return; this.todos.push( { task: this.newTask, isCompleted: false } ); this.newTask = ''; }, deleteTodo: function(todo) { this.todos.$remove(todo); } } });
࠶ར༻Մೳͳ୯Ґʁ 1. ಉ͡ϖʔδͰ܁Γฦ͠දࣔ͢ΔʢϦετදࣔʣ 2. αΠτͰ܁Γฦ͠ར༻͢ΔʢΟδΣοτදࣔʣ
ࠓճ࡞͢Δίϯϙʔωϯτ • Todo ίϯϙʔωϯτͷ࡞ • App ίϯϙʔωϯτͷ࡞
Todo ίϯϙʔωϯτ λεΫ1ͭΛߏ͍ͯ͠ΔύʔπΛίϯϙʔωϯτԽ
HTML Template ΛΓग़͠ <script type="text/template" id="t_todo"> <li> <input type="checkbox" v-model="todo.isCompleted"
/> <span v-bind:class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span> <button v-on:click="deleteTodo(todo)">Delete</button> </li> </script>
Γग़ͨ͠ՕॴΛΧελϜཁૉͰஔ͖͑ <ul> <todo v-for="todo in todos" :todo="todo"></todo> </ul>
είʔϓ • ίϯϙʔωϯτΠϯελϯε֤ࣗʹείʔϓΛ͍࣋ͬͯΔ • ࢠίϯϙʔωϯτσʔλΛࢀরͰ͖ͳ͍
Props σʔλΛࢠίϯϙʔωϯτʹୡ͢ΔΦϓγϣϯ • 2ͭͷम০ࢠ • .sync: two-way όΠϯσΟϯά • .once:
one--me όΠϯσΟϯά • ݕূཁ݅ΛઃఆՄೳ
ίϯϙʔωϯτͷ࡞ var Todo = Vue.extend({ template: '#t_todo', props: { 'todo':
{ required: true } } });
ίϯϙʔωϯτΛొ var vm = new Vue({ ... components: { Todo:
Todo } });
ಈ࡞ͷ֬ೝ • νΣοΫϚʔΫͷ͚֎͠ • ৽نλεΫͷొ • λεΫͷআ • ΓλεΫͷΧϯτදࣔ
λεΫͷআ <button v-on:click="deleteTodo(todo)">Delete</button>
σʔλૢ࡞ͷͱΠϕϯτ • ࡞ͨ͠ Todo ίϯϙʔωϯτͷϝιουͰͳ͍ • λεΫϦετίϯϙʔωϯτ͕อ͍࣋ͯ͠Δ • λεΫϦετͷૢ࡞ίϯϙʔωϯτͷ •
ࢠίϯϙʔωϯτΠϕϯτͷΈ௨ • ࢠؒͰͷΠϕϯτཧ͕ඞཁʹ
ΧελϜΠϕϯτ ίϯϙʔωϯτؒͷΠϕϯτ௨৴ͷΈ • $on() Λ༻ͯ͠ΠϕϯτΛϦοεϯ͠·͢ • $emit() Λ༻ͯࣗ͠ͷΠϕϯτΛτϦΨʔ͠·͢ • $dispatch()
Λ༻ͯ͠ํʹΠϕϯτΛૹग़͠·͢ • $broadcast() Λ༻ͯ͠ࢠଙํʹΠϕϯτΛग़͠·͢
Todo ίϯϙʔωϯτ͔ΒΠϕϯτΛૹग़ var Todo = Vue.extend({ ... methods: { deleteTodo:
function(todo) { this.$dispatch('delete', todo); } } });
ͰΠϕϯτΛϦοεϯ var vm = new Vue({ ... events: { 'delete':
function(todo) { this.todos.$remove(todo); } } });
͜͜·ͰͷՌ hands-on-vuejs-vol2-1 - h0p:/ /codepen.io/naokie/pen/qNjNAw
App ίϯϙʔωϯτ খ͞ͳΞϓϦʢΟδΣοτʣΛίϯϙʔωϯτԽ
HTML Template ΛΓग़͠ <script type="text/template" id="t_app"> <!-- divཁૉͰғΉ --> <div>
<p> NewTask: <input type="text" v-model="newTask" /> <button v-on:click="addTodo">Add</button> </p> <hr /> <ul> <todo v-for="todo in todos" :todo="todo"></todo> </ul> <p>Remaining Tasks: {{ remains }}/{{ todos.length }}</p> </div> </script>
ϑϥάϝϯτΠϯελϯε • ςϯϓϨʔτͷίϯςϯπɺΧελϜཁૉΛஔ͖͑Δ • ςϯϓϨʔτ୯ҰͷϧʔτཁૉΛ࣋ͭͷ͕ਪ
Γग़ͨ͠ՕॴΛΧελϜཁૉͰஔ͖͑ <app :todos="todos"></app>
ίϯϙʔωϯτͷ࡞ var App = Vue.extend({ template: '#t_app', props: { 'todos':
{ required: true } }, ... components: { Todo: Todo } });
ίϯϙʔωϯτΛొ var vm = new Vue({ ... components: { App:
App } });
ಈ࡞ͷ֬ೝ • νΣοΫϚʔΫͷ͚֎͠ • ৽نλεΫͷొ • λεΫͷআ • ΓλεΫͷΧϯτදࣔ
৽نλεΫͷొ <button v-on:click="addTodo">Add</button>
App ίϯϙʔωϯτ͔ΒΠϕϯτΛૹग़ var App = Vue.extend({ // ίϯϙʔωϯτఆٛͰॳظσʔλΦϒδΣΫτΛฦؔ͢ͱͯ͠એݴ͢Δ data: function()
{ return { newTask: '', }; }, ... methods: { addTodo: function() { if (this.newTask == '') return; this.$dispatch('add', this.newTask); this.newTask = ''; } } });
ͰΠϕϯτΛϦοεϯ var vm = new Vue({ ... events: { ...
'add': function(newTask) { this.todos.push( { task: newTask, isCompleted: false } ); } } });
ΓλεΫͷΧϯτදࣔ var App = Vue.extend({ ... computed: { remains: function()
{ var inCompleteList = this.todos.filter(function(task) { return !task.isCompleted; }); return inCompleteList.length; } }, ... });
࠶ར༻Մೳͳύʔπͷ <div id="my-app"> <app :todos="todos"></app> <app :todos="todos"></app> <app :todos="todos"></app> </div>
͜͜·ͰͷՌ hands-on-vuejs-vol2-2 - h/p:/ /codepen.io/naokie/pen/oLwLAj
One more thing...
App ίϯϙʔωϯτ͝ͱʹݟग़͠ΛՃ
εϩοτ • ίϯϙʔωϯτ༻ऀ͕ίϯςϯπΛՃ͢ΔΈ • είʔϓͰίϯϙʔωϯτʹίϯςϯπΛՃ • ໊લ͖ͭεϩοτͰෳ࣋ͭ͜ͱՄೳ
ςϯϓϨʔτʹ slot ཁૉΛՃ <script type="text/template" id="t_app"> <div> <slot></slot> ... </div>
</script>
App ίϯϙʔωϯτ༻ՕॴͰݟग़͠ΛՃ <div id="my-app"> <app :todos="todos"> <h1>ϝΠϯ</h1> </app> <app :todos="todos">
<h1>αϒ</h1> </app> <app :todos="todos"></app> </div>
͜͜·ͰͷՌ hands-on-vuejs-vol2-3 - h0p:/ /codepen.io/naokie/pen/NAgRWY
ͬͯΈΑ͏ NewTask ίϯϙʔωϯτ
ςϯϓϨʔτ <script type="text/template" id="t_newtask"> <p> NewTask: <input type="text" v-model="newTask" />
<button v-on:click="addTodo">Add</button> </p> </script>
ίϯϙʔωϯτԽ var NewTask = Vue.extend({ template: '#t_newtask', data: function() {
return { newTask: '', }; }, methods: { addTodo: function() { if (this.newTask == '') return; this.$dispatch('add', this.newTask) this.newTask = ''; } } });
ίϯϙʔωϯτͷొ var App = Vue.extend({ ... components: { Todo: Todo,
NewTask: NewTask } });
͜͜·ͰͷՌ hands-on-vuejs-vol2-4 - h0p:/ /codepen.io/naokie/pen/BzkLyJ
ࠓճͷ͓Έ͛ GitHub - h*ps:/ /github.com/naokie/hands-on-vuejs-vol2 Codepen - h*p:/ /codepen.io/collec1on/DoLeNM/